2015-07-21 17 views
50

Ho un pezzo di codice che sta generando un sacco di avvertimenti (API deprecate)Come al silenzio un avvertimento in rapida

Uso clang * ho potuto fare

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

Tuttavia, questo non funziona in rapida .

Come fare in rapido?

Nota: non desidero disattivare l'avviso a livello globale e nemmeno il file, ma solo disabilitare un avviso specifico in una parte specifica del mio codice sorgente.

Modifica: Sembra che la mia nota non sia abbastanza chiara: NON voglio la compilazione condizionale (che è la risposta proposta del supposto duplicato). Voglio solo silenziare un avviso SENZA usare le nuove API.

+0

possibile duplicato di [Alternativa rapida per #pragma clang diagnostic] (http: // stackoverflow.it/questions/28357297/swift-alternative-for-pragma-clang-diagnostic) – robertvojta

+3

Questo non è un duplicato. L'altra domanda non riesce a rispondere a questo problema. –

+0

@ ClausJørgensen in che modo non riesce a rispondere a questo problema? Non c'è altro modo, come affermato nelle risposte nella domanda collegata. Solo una compilazione condizionale o una nuova macro '# disponibile' dove lo sviluppatore dovrebbe utilizzare nuovi metodi e fallback per quelli vecchi se nuovi non sono disponibili. – robertvojta

risposta

84

A partire dal 2017, Xcode 9.0, il consenso è che non è possibile ottenerlo.

Aggiornerò/modificherò questa risposta se Apple aggiungerà la funzione.

Inseriscilo nella lista dei desideri per WWDC 2018!

+10

Accidenti, è un peccato. Diventa fuori mano [a volte] (http://i.imgur.com/bnpnsf5.png). È fastidioso per non dire altro. – Isuru

+2

Voglio votare questa risposta un milione di volte, ma risponde abbastanza bene alla domanda quindi +1 :-) – deadbeef

+2

@Isuru A quel punto mi arrabbio abbastanza da ricostruire il tutto. Indovina gli avvisi funzionanti – Sirens

28

In realtà, è possibile sopprimere questi avvisi utilizzando @available nella struttura logica che racchiude (cioè funzione/tipo).

Per esempio, supponiamo di avere un po 'di codice che utilizza il framework AddressBook, ma si sta costruendo contro iOS 9.

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

Come di Xcode 7.0.1 questo impedirà gli avvertimenti in linea venga visualizzato.

+2

Sì, ma vedrai lo stesso avviso quando chiami il tuo 'addressBookStatus()' ... che contrassegni come deprecato. –

+1

Suggerimento: se vuoi silenziarlo per un'intera classe, basta sbattere questo cucciolo sopra l'istruzione della tua classe (es: 'classe ViewController: UIViewController') – Sirens

+2

@Sirens Quindi vedrai questo avviso ogni volta che chiami questa classe ☹ ️ (almeno con Xcode 8) –

7

Non esiste un costrutto generale per silenziare gli avvisi di ritiro in Swift, ma esiste una soluzione che può essere applicata in molti casi.

Supponiamo di avere un metodo getLatestImage() sulla classe Foo che utilizza metodi/classi obsoleti.

Usa @available come Daniel Thorpe descritto per mettere a tacere tutti gli avvertimenti all'interno il metodo:

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

Ora volete chiamata il metodo getLatestImage() senza avere un avviso di disapprovazione. È possibile ottenere che in primo luogo la definizione di un protocollo e un prolungamento:

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

E quindi chiamare il metodo senza un avvertimento deprecazione (se foo è un'istanza di Foo):

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

Il risultato si è avere il codice Swift che utilizza l'API deprecata senza alcun avviso di deprecazione.

+0

Così intelligente. Tipo di male? :) Ma così buono. Ottimo per un caso d'uso come la soppressione degli avvertimenti sull'uso continuo di alcuni aspetti del framework AddressBook che sono stati deprecati, ma avere una sostituzione in realtà non fornisce ancora tutte le funzionalità richieste. Grazie. –

+0

@DuncanBabbage Sono contento che ti piaccia la soluzione! –