2017-06-30 17 views
4

でセレクタを使用するためのベストプラクティスは何ですか、私は次の方法を行うことができます:Xcodeの9.0ベータ2(スウィフト4.0)で、しかし通知を登録するには、スウィフト3で通知

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.n1(notification:)), name: Notification.Name("123"), object: nil) 
func n1(notification: Notification){ 
    print("123") 
} 


// #selector is more brief 
NotificationCenter.default.addObserver(self, selector: #selector(n2), name: Notification.Name("456"), object: nil) 
func n2(notification: Notification){ 
    print("456") 
} 

を、Iこの方法で通知を登録すると、オブジェクトメソッドはプレフィックス@objcを持つ必要があります。なぜですか?通知を使用するベストプラクティスは何ですか?

Argument of '#selector' refers to instance method 'n1(notification:)' that is not exposed to Objective-C

//Add '@objc' to expose this instance method to Objective-C 
@objc func n1(notification: Notification){ 
    print("123") 
} 

@objc func n2(notification: Notification){ 
    print("456") 
} 

答えて

3

あなたは間違っていないです。実際のところ

このリンゴは、あなたがスウィフト4でセレクタを使用する必要があります方法について説明している:Objective-Cで

、セレクタは のObjective-Cの名前を参照タイプであります方法。 Swiftでは、Objective-Cセレクタは セレクタ構造で表され、#セレクタ 式を使用して構築できます。 Objective-Cから呼び出せるメソッドのセレクタを作成するには、#selector(MyViewController.tappedButton(sender :))などのメソッドの名前を渡します。プロパティのObjective-C getterまたはsetterメソッドのセレクタを構築するには、 の前に#selector(getter:MyViewController.myButton)などのgetter:またはsetter:ラベルを前に付けたプロパティ名を渡します。

ドキュメントリンクhere

あなたの質問に答えるために、よくセレクタは実際には迅速な機能ではなく、ココアのクラス間でメッセージを送信する方法です。だから彼らはObjective-Cに基づいているのですが、どうしてそれらの間の互換性を保つ必要があるのですか?

セレクター:

セレクタ オブジェクトに対して実行する方法、又は ソースコードがコンパイルされるときに名前を置き換える固有の識別子を選択するために使用される名前です。セレクタ自体は何もしません。 は単にメソッドを識別します。セレクタをメソッド名がプレーンな文字列と異なるようにするのは、セレクタを一意にすることをコンパイラが にすることだけです。セレクタを有効にするのは、 (ランタイムと連動して)ダイナミック関数 ポインタのように機能し、指定された名前に対して、 が使用されているクラスに適したメソッドの実装を自動的に指示します。

あなたはセレクタhereについての詳細を読むことができます。

しかし、基本的には、ココアが使用する「メッセージング」インターフェイスの一部に過ぎません。

関連する問題