O uso da inferência Swift 3 @objc no modo Swift 4 está obsoleto?

Resumidamente, ao usar o Xcode 9 Beta, corri para o seguinte aviso:

O uso da inferência Swift 3 @objc no modo Swift 4 está obsoleto. Por favor, aborde os avisos de inferência @objc, teste seu código com a opção “Uso da desativação Swift 3 @objc inferência” ativada e desative a inferência Swift 3 @objc. **

Depois de alguma pesquisa, ainda não tenho ideia de como corrigir o problema. Eu agradeceria muito qualquer dica sobre como corrigir esse problema, bem como uma explicação do que está acontecendo.

Meu objective é entender melhor o que está acontecendo com meu código.

Eu me livrei deste aviso, alterando a configuração de compilation “Swift 3 @objc Inference” dos meus destinos para “Default”.

Desativar a inferência Swift 3 @objc no Xcode9

Deste artigo :

Antes do Swift 4, o compilador disponibilizou automaticamente algumas declarações Swift para o Objective-C . Por exemplo, se uma subclass de NSObject, o compilador criou pontos de input Objective-C para todos os methods nessas classs. O mecanismo é chamado de inferência @objc.

No Swift 4, essa inferência automática @objc é obsoleta porque é caro gerar todos esses pontos de input do Objective-C. Quando a configuração “Swift 3 @objc Inference” está definida como “On”, permite que o código antigo funcione. No entanto, ele mostrará avisos de reprovação que precisam ser tratados. Recomenda-se “corrigir” esses avisos e alternar a configuração para “Padrão” , que é o padrão para novos projetos do Swift.

Por favor, consulte também esta proposta Swift para mais informações.

O que é inferência @objc ? O que está acontecendo?

No Swift 3, o compilador infere @objc em vários lugares para que você não precise fazer isso. Em outras palavras, certifique-se de adicionar @objc para você!

No Swift 4, o compilador não faz mais isso (tanto). Agora você deve adicionar @objc explicitamente.

Por padrão, se você tiver um projeto pré-Swift 4, receberá avisos sobre isso. Em um projeto do Swift 4, você receberá erros de compilation. Este é o controlador através da configuração de construção SWIFT_SWIFT3_OBJC_INFERENCE . Em um projeto pré-Swift 4, isso é definido como On . Eu recomendaria definir isso como Default (ou Off ), que agora é a opção padrão em um novo projeto.

Levará algum tempo para converter tudo, mas como é o padrão para o Swift 4, vale a pena fazê-lo.

Como faço para parar os avisos / erros do compilador?

Existem duas maneiras de converter seu código para que o compilador não reclame.

Uma é usar @objc em cada function ou variável que precisa ser exposta ao tempo de execução do Objective-C:

 @objc func foo() { } 

A outra é usar @objcMembers por uma declaração de Class . Isso garante que você adicione @objc automaticamente a TODAS as funções e variables ​​da class. Este é o caminho mais fácil, mas tem um custo, por exemplo, pode aumentar o tamanho do seu aplicativo, expondo funções que não precisam ser expostas.

 @objcMembers class Test { } 

– O que é @objc e por que é necessário?

Se você introduzir novos methods ou variables ​​em uma class Swift, marcá-los como @objc expõe ao tempo de execução do Objective-C. Isso é necessário quando você possui o código Objective-C que usa sua class Swift ou, se estiver usando resources do tipo Objective-C, como Selectors . Por exemplo, o padrão de ação de destino: button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)

– Por que eu não marcaria tudo @objc ?

Existem negativos que vêm marcando algo como @objc :

  • Tamanho binário aumentado do aplicativo
  • Nenhuma sobrecarga de function

Por favor, tenha em mente que este é um resumo de alto nível e que é mais complicado do que eu escrevi. Eu recomendaria a leitura da proposta atual para mais informações.

Fontes:

O Migrator não pode identificar todas as funções que precisam dos thunks Inferred Objective-C do @objc marcadas como obsoletas para ajudá-lo a encontrá-las
• Construir avisos sobre methods obsoletos
• Mensagens do console ao executar thunks reprovados

insira a descrição da imagem aqui

meus dois centavos: você pode simplesmente passar para “padrão” em vez de “ON”. Parece mais aderente à lógica da Apple.

(mas todos os outros comentários sobre o uso de @obj permanecem válidos.)

De fato, você se livrará desses avisos desabilitando a Inferência @ Swob 3 @objc. No entanto, questões sutis podem aparecer. Por exemplo, a KVO deixará de funcionar. Este código funcionou perfeitamente sob o Swift 3:

 for (key, value) in jsonDict { if self.value(forKey: key) != nil { self.setValue(value, forKey: key) } } 

Depois de migrar para o Swift 4 e definir “Swift 3 @objc Inference” como padrão, alguns resources do meu projeto pararam de funcionar . Levou-me algumas depurações e pesquisas para encontrar uma solução para isso. De acordo com meu melhor conhecimento, aqui estão as opções:

  • Ative “Swift 3 @objc Inference” (só funciona se você migrou um projeto existente do Swift 3) insira a descrição da imagem aqui
  • Marque os methods e propriedades afetados como @objc insira a descrição da imagem aqui
  • Reabilite a inferência ObjC para toda a class usando @objcMembers insira a descrição da imagem aqui

A reativação da inferência @objc deixa você com os avisos, mas é a solução mais rápida. Observe que ele está disponível apenas para projetos migrados de uma versão anterior do Swift. As outras duas opções são mais tediosas e exigem alguns testes de código e testes extensivos.

Veja também https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md

Eu tive esse aviso com a configuração “Swift 3 @objc Inference” = “Default”. Então percebi que estava definido para o projeto – não para o alvo. Portanto, verifique se você tem a configuração “Padrão” no seu destino para se livrar do aviso.

Swift 3 @objc Inference O uso da inferência Swift 3 @objc no modo Swift 4 foi descontinuado. Por favor, refira os avisos de inferência @objc obsoletos, teste seu código com o registro de “Uso de depreciação Swift 3 @objc inferência” ativado e desabilite a inferência alterando a configuração de compilation “Swift 3 @objc Inference” para “Default” para o “XMLParsingURL” alvo.

cheguei ao

  1. O primeiro passo foi construir configuração

  2. Pesquisar para criar inferência de configuração

  3. mudança rápida 3 @objc Inference Default

insira a descrição da imagem aqui

O uso da inferência Swift 3 @objc no modo Swift 4 está obsoleto?

use func call @objc

 func call(){ foo() } @objc func foo() { }