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;
Atomix
quelle

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 .

Axel Guilmin
quelle
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() {
    // ...
}
Yuchen Zhong
quelle
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 ...

Skyborg
quelle
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

yoAlex5
quelle
Im Falle einer veralteten Option kann diese nicht verwendet werden. Demnach ist die Option nicht implementiert. bugs.swift.org/browse/SR-8168
mkjwa