簡単に言うと、Xcode 9 Betaを使用しているときに、次のような警告が表示されます。
Swift 4モードでSwift 3 @objc推論を使用することは非推奨です。廃止予定の@objc推論警告に対処し、「廃止予定のSwift 3 @objc推論の使用」ロギングを有効にしてコードをテストし、Swift 3 @objc推論を無効にしてください。**
いくつかの調査の後、私はまだ問題を解決する方法がわかりません。私はこの問題を解決する方法に関するヒントと、何が起こっているのかについての説明に感謝します。
私の目標は、私のコードで何が起こっているのかをよりよく理解することです。
私は、ターゲットの "Swift 3 @objc推論"ビルド設定を "デフォルト"に変更することによって、この警告を取り除きました。
From この記事 :
Swift 4より前では、コンパイラはObjective-Cで自動的に利用可能なSwift宣言を作成しました。たとえば、NSObjectからサブクラス化した場合、コンパイラはそのようなクラスのすべてのメソッドに対してObjective-Cのエントリポイントを作成しました。このメカニズムは@objc推論と呼ばれます。
Swift 4では、このような自動@objc推論は推奨されません _すべてのObjective-Cのエントリポイントを生成するのはコストがかかるためです。 「Swift 3 @objc推論」設定が「オン」に設定されていると、古いコードが機能します。ただし、対処が必要な非推奨警告が表示されます。これらの警告と設定を "デフォルト"に切り替える(これは新しいSwiftプロジェクトのデフォルトです)_を修正することをお勧めします。
詳細については このSwiftの提案 を参照してください。
@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つは、Objective-Cランタイムに公開する必要がある各関数または変数で@objc
を使用することです。
@objc func foo() {
}
もう1つは、Class
宣言によって@objcMembers
を使用することです。これにより、クラスの関数と変数にALLに@objc
が自動的に追加されます。これは簡単な方法ですが、コストがかかります。たとえば、公開する必要のない関数を公開することで、アプリケーションのサイズを増やすことができます。
@objcMembers class Test {
}
@objc
とは何ですか。なぜ必要なのですか?新しいメソッドまたは変数をSwiftクラスに導入すると、それらを@objc
としてマークすると、Objective-Cランタイムに公開されます。これは、Swiftクラスを使用するObjective-Cコードがある場合、またはSelectors
などのObjective-Cタイプの機能を使用している場合に必要です。たとえば、ターゲットアクションパターン:button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)
@objc
をすべてマークしないのはなぜですか?何かを@objc
としてマークすることには、ネガがあります:
これは非常に高レベルの要約であり、私が書いたよりも複雑であることを覚えておいてください。詳細については、実際の提案を読むことをお勧めします。
"Swift 3 @objc Inference" = "Default"の設定でこの警告が出ました。それから私はそれがプロジェクトのために設定されているのではなく、ターゲットのために設定されていることに気づきました。だから、あなたがあなたのターゲットに "Default"設定があることを確認して、警告を取り除いてください。
単に "ON"の代わりに "default"に渡すことができます。 Appleのロジックにもっと準拠しているようです。
(ただし、@obj
の使用に関するその他のコメントはすべて有効なままです。)
実際、Swift 3 @objc Inferenceを無効にすることで、これらの警告を取り除くことができます。ただし、微妙な問題が発生する場合があります。たとえば、KVOは動作を停止します。このコードはSwift 3の下で完全に機能しました:
for (key, value) in jsonDict {
if self.value(forKey: key) != nil {
self.setValue(value, forKey: key)
}
}
Swift 4に移行し、「Swift 3 @objc Inference」をデフォルトに設定した後、プロジェクトの特定の機能が動作しなくなりました。この解決策を見つけるには、デバッグと研究が必要でした。私の最高の知識によると、オプションは次のとおりです。
@objc推論を再度有効にすると警告が表示されますが、これが最も迅速なソリューションです。以前のSwiftバージョンから移行されたプロジェクトでのみ使用できることに注意してください。他の2つのオプションは、より退屈で、コードの掘り下げと広範なテストが必要です。
こちらもご覧ください https://github.com/Apple/Swift-evolution/blob/master/proposals/0160-objc-inference.md
Swift 3 @objc推論 Swift 4モードでSwift 3 @objc推論を使用することは非推奨です。非推奨の@objc推論警告に対処し、「非推奨のSwift 3 @objc推論の使用」ロギングを有効にしてコードをテストしてから、 "XMLParsingURL"の "Swift 3 @objc推論"ビルド設定を "デフォルト"に変更して推論を無効にしますターゲット。
に着いた
最初のステップはビルド設定
ビルド設定推論への検索
swift 3 @objc推論のデフォルトを変更
あなたは "Pod update"や "flutter clean"を試すことができます。
私はこの設定をxcodeでも設定しました。
Objective-Cのインターフェイス設定は次のとおりです。
テストが終了するまで待ってからビルド設定、ビルド設定推論への検索、 Swift 3 @objc推論を(デフォルト)に変更します。それが私がしたことと完璧に機能したことのすべてです。
Swift 4モードでSwift 3 @objc推論を使用することは非推奨ですか?
関数呼び出し@objcを使用
func call(){
foo()
}
@objc func foo() {
}
@wisekiddoが言ったことの上に、あなたがあなたのビルドフレーバーのためにSwift 3 @obj推論をproject.pbxproj
のようにデフォルトに設定することによってSwift_SWIFT3_OBJC_INFERENCE = Default;
ファイルのあなたのビルド設定を修正することもできます。 Xcode以外の他の環境