Swift4モードでSwift3 @objc推論を使用することはお勧めしませんか?



Is It Not Recommended Use Swift 3 Objc Inference Swift 4 Mode



この記事の翻訳元: Swift4モードでのSwift3 @objc推論の使用は非推奨ですか?

簡単に言うと、Xcode 9 Betaを使用しているときに、次の警告が発生しました。 簡単に言うと、Xcode 9 Betaを使用しているときに、次の警告が発生しました。



Swift4モードでのSwift3 @ objc推論の使用は非推奨です。 Swift4モードでSwift3 @ objc推論を使用することはお勧めしません。 非推奨の@objc推論警告に対処し、「非推奨のSwift 3 @objc推論の使用」ログを有効にしてコードをテストし、Swift 3 @ objc推論を無効にしてください。** 非推奨の@objc推論警告を解決し、「非推奨のSwift 3 @objc推論を使用する」ログを有効にしてコードをテストし、Swift 3 @ objc推論を無効にしてください。 ****

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



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


#1階

参照: https://stackoom.com/question/30D5w/ SwiftモードでSwift-objc推論を使用することはお勧めしませんか?


#2階

ターゲットの「Swift3 @ objc Inference」ビルド設定を「デフォルト」に変更することで、この警告を取り除きました。 ターゲットの「Swift3 @ objc Inference」ビルド設定を「デフォルト」に変更することで、この警告を取り除きました。



Xcode9 Swift 3 @objc

から この記事 から この記事

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

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

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


#3階

移行者は、必要なすべての機能を特定することはできません @objc 推測 Objective-C としてマークされたサンク 非推奨 あなたがそれらを見つけるのを助けるために 移民はすべてのニーズを認識することはできません @objc 関数は次のように推測されます 推奨されません Objective-Cクラス あなたがそれらを見つけるのを助けることができます
•非推奨のメソッドに関する警告を作成する •非推奨のメソッドに関する警告を作成する
•非推奨のサンクを実行するときのコンソールメッセージ •非推奨のサンクを実行したときのコンソールメッセージ

画像


#4階

'ON'の代わりに 'default'に渡すことができます。 'on'の代わりに 'default'に渡すことができます。 Appleの論理にもっと固執しているようだ。 それはAppleの論理にもっと従っているようだ。

(ただし、@objの使用に関する他のすべてのコメントは引き続き有効です。) (ただし、使用について@obj他のすべてのメモは引き続き有効です。)


#5階

-@objcとは推論? -@objc推論とは何ですか? 何が起こっている? 何が問題ですか?

Swift 3で、コンパイラは@objcを推測しますあなたがする必要がないように多くの場所で。 in Swift 3 、translator @objc多くの場所で推測@objc 、だからあなたはする必要はありません。 つまり、必ず@objcを追加します。あなたのために! つまり、必ず@objcを追加します。 !

Swift 4で、コンパイラはこれを(同じくらい)実行しなくなりました。 in Swift 4 、コンパイラはこれを実行しなくなりました(可能な限り)。 ここで@objcを追加する必要があります明示的に。 ここで、明示的に追加する必要があります@objc

デフォルトでは、Swift 4より前のプロジェクトがある場合、これに関する警告が表示されます。 デフォルトでは、Swift 4より前のプロジェクトがある場合、この問題に関する警告が表示されます。 Swift 4プロジェクトでは、ビルドエラーが発生します。 Swift 4プロジェクトでは、ビルドエラーが発生します。 これはSWIFT_SWIFT3_OBJC_INFERENCEを介して制御されますビルド設定。 これは、SWIFT_SWIFT3_OBJC_INFERENCEビルド設定を制御することによって行われます。 Swift 4より前のプロジェクトでは、これはOnに設定されています。 。 Swift 4より前のプロジェクトでは、Onに設定します。 。 これをDefaultに設定することをお勧めします(またはOff)。これは新しいプロジェクトのデフォルトオプションになりました。 Defaultに設定することをお勧めします(またはOff)、これは新しいプロジェクトのデフォルトオプションです。

すべてを変換するには時間がかかりますが、Swift 4のデフォルトであるため、変換する価値があります。 すべてを変換するには時間がかかりますが、Swift 4のデフォルト設定であるため、それだけの価値があります。

