Como descontinuar manualmente os membros

168

Ao contrário do Objective-C, o Swift não tem pré-processador, então ainda existe uma maneira de descontinuar manualmente os membros de uma classe?

Estou procurando algo semelhante a este:

-(id)method __deprecated;
Atomix
fonte

Respostas:

266

Você pode usar a tag Disponível, por exemplo:

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

Onde * é a plataforma (iOS, iOSApplicationExtension, macOS, watchOS, tvOS, * para todos, etc.).

Você também pode especificar a versão da plataforma a partir da qual era introduced, deprecated, obsoleted, renamed, e 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
}

Se o seu projeto atingir várias plataformas, você poderá usar várias tags, como:

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

Mais detalhes na documentação do Swift .

Axel Guilmin
fonte
No Swift 3, os =s são substituídos por :s.
Sam Soffes
2
*, deprecated: 10.0vai preteri-lo por iOS 10, tvOS 10etc, acho que não devemos combinar *com um número de versão? Alguma idéia de como fazê-lo melhor?
Fabb
@fabb É a versão do aplicativo, não iOS
Axel Guilmin
1
Isso não é verdade. Dos documentos que você vinculou: "versão da plataforma especificada"
fabb 22/11/16
1
Exatamente, voltando ao meu ponto original: @available(*, deprecated: 10.0)portanto, é uma idéia muito ruim, se o código não só rodar em iOS
fabb
70

Iniciando o Swift 3 e o Swift 4 , o número da versão é opcional. Agora você pode simplesmente digitar:

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

Ou, se você quiser uma mensagem, acompanhe-a:

@available(*, deprecated, message: "no longer available ...")
func foo() {
    // ...
}
Yuchen Zhong
fonte
1
Para o Swift 2.3, o número da versão também é opcional.
DawnSong
3
Para o Swift 2.3, a sintaxe parece estar @available(*, deprecated, message = "no longer available ...")ao incluir uma mensagem.
Daniel Zhang
@ Daniel, é estranho que a Apple mude parte dela e não o resto, chamando-a de 2.3. Assine, atualizarei a resposta novamente, obrigado pela observação!
Yuchen Zhong
6

Você pode usar isso para corrigir automaticamente suas entradas com sua nova função

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

func myNewFunc() {
   // ...
}

Em vez de *, você pode usar swift, para o número da versão rápida.

Funções descontinuadas geram avisos, mas ainda podem ser chamadas. (Aviso)

Funções obsoletas impedem que ele seja chamado inteiramente. (Erro)

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

ou use outras opções como iOS, macOS, watchOS, tvOS ...

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

Se deployment targeté 9.0e

1. <ObsoletedVersion>== 10.0-warning

insira a descrição da imagem aqui

2. <ObsoletedVersion>== 8.0-compile error

insira a descrição da imagem aqui

yoAlex5
fonte
No caso da opção "obsoleta", não é possível usá-la. De acordo com isso, a opção não está implementada. bugs.swift.org/browse/SR-8168
mkjwa