- @objc
推論とは何ですか?何が起こっている?
ではSwift 3
、コンパイラーは@objc
多くの場所で推論を行うので、そうする必要はありません。言い換えれば、それは@objc
あなたのために追加することを確認します!
ではSwift 4
、コンパイラーは(これほど)これを行わなくなりました。ここで@objc
明示的に追加する必要があります。
デフォルトでは、Swift 4以前のプロジェクトがある場合、これに関する警告が表示されます。Swift 4プロジェクトでは、ビルドエラーが発生します。これは、SWIFT_SWIFT3_OBJC_INFERENCE
ビルド設定によって制御されます。Swift 4以前のプロジェクトでは、これはに設定されていOn
ます。これをDefault
(またはOff
)に設定することをお勧めします。これは、新しいプロジェクトのデフォルトのオプションです。
すべてを変換するにはしばらく時間がかかりますが、Swift 4のデフォルトであるため、実行する価値があります。
-コンパイラの警告/エラーを停止するにはどうすればよいですか?
コンパイラーが文句を言わないようにコードを変換する方法は2つあります。
1つは@objc
、Objective-Cランタイムに公開する必要がある各関数または変数で使用することです。
@objc func foo() {
}
もう1つは宣言で使用@objcMembers
することClass
です。これにより、クラス内のすべての関数と変数が自動的に追加@objc
されます。これは簡単な方法ですが、コストがかかります。たとえば、公開する必要がなかった関数を公開することで、アプリケーションのサイズを増やすことができます。
@objcMembers class Test {
}
-何で@objc
、なぜ必要なのですか?
Swiftクラスに新しいメソッドまたは変数を導入する場合は、@objc
それらをObjective-Cランタイムに公開するものとしてマークします。これは、Swiftクラスを使用するObjective-Cコードがある場合、またはのようなObjective-Cタイプの機能を使用している場合に必要ですSelectors
。たとえば、target-actionパターン:
button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
-なぜすべてをマークしないの@objc
ですか?
何かを@objc
次のようにマークすると付属するネガがあります:
- アプリケーションのバイナリサイズの増加
- 関数のオーバーロードなし
これは非常に高レベルの要約であり、私が書いたよりも複雑であることを覚えておいてください。詳細については、実際の提案を読むことをお勧めします。
出典: