質問: Xcode8やそれ以前のXcodeで開発していたアプリをXcode9とSwift4を使用して開発し始めました。 すると「メソッドに@objcを加えてSwift3 @objc inferenceをDefaultに設定してください」とう警告が表示され、@objcが必要なメソッド部分には警告が表示されFixボタンを押すだけで@objcが挿入され警告も消えました。 ですがXcode9も完璧ではないためか、他にも@objcを記載する必要があるにもかかわらず@objcが必要な全てのメソッドを警告で教えてはくれません(Xcodeの使い方でしょうか。。?)。 そこでご質問なのですが、今まではswift3が暗黙的に@objcを加えてくれていたことは検索してわかりましたが、swiftで書かれたメソッドに@objcを付け加える意味はなんでしょうか?また、付け加える必要のあるメソッドはどのようにして判断すればよろしいのでしょうか? (警告は出ていないが動作しないメソッドがあり、試しに@objcを付け加えた動作したためそのメソッドが@objc記載が必要であることに気づきました。他にもまだ気づいていないメソッドがあるかと思います。)
回答: Swift3 @objc inference を on にして実行すると@objcが必要な関数、プロパティにアクセスがあった時に @objc を付けるように促す警告がコンソールに流れます。 アクセスされないものについては警告が出ませんので、気を付けてください また、アクセスされても@objcの必要ないアクセスでは表示されませんので、これも気を付けてください 全部チェックが出来てから Swift3 @objc inference を default に変更してください。 onのままですとテストのためのコードが多量に含まれるためバイナリサイズがかなり大きくなります。 追記: objcのメソッドとSwiftのメソッド、プロパティの違い すごく低レベルな話になるのですが、コンパイルするときに引数をどのレジスタに格納するかなどの規約がそれぞれの言語にあり、Swiftとobjcではかなり違っています。 そのためobjcから呼び出されるものはobjc用の入り口を作ってあげる必要があります。 Swift3まではコンパイラがある程度推論してそれを作っていたのですが、 Swift4からコンパイラの推論を廃止し@objcなどが付いているもののみにそれを作るようになりました。 プロパティに関しても同様にobjcは結構独特のアクセスを行っているため@objcが必要となります。