1
resposta

#seletor não funciona no Swift 4

Porque no Swift 4 pede implementar @objc na frente do função?

override func viewDidLoad() {
        let newItemButton = UIBarButtonItem(title: "New Item", style: UIBarButtonItemStyle.plain, target: self, action: #selector(showNewItem))
        navigationItem.rightBarButtonItem = newItemButton
    }

    @objc func showNewItem() {
        print("New Item...")
    }
1 resposta

Oi Lucas, tudo bem?

As versões anteriores do Swift 4 inferiam as classes herdadas de NSObject como sendo @objc (Objective C), dessa forma era permitido usar seletores por exemplo sem a necessidade de colocar essa anotação.

Contudo, na versão 4 do Swift houve uma atualização onde alguns métodos não são mais inferidos automaticamente. A ideia é evitar sobrecargas de classes herdadas de NSObject com outras por terem por exemplo seletores iguais.

Outra observação é que o custo para mapear implementações do Objective-C no Swift poderia aumentar o tempo de carregamento.

Vou deixar o link, caso você queira ver detalhadamente as atualizações:

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

Abs.