So verwerfen Sie Mitglieder manuell


168

Im Gegensatz zu Objective-C verfügt Swift über keinen Präprozessor. Gibt es also noch eine Möglichkeit, Mitglieder einer Klasse manuell zu verwerfen?

Ich suche etwas Ähnliches:

-(id)method __deprecated;

Antworten:


266

Sie können das Tag Verfügbar beispielsweise verwenden:

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

Wobei * die Plattform ist (iOS, iOSApplicationExtension, macOS, watchOS, tvOS, * für alle usw.).

Sie können auch die Version der Plattform angeben , von dem es war introduced, deprecated, obsoleted, renamed, und 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
}

Wenn Ihr Projekt auf mehrere Plattformen abzielt, können Sie mehrere Tags wie folgt verwenden:

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

Weitere Details in der Swift-Dokumentation .


In Swift 3 werden die =s durch :s ersetzt.
— Sam Soffes

2
*, deprecated: 10.0wird deprecate es iOS 10, tvOS 10etc, ich denke , wir nicht kombinieren sollte *mit einer Versionsnummer? Irgendwelche Ideen, wie man es besser macht?
— Fabb

@fabb Es ist die Version der App, nicht iOS
— Axel Guilmin

1
Das ist nicht wahr. Aus den von Ihnen verlinkten Dokumenten: "Version der angegebenen Plattform"
— fabb

1
Genau, um auf meinen ursprünglichen Punkt zurückzukommen: @available(*, deprecated: 10.0)Daher ist es eine sehr schlechte Idee, wenn der Code nicht nur unter iOS ausgeführt wird
— fabb

70

Ab Swift 3 und Swift 4 ist die Versionsnummer optional. Sie können jetzt einfach Folgendes eingeben:

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

Oder wenn Sie eine Nachricht mitmachen möchten:

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

1
Für Swift 2.3 ist die Versionsnummer ebenfalls optional.
— DawnSong

3
Für Swift 2.3 scheint die Syntax @available(*, deprecated, message = "no longer available ...")beim Einfügen einer Nachricht zu sein.
— Daniel Zhang

@ Daniel, das ist seltsam, dass Apple einen Teil davon ändert und nicht den Rest und nennt es 2.3. Unterschreiben Sie, ich werde die Antwort erneut aktualisieren, danke für den Hinweis!
— Yuchen Zhong

6

Sie können dies verwenden, um Ihre Einträge mit Ihrer neuen Funktion automatisch zu korrigieren

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

func myNewFunc() {
   // ...
}

Anstelle von * können Sie für die schnelle Versionsnummer swift verwenden.

Veraltete Funktionen erzeugen Warnungen, können aber trotzdem aufgerufen werden. (Warnung)

Veraltete Funktionen verhindern, dass es vollständig aufgerufen wird. (Error)

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

oder verwenden Sie andere Optionen wie iOS, macOS, watchOS, tvOS ...


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

Wenn deployment targetist 9.0und

1. <ObsoletedVersion>== 10.0-warning

Geben Sie hier die Bildbeschreibung ein

2. <ObsoletedVersion>== 8.0-compile error

Geben Sie hier die Bildbeschreibung ein


Im Falle einer veralteten Option kann diese nicht verwendet werden. Demnach ist die Option nicht implementiert. bugs.swift.org/browse/SR-8168
— mkjwa
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.