web-dev-qa-db-ja.com

@objcと@nonobjcがメソッドと変数の前にswiftで書き込むときは?

クラスの拡張で静的パラメータを宣言するときは、次のような変数の前に@nonobjcを記述する必要があります。

 @nonobjc static let test = "test"

そして時々私はメソッドの前に@objcを書かなければならないので、Swiftでの@objcと@nonobjcの使用は何ですか。

誰かがこの問題について私を助けることができますか?

12
vikas prajapati

これは 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を使用します。

22
bontoJR

(補遺/追加の公式詳細 @ bontoJR よく要約された回答)

Swift言語リファレンス-属性 [emphasis mine]から:

objc

この属性を次の宣言に適用しますObjective-Cで表すことができます —たとえば、ネストされていないクラス、プロトコル、一般的でない列挙型(整数の生値型に制約されます)、プロパティ、メソッド(ゲッターを含む)およびセッター)クラスとプロトコル、初期化子、非初期化子、および添え字。 objc属性は、コンパイラにObjective-Cコードで使用できる宣言であることを通知します。

.。

nonobjc

この属性をメソッド、プロパティ、添え字、または初期化子宣言に適用します暗黙のobjc属性を抑制しますnonobjc属性は、Objective-Cで表現することは可能ですが、コンパイラーにObjective-Cコードで宣言を使用不可にするを指示します。

.。

2
dfri

ここで詳細を見つけることができます Swiftドキュメント:InteractingWithObjective-C

ご質問の回答として、添付リンクからの概要は以下のとおりです。

@ objc:属性を使用して、公開されているインターフェイスのクラス、プロパティ、メソッド、列挙型、または列挙型宣言の名前を変更できますObjective-Cコードへ。

:Swiftクラスの名前にObjective-Cでサポートされていない文字が含まれている場合、 Objective-Cで使用する代替名を提供できます。

@ nonobjc:これにより、Objective-CではSwift宣言が使用できなくなります。これを使用してブリッジングの循環性を解決できます。メソッドと、Objective-Cによってインポートされたクラスのメソッドのオーバーロードを許可します。

1
Wolverine