Как вручную отказаться от членов

168

В отличие от Objective-C, Swift не имеет препроцессора, поэтому есть ли способ вручную исключать членов класса?

Я ищу что-то похожее на это:

-(id)method __deprecated;
Atomix
источник

Ответы:

266

Вы можете использовать тег Available, например:

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

Где * - платформа (iOS, iOSApplicationExtension, macOS, watchOS, tvOS, * для всех и т. Д.).

Вы можете также указать версию платформы , с которой он был introduced, deprecated, obsoleted, renamed, а также 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
}

Если ваш проект ориентирован на несколько платформ, вы можете использовать несколько тегов, например:

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

Более подробная информация в документации Swift .

Аксель Гильмин
источник
В Swift 3 =s заменяются на :s.
Сэм Соффс
2
*, deprecated: 10.0не рекомендуется использовать его iOS 10и tvOS 10т. д., я полагаю, мы не должны объединяться *с номером версии? Есть идеи, как это сделать лучше?
Fabb
@fabb Это версия приложения, а не iOS
Аксель Гильмин
1
Это неправда. Из документации вы связали: «версия указанной платформы»
fabb
1
Точно, возвращаясь к моей первоначальной точке: @available(*, deprecated: 10.0)поэтому это очень плохая идея, если код работает не только на iOS
fabb
70

Начиная с Swift 3 и Swift 4 , номер версии не обязателен. Теперь вы можете просто набрать:

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

Или, если вы хотите сообщение, согласитесь с ним:

@available(*, deprecated, message: "no longer available ...")
func foo() {
    // ...
}
Ючен Чжун
источник
1
Для Swift 2.3 номер версии тоже необязателен.
DawnSong
3
Для Swift 2.3, синтаксис, кажется, @available(*, deprecated, message = "no longer available ...")при включении сообщения.
Даниэль Чжан
@ Даниил, странно, что Apple меняет часть, а не остальные, называя это 2.3. Войдите, я обновлю ответ снова, спасибо за примечание!
Ючен Чжун
6

Вы можете использовать это, чтобы автоматически исправить ваши записи с вашей новой функцией

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

func myNewFunc() {
   // ...
}

Вместо * вы можете использовать swift для номера версии swift.

Устаревшие функции генерируют предупреждения, но все еще могут быть вызваны. (Предупреждение)

Устаревшие функции не дают ему быть вызванным полностью. (Ошибка)

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

или используйте другие опции, такие как iOS, macOS, watchOS, tvOS ...

Skyborg
источник
1
@available(iOS, deprecated:7.0, obsoleted: <ObsoletedVersion>, renamed: "myFuncNew", message: "Please use new method - myFuncNew()")
func myFuncOld() {
    //
}

Если deployment targetесть 9.0и

1. <ObsoletedVersion>== 10.0-warning

введите описание изображения здесь

2. <ObsoletedVersion>== 8.0-compile error

введите описание изображения здесь

yoAlex5
источник
В случае «устаревшего» варианта, не может его использовать. Согласно этому, опция не реализована. bugs.swift.org/browse/SR-8168
mkjwa