Comment désapprouver manuellement les membres

168

Contrairement à Objective-C, Swift n'a pas de préprocesseur, alors existe-t-il toujours un moyen de déprécier manuellement les membres d'une classe?

Je recherche quelque chose de similaire à ceci:

-(id)method __deprecated;
Atomix
la source

Réponses:

266

Vous pouvez utiliser la balise Disponible, par exemple:

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

Où * est la plate-forme (iOS, iOSApplicationExtension, macOS, watchOS, tvOS, * pour tous, etc.).

Vous pouvez également spécifier la version de la plate - forme à partir de laquelle il était introduced, deprecated, obsoleted, renamed, et 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 votre projet cible plusieurs plates-formes, vous pouvez utiliser plusieurs balises comme ceci:

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

Plus de détails dans la documentation Swift .

Axel Guilmin
la source
Dans Swift 3, les =s sont remplacés par :s.
Sam Soffes
2
*, deprecated: 10.0va le déprécier pour iOS 10, tvOS 10etc., je suppose que nous ne devrions pas combiner *avec un numéro de version? Des idées pour mieux faire?
fabb
@fabb C'est la version de l'application, pas iOS
Axel Guilmin
1
Ce n'est pas vrai. À partir des documents que vous avez liés: "version de la plate-forme spécifiée"
fabb
1
Exactement, pour revenir à mon point d'origine: c'est @available(*, deprecated: 10.0)donc une très mauvaise idée si le code ne fonctionnait pas seulement sur iOS
fabb
70

À partir de Swift 3 et Swift 4 , le numéro de version est facultatif. Vous pouvez maintenant simplement taper:

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

Ou si vous voulez qu'un message l'accompagne:

@available(*, deprecated, message: "no longer available ...")
func foo() {
    // ...
}
Yuchen Zhong
la source
1
Pour Swift 2.3, le numéro de version est également facultatif.
DawnSong
3
Pour Swift 2.3, la syntaxe semble être celle de l' @available(*, deprecated, message = "no longer available ...")inclusion d'un message.
Daniel Zhang
@Daniel, c'est bizarre qu'Apple en change une partie et non le reste et l'appelle 2.3. Signez, je mettrai à jour la réponse à nouveau, merci pour la note!
Yuchen Zhong
6

Vous pouvez l'utiliser pour corriger automatiquement vos entrées avec votre nouvelle fonction

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

func myNewFunc() {
   // ...
}

Au lieu de *, vous pouvez utiliser swift, pour le numéro de version swift.

Les fonctions obsolètes génèrent des avertissements mais peuvent toujours être appelées. (Avertissement)

Les fonctions obsolètes l'empêchent d'être entièrement appelée. (Erreur)

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

ou utilisez d'autres options comme iOS, macOS, watchOS, tvOS ...

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

Si deployment targetest 9.0et

1. <ObsoletedVersion>== 10.0-warning

entrez la description de l'image ici

2. <ObsoletedVersion>== 8.0-compile error

entrez la description de l'image ici

yoAlex5
la source
En cas d'option "obsolète", ne peut pas l'utiliser. Selon cela, l'option n'est pas implémentée. bugs.swift.org/browse/SR-8168
mkjwa