web-dev-qa-db-fra.com

Comment faire taire un avertissement dans swift

J'ai un morceau de code qui génère beaucoup d'avertissements (API obsolète)

Utiliser Clang * Je pourrais faire

#pragma clang diagnostic Push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    ...
#pragma clang diagnostic pop

Cependant, cela ne fonctionne pas dans Swift.

Comment le faire dans Swift?

Remarque: je ne souhaite pas désactiver l'avertissement globalement, ni même pour l'ensemble du fichier, mais simplement désactiver un avertissement spécifique dans une partie spécifique de mon code source.

Edit: J'ai l'impression que ma note n'était pas assez claire: je ne veux PAS de compilation conditionnelle (qui est la réponse proposée pour la copie supposée). Je veux juste faire taire un avertissement SANS utiliser les nouvelles API.

79
Antzi

À compter de 2018, Xcode 10.0, le consensus est qu'il n'y a aucun moyen d'y parvenir.

Je mettrai à jour/modifierai cette réponse si Apple ajoutera la fonctionnalité.

Mettez-le dans votre liste de souhaits pour WWDC 2019!

121
Antzi

En fait, vous pouvez supprimer ces avertissements en utilisant @available dans la structure logique englobante (c.-à-d. fonction/type).

Par exemple, supposons que vous ayez du code qui utilise le framework AddressBook, mais que vous construisez sur iOS 9.

@available(iOS, deprecated: 9.0)
func addressBookStatus() -> ABAuthorizationStatus {
    return ABAddressBookGetAuthorizationStatus()
}

À partir de Xcode 7.0.1, cela empêchera l'affichage des avertissements intégrés.

36
Daniel Thorpe

Il n'y a pas de construction générale pour faire taire les avertissements de dépréciation dans Swift, mais une solution de contournement peut être appliquée dans de nombreux cas.

Supposons que vous avez une méthode getLatestImage() sur la classe Foo qui utilise des méthodes/classes obsolètes.

Utilisez @available Comme Daniel Thorpe l'a décrit pour faire taire tous les avertissements à l'intérieur de la méthode:

@available(iOS, deprecated: 9.0)
func getLatestImage() -> UIImage? {
    ...
}

Maintenant, vous souhaitez appeler la méthode getLatestImage() sans avertissement de dépréciation. Vous pouvez y parvenir en définissant d'abord un protocole et une extension:

private protocol GetLatestImage {
    func getLatestImage() -> UIImage?
}
extension Foo: GetLatestImage {}

Et puis appelez la méthode sans avertissement de dépréciation (si foo est une instance de Foo):

(foo as GetLatestImage).getLatestImage() // no deprecation warning

Le résultat est que vous avez Swift) un code qui utilise une API déconseillée sans aucun avertissement relatif à la dépréciation.

32
Tammo Freese