web-dev-qa-db-ja.com

Swift 4モードでSwift 3 @objc推論を使用することは非推奨ですか?

簡単に言うと、Xcode 9 Betaを使用しているときに、次のような警告が表示されます。

Swift 4モードでSwift 3 @objc推論を使用することは非推奨です。廃止予定の@objc推論警告に対処し、「廃止予定のSwift 3 @objc推論の使用」ロギングを有効にしてコードをテストし、Swift 3 @objc推論を無効にしてください。**

いくつかの調査の後、私はまだ問題を解決する方法がわかりません。私はこの問題を解決する方法に関するヒントと、何が起こっているのかについての説明に感謝します。

私の目標は、私のコードで何が起こっているのかをよりよく理解することです。

449
DaleK

私は、ターゲットの "Swift 3 @objc推論"ビルド設定を "デフォルト"に変更することによって、この警告を取り除きました。 

Disable Swift 3 @objc inference in Xcode9

From この記事

Swift 4より前では、コンパイラはObjective-Cで自動的に利用可能なSwift宣言を作成しました。たとえば、NSObjectからサブクラス化した場合、コンパイラはそのようなクラスのすべてのメソッドに対してObjective-Cのエントリポイントを作成しました。このメカニズムは@objc推論と呼ばれます。

Swift 4では、このような自動@objc推論は推奨されません _すべてのObjective-Cのエントリポイントを生成するのはコストがかかるためです。 「Swift 3 @objc推論」設定が「オン」に設定されていると、古いコードが機能します。ただし、対処が必要な非推奨警告が表示されます。これらの警告と設定を "デフォルト"に切り替える(これは新しいSwiftプロジェクトのデフォルトです)_を修正することをお勧めします。

詳細については このSwiftの提案 を参照してください。

744
Evgenii

-@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としてマークすることには、ネガがあります:

  • アプリケーションバイナリサイズの増加
  • 関数のオーバーロードなし

これは非常に高レベルの要約であり、私が書いたよりも複雑であることを覚えておいてください。詳細については、実際の提案を読むことをお勧めします。

ソース:

260
kgaidis

@objc 推論Objective-Cサンクとマークされた廃止予定を必要とするすべての関数をMigratorが識別できない
•廃止予定のメソッドに関する警告を作成する
•廃止予定のサンクを実行しているときのコンソールメッセージ

enter image description here

45
Hassan Taleb

"Swift 3 @objc Inference" = "Default"の設定でこの警告が出ました。それから私はそれがプロジェクトのために設定されているのではなく、ターゲットのために設定されていることに気づきました。だから、あなたがあなたのターゲットに "Default"設定があることを確認して、警告を取り除いてください。

8
Dmitry

単に "ON"の代わりに "default"に渡すことができます。 Appleのロジックにもっと準拠しているようです。

(ただし、@objの使用に関するその他のコメントはすべて有効なままです。)

8
ingconti

実際、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」をデフォルトに設定した後、プロジェクトの特定の機能が動作しなくなりました。この解決策を見つけるには、デバッグと研究が必要でした。私の最高の知識によると、オプションは次のとおりです。

  • 「Swift 3 @objc Inference」を有効にします(Swift 3から既存のプロジェクトを移行した場合にのみ機能します) enter image description here
  • 影響を受けるメソッドとプロパティを@objcとしてマークします enter image description here
  • @objcMembersを使用してクラス全体のObjC推論を再度有効にします enter image description here

@objc推論を再度有効にすると警告が表示されますが、これが最も迅速なソリューションです。以前のSwiftバージョンから移行されたプロジェクトでのみ使用できることに注意してください。他の2つのオプションは、より退屈で、コードの掘り下げと広範なテストが必要です。

こちらもご覧ください https://github.com/Apple/Swift-evolution/blob/master/proposals/0160-objc-inference.md

7
Karoly Nyisztor

Swift 3 @objc推論 Swift 4モードでSwift 3 @objc推論を使用することは非推奨です。非推奨の@objc推論警告に対処し、「非推奨のSwift 3 @objc推論の使用」ロギングを有効にしてコードをテストしてから、 "XMLParsingURL"の "Swift 3 @objc推論"ビルド設定を "デフォルト"に変更して推論を無効にしますターゲット。

に着いた 

  1. 最初のステップはビルド設定

  2. ビルド設定推論への検索

  3. swift 3 @objc推論のデフォルトを変更

ここに画像の説明を入力してください

2
Praveen Kumar

あなたは "Pod update"や "flutter clean"を試すことができます。

私はこの設定をxcodeでも設定しました。

Objective-Cのインターフェイス設定は次のとおりです。

ObjectiveC interface setting

1
wisekiddo

私はたまにiOS開発者ですが(もうすぐですが)他の答えではその設定を見つけることができませんでした。クリックして見つける必要がある強調表示された場所にこのスナップショットを追加するだけです。

  1. 左上から始める
  2. プロジェクトフォルダのアイコンを選択してください
  3. プロジェクトフォルダアイコンの下にあるメインプロジェクト名を選択します。
  4. 右側にある[Build Settings]を選択します。
  5. TARGETSの下であなたのプロジェクトを選択してください。
  6. 一番下までスクロールする(または検索テキストボックスでWord推論を検索する)

Finding the setting

1
raddevus

テストが終了するまで待ってからビルド設定、ビルド設定推論への検索、 Swift 3 @objc推論を(デフォルト)に変更します。それが私がしたことと完璧に機能したことのすべてです。

0
Acasey

Swift 4モードでSwift 3 @objc推論を使用することは非推奨ですか?

関数呼び出し@objcを使用 

func call(){

foo()

}

@objc func foo() {

}
0
Puji Wahono

@wisekiddoが言ったことの上に、あなたがあなたのビルドフレーバーのためにSwift 3 @obj推論をproject.pbxprojのようにデフォルトに設定することによってSwift_SWIFT3_OBJC_INFERENCE = Default;ファイルのあなたのビルド設定を修正することもできます。 Xcode以外の他の環境

0
DaveNOTDavid