Resumidamente, ao usar o Xcode 9 Beta, encontrei o seguinte aviso:
O uso da inferência Swift 3 @objc no modo Swift 4 está obsoleto. Dirija-se aos avisos obsoletos da inferência @objc, teste seu código com o log "Uso da inferência Swift 3 @objc" obsoleta ativado e desabilite a inferência do Swift 3 @objc. **
Após algumas pesquisas, ainda não tenho idéia de como corrigir o problema. Eu gostaria muito de receber dicas sobre como corrigir esse problema, bem como uma explicação do que está acontecendo.
Meu objetivo é entender melhor o que está acontecendo com meu código.
swift
swift4
xcode9-beta
DaleK
fonte
fonte
Respostas:
Eu me livrei desse aviso alterando a configuração de compilação "Swift 3 @objc Inference" dos meus destinos para "Padrão".
Deste artigo :
Consulte também esta proposta Swift para obter mais informações.
fonte
@objc
inferência Swift 3 no modo Swift 4 está obsoleto. Envie os@objc
avisos de inferência obsoletos , teste seu código com o@objc
log " Uso da inferência Swift 3 obsoleta "ativado e desative a@objc
inferência Swift 3 ". Alguma idéia de onde ativar o referido@objc
registro de inferência Swift 3 ?- O que é
@objc
inferência? O que está acontecendo?Em
Swift 3
, o compilador deduz@objc
em vários lugares para que você não precise. Em outras palavras, certifica-se de adicionar@objc
para você!Em
Swift 4
, o compilador não faz mais isso (tanto). Agora você deve adicionar@objc
explicitamente.Por padrão, se você tiver um projeto anterior ao Swift 4, receberá avisos sobre isso. Em um projeto Swift 4, você receberá erros de construção. Isso é controlado através da
SWIFT_SWIFT3_OBJC_INFERENCE
configuração de compilação. Em um projeto pré-Swift 4, isso é definido comoOn
. Eu recomendaria definir isso comoDefault
(ouOff
), 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 interrompo os avisos / erros do compilador?
Existem duas maneiras de converter seu código para que o compilador não se queixe.
Uma é usar
@objc
em cada função ou variável que precisa ser exposta ao tempo de execução do Objective-C:O outro é usar
@objcMembers
por umaClass
declaração. Isso garante adicionar automaticamente@objc
a TODAS as funções e variáveis da classe. Essa é a maneira mais fácil, mas tem um custo, por exemplo, pode aumentar o tamanho do seu aplicativo, expondo funções que não precisavam ser expostas.- O que é
@objc
e por que é necessário?Se você introduzir novos métodos ou variáveis em uma classe Swift, marcando-os como os
@objc
expõe ao tempo de execução Objective-C. Isso é necessário quando você possui um código Objective-C que usa sua classe Swift ou, se você estiver usando recursos do tipo Objective-C, comoSelectors
. 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
:Lembre-se de que este é um resumo de alto nível e mais complicado do que escrevi. Eu recomendaria ler a proposta real para obter mais informações.
Fontes:
fonte
@objc
não implica expedição dinâmica, o Swift é livre para usar expedição estática ou virtual (e, possivelmente, executar código diferente como resultado). Adynamic
palavra-chave é necessária para forçar o Swift a usar o envio dinâmico.@objc
privar o que devemos usar?SWIFT_SWIFT3_OBJC_INFERENCE
àsOn
. Converta para o Swift 4. Em seguida, lide com as@objc
coisas. Para simplificar, siga as regras básicas: SE a classe Swift for usada no código Objc-C (via cabeçalho de ponte), use@objcMembers
, caso contrário, uma adição um a um@objc
. Basta usar a pesquisa do Xcode para descobrir se a classe Swift é chamada a partir de qualquer.m
arquivo. Isso deve tornar a conversão relativamente indolor.@objc
Swift 4 mudou e, em seguida, tomar a decisão de corrigir o projeto e mantê-lo da mesma forma.Migrator não consegue identificar todas as funções que necessidade @objc Inferido Objective-C thunks marcados como obsoleto para ajudar a encontrar-los
• Construir avisos sobre métodos obsoletos
• Mensagens de Console ao executar obsoleto thunks
fonte
Eu recebi esse aviso com a configuração "Swift 3 @objc Inference" = "Padrão". Então percebi que estava definido para o projeto - não para o alvo. Portanto, verifique se você tem a configuração "Padrão" em seu destino para se livrar do aviso.
fonte
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.)fonte
Na verdade, você se livrará desses avisos desativando o Swift 3 @objc Inference. No entanto, problemas sutis podem aparecer. Por exemplo, o KVO irá parar de funcionar. Esse código funcionou perfeitamente no Swift 3:
Depois de migrar para o Swift 4 e definir "Swift 3 @objc Inference" como padrão, certos recursos do meu projeto pararam de funcionar . Levei algumas depurações e pesquisas para encontrar uma solução para isso. De acordo com o meu melhor conhecimento, aqui estão as opções:
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 requerem alguns testes de digitação de código e extensos.
Consulte também https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md
fonte
Sou um desenvolvedor ocasional do iOS (em breve será mais), mas ainda não consegui encontrar a configuração conforme guiada pela outra resposta (já que eu não tinha esse item de chaveiro, a resposta mostra), então agora que o encontrei, pensei Posso apenas adicionar este instantâneo com os locais destacados nos quais você precisará clicar e encontrar.
fonte
Você pode tentar "Atualização do pod" e / ou "limpeza rápida"
Também defino essa configuração no xcode.
A configuração da interface Objective-C é a seguinte:
fonte
Inferência Swift 3 @objc O uso da inferência Swift 3 @objc no modo Swift 4 foi descontinuado. Dirija-se aos avisos obsoletos do @objc inference, teste seu código com o "Uso do Swift 3 @objc inference" obsoleto ativado e desative a inferência alterando a configuração de compilação "Swift 3 @objc Inference" para "Padrão" para o "XMLParsingURL" alvo.
chegou ao
A primeira etapa obteve a configuração de compilação
Pesquisar para criar inferência de configuração
change swift 3 @objc Inferência Padrão
insira a descrição da imagem aqui
fonte
Tudo o que você precisa é apenas executar uma espera de teste até o final. Depois disso, vá para Build Setting, pesquise em Build Setting Inference, altere swift 3 @objc Inference para (Padrão). foi tudo o que fiz e funcionou perfeitamente.
fonte
usar chamada de função @objc
fonte
Além do que @wisekiddo disse, você também pode modificar as configurações de compilação no
project.pbxproj
arquivo, definindo a Swift 3 @obj Inference como padrão, comoSWIFT_SWIFT3_OBJC_INFERENCE = Default;
para seus sabores de compilação (por exemplo, depuração e liberação), especialmente se você vier de outro ambiente além do Xcodefonte