Come deprecare manualmente i membri


168

A differenza di Objective-C, Swift non ha un preprocessore, quindi c'è ancora un modo per deprecare manualmente i membri di una classe?

Sto cercando qualcosa di simile a questo:

-(id)method __deprecated;

Risposte:


266

Puoi utilizzare il tag Disponibile, ad esempio:

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

Dove * è la piattaforma (iOS, iOSApplicationExtension, macOS, watchOS, tvOS, * per tutti, ecc.).

È inoltre possibile specificare la versione della piattaforma da cui era introduced, deprecated, obsoleted, renamed, e 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
}

Se il tuo progetto ha come target più piattaforme, puoi utilizzare diversi tag in questo modo:

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

Maggiori dettagli nella documentazione di Swift .


In Swift 3, le =s vengono sostituite con :s.
Sam Soffes,

2
*, deprecated: 10.0lo deprecherò per iOS 10, tvOS 10ecc., suppongo che non dovremmo combinare *con un numero di versione? Qualche idea su come farlo meglio?
Fabb,

@fabb È la versione dell'app, non iOS
Axel Guilmin,

1
Quello non è vero. Dai documenti che hai collegato: "versione della piattaforma specificata"
fabb

1
Esatto, tornando al mio punto originale: @available(*, deprecated: 10.0)quindi è una pessima idea se il codice non dovesse funzionare solo su iOS
fabb

70

A partire da Swift 3 e Swift 4 , il numero di versione è facoltativo. Ora puoi semplicemente digitare:

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

O se vuoi un messaggio, seguilo:

@available(*, deprecated, message: "no longer available ...")
func foo() {
    // ...
}

1
Per Swift 2.3, anche il numero di versione è facoltativo.
DawnSong,

3
Per Swift 2.3, la sintassi sembra essere @available(*, deprecated, message = "no longer available ...")quando si include un messaggio.
Daniel Zhang,

@Daniel, è strano che Apple cambi parte di esso e non il resto, chiamandolo 2.3. Firmi, aggiornerò di nuovo la risposta, grazie per la nota!
Yuchen Zhong,

6

Puoi usarlo per riparare automaticamente i tuoi accessi con la tua nuova funzione

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

func myNewFunc() {
   // ...
}

Invece di * puoi usare swift, per il numero di versione rapido.

Le funzioni obsolete generano avvisi ma possono comunque essere chiamate. (Avvertimento)

Le funzioni obsolete impediscono che venga chiamato interamente. (Errore)

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

o usa altre opzioni come iOS, macOS, watchOS, tvOS ...


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

Se deployment targetè 9.0e

1. <ObsoletedVersion>== 10.0-warning

inserisci qui la descrizione dell'immagine

2. <ObsoletedVersion>== 8.0-compile error

inserisci qui la descrizione dell'immagine


In caso di opzione "obsoleta", non è possibile utilizzarla. In base a ciò, l'opzione non è implementata. bugs.swift.org/browse/SR-8168
mkjwa
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.