2015-07-21 14 views
50

ich ein Stück Code haben, die viele Warnungen (veraltet API)Wie eine Warnung in Schweigen schnellen

Mit Klappern erzeugt * I

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

tun könnte Dies gilt jedoch nicht in schnellen Arbeit .

Wie geht es in swift?

Hinweis: Ich möchte weder die Warnung global noch die Dateibreite deaktivieren, sondern nur eine bestimmte Warnung in einem bestimmten Teil meines Quellcodes deaktivieren.

Edit: Ich sehe aus wie meine Notiz war nicht klar genug: Ich will keine bedingte Kompilierung (was ist die vorgeschlagene Antwort der vermeintlichen Duplikat). Ich möchte nur eine Warnung OHNE Verwendung der neuen APIs zum Schweigen bringen.

+0

mögliches Duplikat von [Schnelle Alternative für #pragma clang diagnostic] (http: // stackoverflow.com/questions/28357297/swift-alternative-für-pragma-clang-diagnostic) – robertvojta

+3

Dies ist kein Duplikat. Die andere Frage löst dieses Problem nicht. –

+0

@ ClausJørgensen in welcher Weise es dieses Problem nicht beantwortet? Es gibt keinen anderen Weg, wie in den Antworten in der verknüpften Frage angegeben. Nur bedingte Kompilierung oder neues '# available' Makro, in dem Entwickler neue Methoden verwenden und auf die alten ausweichen sollten, wenn neue nicht verfügbar sind. – robertvojta

Antwort

84

Ab 2017 Xcode 9.0 ist der Konsens, dass es keine Möglichkeit gibt, das zu erreichen.

Ich werde diese Antwort aktualisieren/bearbeiten, wenn Apple die Funktion hinzufügen.

In die Wunschliste für die WWDC 2018 eintragen!

+10

Verdammt, das ist ein Mist. Es kommt manchmal [http://i.imgur.com/bnpnsf5.png] heraus. Es ist nervig, um es gelinde auszudrücken. – Isuru

+2

Ich möchte diese Antwort eine Million Mal abstimmen, aber sie beantwortet die Frage ziemlich gut, also +1 :-) – deadbeef

+2

@Isuru An diesem Punkt würde ich genervt genug werden, um das Ganze wieder aufzubauen. Erraten Sie die Warnungen funktioniert – Sirens

28

Eigentlich können Sie unterdrücken diese Warnungen mit @available in der umschließenden logischen Struktur (d. H. Funktion/Typ).

Zum Beispiel, sagen Sie einen Code haben, der den Addressbook-Framework verwendet, aber Sie bauen gegen iOS 9.

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

Ab Xcode 7.0.1 dies wird die Inline-Warnungen werden angezeigt verhindern.

+2

Ja, aber Sie werden die gleiche Warnung sehen, wenn Sie Ihre Adresse addressBookStatus() '... aufrufen, die Sie als veraltet markieren. –

+1

Profi-Tipp: Wenn Sie es für eine ganze Klasse zum Schweigen bringen wollen, knallen Sie diesen Welpen einfach über Ihre Klassenaussage (zB: class ViewController: UIViewController) – Sirens

+2

@Sirens Dann sehen Sie diese Warnung jedes Mal, wenn Sie diese Klasse aufrufen ️ (mindestens mit Xcode 8) –

7

In Swift gibt es kein allgemeines Konstrukt zum Deaktivieren der Verwarnungswarnungen, aber es gibt eine Problemumgehung, die in vielen Fällen angewendet werden kann.

Nehmen wir an, Sie haben eine Methode getLatestImage() auf Klasse Foo, die veraltete Methoden/Klassen verwendet.

Verwenden @available als Daniel Thorpe alle Warnungen innerhalb des Verfahrens zum Schweigen beschrieben:

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

Jetzt möchten Sie Aufruf die Methode getLatestImage() ohne eine deprecation Warnung mit. Sie können das erreichen, indem zunächst ein Protokoll und eine Erweiterung der Definition:

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

Und dann ohne deprecation Warnung rufen Sie die Methode (wenn foo ist eine Instanz Foo):

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

Das Ergebnis ist, dass Sie Swift-Code, der veraltete API ohne Verwarnungswarnungen verwendet

+0

So schlau. Irgendwie böse? :) Aber so gut. Ideal für einen Anwendungsfall wie das Unterdrücken von Warnungen über die fortlaufende Verwendung einiger Aspekte des AddressBook-Frameworks, die veraltet sind, aber ein Ersetzen nicht alle erforderlichen Funktionen tatsächlich bereitstellt. Vielen Dank. –

+0

@DuncanBabbage Froh, dass Sie die Problemumgehung mögen! –