Як вручну зняти член


168

На відміну від Objective-C, Swift не має препроцесора, тож чи існує спосіб ручного знецінення членів класу вручну?

Я шукаю щось подібне до цього:

-(id)method __deprecated;

Відповіді:


266

Ви можете використовувати тег "Доступні", наприклад:

@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
Axel Guilmin

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 ...")при включенні повідомлення.
Даніель Чжан

@Daniel, це дивно, що 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 ...


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

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


У разі "застарілої" опції не можна її використовувати. Відповідно до цього, варіант не реалізований. bugs.swift.org/browse/SR-8168
mkjwa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.