Objective-Cのセレクター?


122

最初に、セレクターが何であるかを本当に理解しているのかわかりません。私の理解では、これはメソッドの名前であり、タイプ「SEL」のクラスに割り当ててから、respondToSelectorなどのメソッドを実行して、レシーバーがそのメソッドを実装しているかどうかを確認できます。誰かがより良い説明を提供できますか?

次に、この時点で、次のコードがあります。

NSString *thing = @"Hello, this is Craig";

SEL sel = @selector(lowercaseString:);
NSString *lower = (([thing respondsToSelector:sel]) ? @"YES" : @"NO");
NSLog (@"Responds to lowercaseString: %@", lower);
if ([thing respondsToSelector:sel]) //(lower == @"YES")
    NSLog(@"lowercaseString is: %@", [thing lowercaseString]);

ただし、thing明らかにNSStringの一種であり、lowercaseStringに応答する必要がありますが、「respondsToSelector」条件付きで「YES」を返すことができません...


あなたは、アップルの開発者向けサイトでセレクタの説明を読みたい:セレクタ
lothar 2009

14
スタンフォードコースCS193P課題1B?ここでもまったく同じ質問があります。:)
Corstian Boerman 2013

回答:


181

メソッド名には十分注意する必要があります。この場合、メソッド名は " lowercaseString"ではなく " lowercaseString:"です(コロンがないことに注意してください)。あなたがしている取得する理由ですNOので、返されたNSStringオブジェクトへの応答lowercaseStringメッセージではなく、lowercaseString:メッセージ。

コロンを追加するタイミングはどのようにしてわかりますか?呼び出し時にコロンを追加する場合は、メッセージ名にコロンを追加します。これは、引数を1つ取る場合に発生します。引数がゼロの場合(の場合と同様lowercaseString)、コロンはありません。複数の引数を取る場合は、のように、コロンとともにコロンに追加の引数名を追加する必要がありますcompare:options:range:locale:

また、ドキュメントを見て、末尾のコロンの有無を確認することもできます。


12

セレクターは、コンパイルされたコードで直接メソッドを参照する効率的な方法です。コンパイラーが実際に値をSELに割り当てます。

他の人はすでにqの2番目の部分をカバーしています。最後の「:」は、探しているものとは異なる署名に一致します(この場合、その署名は存在しません)。


10

それはあなたが望む@selector(lowercaseString)からではなく、@selector(lowercaseString:)です。微妙な違いがあります。2番目のものはパラメーターを意味します(最後のコロンに注意してください)が- [NSString lowercaseString]、パラメーターを取りません。


5

この場合、セレクターの名前が間違っています。ここのコロンはメソッドシグネチャの一部です。これは、メソッドが1つの引数を取ることを意味します。私はあなたが望んでいると信じています

SEL sel = @selector(lowercaseString);


1

コロンを関数名の一部として考えないでください。区切り文字として考えてください。分離するものがない場合(関数に使用する値がない場合)、それは必要ありません。

なぜなのかはわかりませんが、このOOのすべてがApple開発者にとっては外国のものであるようです。Visual Studio Expressを入手して、それをいじることを強くお勧めします。どちらかが他よりも優れているからではなく、デザインの問題や考え方を検討するための良い方法です。

お気に入り

introspection = reflection
+ before functions/properties = static
- = instance level

さまざまな方法で問題を検討することは常に良いことであり、プログラミングは究極のパズルです。


0

Appleのドキュメントについての私の理解から、セレクターは呼び出すメソッドの名前を表します。セレクターの良い点は、呼び出されるメソッドが正確に異なる場合にセレクターを使用できることです。簡単な例として、次のようなことができます。

SEL selec;
if (a == b) {
selec = @selector(method1)
}
else
{
selec = @selector(method2)
};
[self performSelector:selec];

0

アップルのドキュメントに従って:https : //developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html

セレクタは、オブジェクトに対して実行するメソッドを選択するために使用される名前、またはソースコードがコンパイルされるときに名前を置き換える一意の識別子です。セレクタ自体は何もしません。メソッドを識別するだけです。セレクターメソッド名がプレーンな文字列と異なるのは、コンパイラーがセレクターが一意であることを確認することだけです。セレクターが便利なのは、(ランタイムと組み合わせて)動的関数ポインターのように機能し、指定された名前に対して、使用するクラスに適したメソッドの実装を自動的にポイントすることです。メソッド実行のセレクター、およびクラスDog、Athlete、およびComputerSimulation(それぞれがメソッド実行を実装した)があるとします。

例:(lldb)breakpoint --set selector viewDidLoad

これにより、アプリのすべてのviewDidLoad実装にブレークポイントが設定されます。したがって、selectorはメソッドのグローバル識別子の一種です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.