-コンパイラの警告/エラーを停止するにはどうすればよいですか? -コンパイラの警告/エラーを停止する方法は?

コンパイラが文句を言わないようにコードを変換するには、2つの方法があります。 コンパイラが文句を言わないようにコードを変換する方法は2つあります。

1つは@objcを使用することですObjective-Cランタイムに公開する必要のある各関数または変数について: 1つは、Objective-Cランタイムに公開する必要があるすべての関数または変数で使用することです@objc

@objc func foo() { }

もう1つは、@objcMembersを使用することです。 Classによって宣言。 もう1つはスルーですClass使用を宣言します@objcMembers これにより、@objcが自動的に追加されますに すべて クラス内の関数と変数。 これにより、@objcクラスに自動的に追加されます すべて 関数と変数。 これは簡単な方法ですが、コストがかかります。たとえば、公開する必要のない関数を公開することで、アプリケーションのサイズを大きくすることができます。 これは簡単な方法ですが、ある程度のコストがかかります。たとえば、公開する必要のない関数を公開することで、アプリケーションのサイズを増やすことができます。

@objcMembers class Test { }

-@objcとはそして、なぜそれが必要なのですか? -@objcそれは何で、なぜそれが必要なのですか?

Swiftクラスに新しいメソッドまたは変数を導入する場合は、それらを@objcとしてマークします。それらをObjective-Cランタイムに公開します。 Swiftクラスに新しいメソッドまたは変数を導入すると、@objcマークが付けられます@objcそれらはObjective-Cランタイムに公開されます。 これは、Swiftクラスを使用するObjective-Cコードがある場合、またはSelectorsなどのObjective-Cタイプの機能を使用している場合に必要です。 。 Swiftクラスを使用するObjective-Cコードがある場合、または使用している場合Selectorsこれは、クラスのObjective-Cタイプの関数に必要です。 たとえば、ターゲットアクションパターン:button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside) たとえば、ターゲットアクションモード:button.addTarget(self, action:#selector(didPressButton), for:.touchUpInside)

-なぜすべてにマークを付けないのですか@objc -すべてにマークを付けないのはなぜですか@objc

何かを@objcとしてマークすることに伴うネガがあります: 物事を@objcネガティブになります@objc

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

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

出典: ソース:


#6階

実際、Swift 3 @objc Inferenceを無効にすることで、これらの警告を取り除くことができます。 実際、これらの警告は、Swift 3 @objcInferenceを無効にすることで排除できます。 ただし、微妙な問題が発生する可能性があります。 ただし、微妙な問題が発生する可能性があります。 たとえば、KVOは動作を停止します。 たとえば、KVOは動作を停止します。 このコードはSwift3で完全に機能しました。 このコードはSwift3で完全に実行されます。

for (key, value) in jsonDict { if self.value(forKey: key) != nil { self.setValue(value, forKey: key) } }

Swift 4に移行し、「Swift 3 @objc Inference」をデフォルトに設定した後、 プロジェクトの特定の機能が機能しなくなった Swift 4に移行し、「Swift 3 @objc Inference」をデフォルト値として設定した後、 プロジェクトの一部の機能が機能しなくなりました これに対する解決策を見つけるには、デバッグと調査が必要でした。 解決策を見つけるには、デバッグと調査が必要でした。 私の最善の知識によると、ここにオプションがあります: 私の知る限り、以下のオプションがあります。

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

@objc推論を再度有効にすると、警告が表示されますが、これが最も迅速な解決策です。 @objc推論を再度有効にすると警告が表示されますが、これが最速の解決策です。 以前のSwiftバージョンから移行されたプロジェクトでのみ利用可能であることに注意してください。 以前のSwiftバージョンから移行されたプロジェクトにのみ適用されることに注意してください。 他の2つのオプションはより面倒であり、コードの掘り下げと広範なテストが必要です。 他の2つのオプションは煩雑であり、コードマイニングと広範なテストが必要です。

も参照してください https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md も参照してください https://github.com/apple/swift-evolution/blob/master/proposals/0160-objc-inference.md