Cómo despreciar a los miembros manualmente

168

A diferencia de Objective-C, Swift no tiene preprocesador, entonces, ¿hay alguna manera de desaprobar manualmente a los miembros de una clase?

Estoy buscando algo similar a esto:

-(id)method __deprecated;
Atomix
fuente

Respuestas:

266

Puede usar la etiqueta Disponible, por ejemplo:

@available(*, deprecated)
func myFunc() { 
    // ...
}

Donde * es la plataforma (iOS, iOSApplicationExtension, macOS, watchOS, tvOS, * para todos, etc.).

También puede especificar la versión de la plataforma de la que era introduced, deprecated, obsoleted, renamed, y message:

@available(iOS, deprecated:6.0)
func myFunc() { 
    // calling this function is deprecated on iOS6+
}

Or

@available(iOS, deprecated: 6.0, obsoleted: 7.0, message: "Because !")
func myFunc() {
    // deprecated from iOS6, and obsoleted after iOS7, the message "Because !" is displayed in XCode warnings
}

Si su proyecto apunta a múltiples plataformas, puede usar varias etiquetas de esta manera:

@available(tvOS, deprecated:9.0.1)
@available(iOS, deprecated:9.1)
@available(macOS, unavailable, message: "Unavailable on macOS")
func myFunc() {
    // ...
}

Más detalles en la documentación de Swift .

Axel Guilmin
fuente
En Swift 3, los =s se reemplazan por :s.
Sam Soffes
2
*, deprecated: 10.0lo desaprobará iOS 10, tvOS 10etc., supongo que no deberíamos combinarlo *con un número de versión. ¿Alguna idea sobre cómo hacerlo mejor?
fabb
@fabb Es la versión de la aplicación, no iOS
Axel Guilmin
1
Eso no es verdad. De los documentos que vinculó: "versión de la plataforma especificada"
fabb
1
Exactamente, volviendo a mi punto original: @available(*, deprecated: 10.0)por lo tanto, es una muy mala idea si el código no solo se ejecuta en iOS
fabb
70

A partir de Swift 3 y Swift 4 , el número de versión es opcional. Ahora puede simplemente escribir:

@available(*, deprecated)
func foo() {
    // ...
}

O si desea un mensaje, hágalo:

@available(*, deprecated, message: "no longer available ...")
func foo() {
    // ...
}
Yuchen Zhong
fuente
1
Para Swift 2.3, el número de versión también es opcional.
DawnSong
3
Para Swift 2.3, la sintaxis parece ser @available(*, deprecated, message = "no longer available ...")cuando se incluye un mensaje.
Daniel Zhang el
@Daniel, es extraño que Apple cambie parte de él y no el resto y lo llame 2.3. Firme, actualizaré la respuesta nuevamente, ¡gracias por la nota!
Yuchen Zhong el
6

Puede usar esto para corregir automáticamente las entradas con su nueva función

@available(*, deprecated, renamed: "myNewFunc")
func myOldFunc() {
   // ...
}

func myNewFunc() {
   // ...
}

En lugar de * puede usar swift, para el número de Versión de swift.

Las funciones en desuso generan advertencias pero aún se pueden llamar. (Advertencia)

Las funciones obsoletas impiden que se llame por completo. (Error)

@available(swift, deprecated: 4.0, obsoleted: 4.2, message: "This will be removed in v4.2, please migrate to ...")

o use otras opciones como iOS, macOS, watchOS, tvOS ...

Skyborg
fuente
1
@available(iOS, deprecated:7.0, obsoleted: <ObsoletedVersion>, renamed: "myFuncNew", message: "Please use new method - myFuncNew()")
func myFuncOld() {
    //
}

Si deployment targetes 9.0y

1. <ObsoletedVersion>== 10.0-warning

ingrese la descripción de la imagen aquí

2. <ObsoletedVersion>== 8.0-compile error

ingrese la descripción de la imagen aquí

yoAlex5
fuente
En caso de opción "obsoleta", no se puede usar. De acuerdo con esto, la opción no está implementada. bugs.swift.org/browse/SR-8168
mkjwa