Jak ręcznie anulować członków

168

W przeciwieństwie do Objective-C, Swift nie ma preprocesora, więc czy nadal istnieje sposób na ręczne wycofanie członków klasy?

Szukam czegoś podobnego do tego:

-(id)method __deprecated;
Atomix
źródło

Odpowiedzi:

266

Możesz użyć tagu Dostępne, na przykład:

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

Gdzie * to platforma (iOS, iOSApplicationExtension, macOS, watchOS, tvOS, * dla wszystkich itd.).

Można również określić wersję platformy, z której było introduced, deprecated, obsoleted, renamedoraz 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
}

Jeśli Twój projekt jest przeznaczony dla wielu platform, możesz użyć kilku tagów, takich jak:

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

Więcej szczegółów w dokumentacji Swift .

Axel Guilmin
źródło
W Swift 3 =s są zastępowane przez :s.
Sam Soffes
2
*, deprecated: 10.0zastąpi go iOS 10, tvOS 10itp., myślę, że nie powinniśmy łączyć go *z numerem wersji? Jakieś pomysły, jak to zrobić lepiej?
fabb
@fabb To jest wersja aplikacji, a nie iOS
Axel Guilmin
1
To nie jest prawda. Z dokumentów, które
podłączyłeś
1
Dokładnie, wracając do mojego pierwotnego punktu: @available(*, deprecated: 10.0)dlatego jest to bardzo zły pomysł, gdyby kod działał nie tylko na iOS
fabb
70

Począwszy od Swift 3 i Swift 4 , numer wersji jest opcjonalny. Możesz teraz po prostu wpisać:

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

Lub jeśli chcesz, aby wiadomość była zgodna z tym:

@available(*, deprecated, message: "no longer available ...")
func foo() {
    // ...
}
Yuchen Zhong
źródło
1
W przypadku Swift 2.3 numer wersji również jest opcjonalny.
DawnSong
3
W przypadku Swift 2.3 składnia wydaje się następować @available(*, deprecated, message = "no longer available ...")przy dołączaniu wiadomości.
Daniel Zhang
@Daniel, to dziwne, że Apple zmienia część, a nie resztę, i nazywa to 2.3. Podpisz, ponownie zaktualizuję odpowiedź, dzięki za notatkę!
Yuchen Zhong
6

Możesz użyć tego, aby automatycznie naprawić swoje wpisy za pomocą nowej funkcji

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

func myNewFunc() {
   // ...
}

Zamiast * możesz użyć swift, aby uzyskać szybki numer wersji.

Przestarzałe funkcje generują ostrzeżenia, ale nadal można je wywołać. (Ostrzeżenie)

Przestarzałe funkcje uniemożliwiają jej całkowite wywołanie. (Błąd)

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

lub użyj innych opcji, takich jak iOS, macOS, watchOS, tvOS ...

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

Jeśli deployment targettak9.0 i

1. <ObsoletedVersion>== 10.0-warning

wprowadź opis obrazu tutaj

2. <ObsoletedVersion>== 8.0-compile error

wprowadź opis obrazu tutaj

yoAlex5
źródło
W przypadku "przestarzałej" opcji nie można jej używać. W związku z tym opcja nie jest realizowana. bugs.swift.org/browse/SR-8168
mkjwa