MILLEN BOX

音楽好きの組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

​ #selector がswift4では使えない? → 使えます

​ みなさんiOS11対応してますか?
私はやっとチョビチョビと始めましたよ。

今回はiOS10で動かしていたswift3ソースを初めて開き、自動変換した時にぶつかった疑問をメモしておきます。
Xcode9を起動してswift3以前のソースを開くとXcodeマイグレーションしてくれます。

そうすると今まで一部にしかついていなかった@objc記述子が#selectorで呼ばれている全てのメソッドの頭につきます。
これでおしまいかと思いきや、ビルドするとこんな警告が出るのです。

The use of Swift 3 @objc inference in Swift 4 mode is deprecated. 
Please address deprecated @objc inference warnings, test your code 
with “Use of deprecated Swift 3 @objc inference” logging enabled, 
and then disable inference by changing the "Swift 3 @objc Inference" 
build setting to "Default" for the "bluerer" target.

Google翻訳さんの助けを借りて自分なるに翻訳しますと、

Swift4にてSwift3の@objc推論を使用することは非推奨です。
推奨されない@objc推論の警告に対処してください。
対処方法としては、「非推奨のSwift 3 @objc推論の使用」ロギングを有効にし、
ターゲットの "Swift 3 @objc Inference"ビルド設定を "Default"に変更して推論を無効にします。

@objcを使ったやり方はswift4では非推奨です、と書いているように見えます。

うーん、、、どういうこと?対処方法はあるみたいだけど?

swift4では@objcを使ったselector呼び出しを使うのが非推奨なの?

上記について、正確に理解しているわけではないのですが、非推奨になったわけではないようです。
Build settingsのSwift 3 @objc inferenceの設定をOnからDefaultへ変更することで対処可能ですが、これがAppleが推奨する形になったと考えて良さそうです。
プロジェクト→Build settingsに進んで、そこの検索窓に「Swift 3 @objc inference」と打てばすぐに出てきます。

f:id:anthrgrnwrld:20171003082420p:plain  この方法についてある方に
「非推奨な使い方にも関わらず、設定で警告が消えてしまうことに違和感を感じる」
と伝えたところ、

@objc自体が非推奨になったわけじゃないみたい。
Swift3のときはXcodeが自動的に@objcをつけてくれてたけど、
Swift4からは明示的にかかないといけなくなったという感じかな。

とコメント頂きストンと落ち着きました。
ありがとうございました!
皆さまのご参考にもなれば幸いです!


​ <参考ページ>

dev.classmethod.jp

https://help.apple.com/xcode/mac/current/#/deve838b19a1?sub=devded6c2001