クラスの拡張で静的パラメータを宣言するときは、次のような変数の前に@nonobjcを記述する必要があります。
@nonobjc static let test = "test"
そして時々私はメソッドの前に@objcを書かなければならないので、Swiftでの@objcと@nonobjcの使用は何ですか。
誰かがこの問題について私を助けることができますか?
これは Appleの公式ドキュメント Objective-Cについて-Swiftの相互運用性で説明されています:
Swiftクラスで@objc(name)属性を使用すると、クラスは名前空間なしでObjective-Cで使用できるようになります。その結果、この属性は、アーカイブ可能なObjective-CクラスをSwiftに移行するときにも役立ちます。アーカイブされたオブジェクトはクラスの名前をアーカイブに保存するため、@ objc(name)属性を使用してObjective-Cクラスと同じ名前を指定し、古いアーカイブを新しいSwiftでアーカイブ解除できるようにする必要があります。 _クラス。
逆に、Swiftは@nonobjc属性も提供します。これにより、Objective-CではSwift宣言を使用できなくなります。これを使用して、ブリッジメソッドの循環性を解決し、Objective-Cによってインポートされたクラスのメソッドのオーバーロードを許可できます。変数としてパラメーターを指定するなど、Objective-Cで表現できないSwiftメソッドによってObjective-Cメソッドがオーバーライドされる場合、そのメソッドは@nonobjcとマークする必要があります。
要約すると、名前空間なしでSwift属性をObjective-Cに公開する場合は、@ objcを使用します。 Swiftコードでのみ属性を使用可能にし、アクセスできるようにする場合は、@ nonobjcを使用します。
(補遺/追加の公式詳細 @ bontoJR よく要約された回答)
Swift言語リファレンス-属性 [emphasis mine]から:
objc
この属性を次の宣言に適用しますObjective-Cで表すことができます —たとえば、ネストされていないクラス、プロトコル、一般的でない列挙型(整数の生値型に制約されます)、プロパティ、メソッド(ゲッターを含む)およびセッター)クラスとプロトコル、初期化子、非初期化子、および添え字。
objc
属性は、コンパイラにObjective-Cコードで使用できる宣言であることを通知します。.。
nonobjc
この属性をメソッド、プロパティ、添え字、または初期化子宣言に適用します暗黙の
objc
属性を抑制します。nonobjc
属性は、Objective-Cで表現することは可能ですが、コンパイラーにObjective-Cコードで宣言を使用不可にするを指示します。.。
ここで詳細を見つけることができます Swiftドキュメント:InteractingWithObjective-C
ご質問の回答として、添付リンクからの概要は以下のとおりです。
@ objc:属性を使用して、公開されているインターフェイスのクラス、プロパティ、メソッド、列挙型、または列挙型宣言の名前を変更できますObjective-Cコードへ。
例:Swiftクラスの名前にObjective-Cでサポートされていない文字が含まれている場合、 Objective-Cで使用する代替名を提供できます。
@ nonobjc:これにより、Objective-CではSwift宣言が使用できなくなります。これを使用してブリッジングの循環性を解決できます。メソッドと、Objective-Cによってインポートされたクラスのメソッドのオーバーロードを許可します。