Selector
概要
Selector とは、簡単にいうと ランタイムに利用するメソッドの識別子 である。実行するメソッドをランタイムに 選択 (select) する ための名前であり、ソースコードのコンパイル後にメソッドの識別用に利用される識別子、あるいはコンパイル後のメソッドの内部表現とも捉えられる 主に、関数ポインタのように、動的にメソッドを特定したいケースや、Swift から Objective-C のメソッドを利用したいケース (Target-Action パターンの利用など) で利用する 使い方
Objective-C では、@selector という Objective-C のコンパイラディレクティブが利用できる
Swift だと #selector という Expression が利用できる (Swift 2 くらいだと @selector がまだ使えた気がする) code:swift
func perform(_ aSelector: Selector!) -> Unmanaged<AnyObject>!
code:objc
- (id)performSelector:(SEL)aSelector;
これは、Swift においてドット記法でメソッドを呼び出すのと同じ。例えば、以下は全く同一。
code:swift
let aClone = anObject.copy()
let aClone = anObject.perform(#selector(MyObject.copy)).takeRetainedValue()
perform(_:) メソッドは、送信するメッセージが実行時まで決まらない 場合に利用できる。しかし、戻り値がコンパイル時に保障されないというリスクがある。 コンパイラによって生成される Selector は、クラスのロード時にランタイムによって自動的にマッピングされる code:swift
func sel_registerName(_ str: UnsafePointer<Int8>) -> Selector
code:objc
SEL sel_registerName(const char *str);
Objective-C のメソッド呼び出しについてもっと知りたい場合には以下が参考になりそう