Como silenciar um aviso rapidamente

98

Eu tenho um código que está gerando muitos avisos (API obsoleta)

Usando clang * eu poderia fazer

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    ...
#pragma clang diagnostic pop

No entanto, isso não funciona rapidamente.

Como fazer isso rapidamente?

Nota: Não quero desabilitar o aviso globalmente, nem mesmo em todo o arquivo, mas apenas desabilitar um aviso específico em uma parte específica do meu código-fonte.

Edit: Parece que minha nota não foi clara o suficiente: eu NÃO quero compilação condicional (que é a resposta proposta da suposta duplicata). Eu só quero silenciar um aviso SEM usar as novas APIs.

Antzi
fonte
4
Esta não é uma duplicata. A outra questão não responde a este problema.
Claus Jørgensen
@ ClausJørgensen de que forma falha em responder a este problema? Não há outra maneira conforme declarado nas respostas da pergunta vinculada. Apenas compilação condicional ou nova #availablemacro, onde o desenvolvedor deve usar novos métodos e voltar para os antigos se os novos não estiverem disponíveis.
zrzka
@robertvojta Não, como as respostas, na verdade, não afirmam que não há outras maneiras de silenciar um aviso.
Claus Jørgensen
2
Este não é um idiota. Que tal uma situação em que você recebe um aviso de falta de um inicializador?
NSTJ

Respostas:

157

Em 2020, Xcode 12.0, o consenso é que não há como conseguir isso.

Vou atualizar / editar esta resposta se a Apple adicionar o recurso.

Coloque-o na sua lista de desejos para o WWDC 2021!

Antzi
fonte
21
Droga, isso é uma chatice. Às vezes fica fora de controle . É irritante para dizer o mínimo.
Isuru
2
Eu quero votar esta resposta um milhão de vezes, mas ela responde à pergunta muito bem, então +1 :-)
deadbeef
3
@Isuru Nesse ponto, eu ficava irritado o suficiente para reconstruir tudo. Acho que os avisos funcionaram
Sirenes de
1
@Isuru A maioria deles deve ser corrigida, não ignorada.
kevin
3
Tão frustrante! Obrigado por manter esta resposta atualizada.
Dan Loewenherz
48

Não há uma construção geral para silenciar os avisos de depreciação no Swift, mas há uma solução alternativa que pode ser aplicada em muitos casos .

Digamos que você tenha um método getLatestImage()na classe Fooque usa métodos / classes obsoletos.

Use @availablecomo Daniel Thorpe descreveu para silenciar todos os avisos dentro do método:

@available(iOS, deprecated: 9.0)
func getLatestImage() -> UIImage? {
    ...
}

Agora você gostaria de chamar o método getLatestImage()sem ter um aviso de descontinuação. Você pode conseguir isso definindo primeiro um protocolo e uma extensão:

private protocol GetLatestImage {
    func getLatestImage() -> UIImage?
}
extension Foo: GetLatestImage {}

Em seguida, chame o método sem um aviso de suspensão de uso (se foofor uma instância de Foo):

(foo as GetLatestImage).getLatestImage() // no deprecation warning

O resultado é que você tem um código Swift que usa API obsoleta sem nenhum aviso de remoção.

Tammo Freese
fonte
Tão inteligente. Tipo de mal? :) Mas tão bom. Ótimo para um caso de uso como suprimir avisos sobre o uso contínuo de alguns aspectos da estrutura AddressBook que foram preteridos, mas têm uma substituição que ainda não fornece todas as funcionalidades necessárias. Obrigado.
Duncan Babbage
4
se funcionar, enviarei um pacote de seis de sua bebida favorita. você tem uma mente notável, senhor, obrigado.
João,
@John Obrigado pelas amáveis ​​palavras! Funciona, tive que inventar uma vez que tratamos os avisos como erros em nossa base de código, e há uma seção que ainda usa uma biblioteca obsoleta.
Tammo Freese
1
@John, você mandou o pacote de seis para ele? : P Isso é incrível. Gênio. Obrigado.
Baran Emre
Você é um gênio do mal.
Krypt de
37

Na verdade, você pode suprimir esses avisos usando @availablea estrutura lógica envolvente (ou seja, função / tipo).

Por exemplo, digamos que você tenha algum código que usa a estrutura AddressBook, mas está compilando com o iOS 9.

@available(iOS, deprecated: 9.0)
func addressBookStatus() -> ABAuthorizationStatus {
    return ABAddressBookGetAuthorizationStatus()
}

A partir do Xcode 7.0.1, isso impedirá que os avisos embutidos sejam exibidos.

Daniel Thorpe
fonte
6
Sim, mas você verá o mesmo aviso quando ligar para o seu addressBookStatus()... que você marcará como obsoleto.
Valentin Shergin,
3
Ponta Pro: se você quer silenciá-lo para uma classe inteira apenas bater este filhote de cachorro por cima de sua declaração de classe (ex: class ViewController: UIViewController)
Sirens
2
@Sirens Então você verá este aviso toda vez que chamar esta classe ☹️ (pelo menos com o Xcode 8)
Alexander Vasenin
Alguém conseguiu silenciar todos os avisos obsoletos com esta correção? Consegui diminuir o número deles para apenas um , mas não vejo como me livrar do último. Alguma sugestão?
Alexander Vasenin,
1
Então, como usar isso para silenciar o aviso “converter de 'CGFloat.NativeType' (também conhecido como 'Double') para o tipo não relacionado 'Float' sempre falha” quando estou fazendo um if CGFloat(0).native is Float { … }? Resposta: Não uso isso porque você não respondeu à pergunta.
Slipp D. Thompson
1

Embora não haja nenhuma maneira de silenciar avisos de depreciação no Swift por enquanto, tecnicamente você pode fazer isso para um símbolo específico editando o arquivo de cabeçalho.

  • Copie o nome do símbolo obsoleto
  • Selecione File>Open Quickly
  • Cole o símbolo e pressione Enter

    Certifique-se de que o ícone Swift está desabilitado na caixa Abrir rapidamente

  • Selecione File>Show in Finder

  • Altere as permissões do arquivo para permitir a edição, se necessário
  • Edite as macros de reprovação para o símbolo. Consulte as APIs circundantes para referência. Por exemplo, substitua:

__OSX_AVAILABLE_BUT_DEPRECATED (__ MAC_10_6, __MAC_10_10, __IPHONE_3_0, __IPHONE_8_0)

com

__OSX_AVAILABLE_STARTING (__ MAC_10_6, __IPHONE_3_0)

Agora há um aviso a menos que o distrai, pelo qual você nada pode fazer.

Eu sei, está sujo. Mas se não houver API substituta disponível no SDK atual, deve ser seguro. Assim que uma nova versão do Xcode for lançada, a alteração será substituída e você verá o aviso novamente. Em seguida, você pode testar o novo SDK e sistema operacional para garantir que a API obsoleta ainda esteja disponível e não tenha uma substituição.

Por favor, comente se você puder encontrar alguma desvantagem.

Pointum
fonte
Votos positivos pela desenvoltura, mas deixaria um gosto sujo na minha boca: P
Matt,