- 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 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 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:
@objc func foo() {
}
O outro é usar @objcMembers
por uma Class
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.
@objcMembers class Test {
}
- 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, 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
:
- Aumento do tamanho binário do aplicativo
- Sem sobrecarga de função
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: