1. ホーム
  2. objective-c

[解決済み] Objective-Cのセレクタ?

2022-08-06 22:16:17

質問

まず、セレクタが何なのかよくわかりません。 私の理解では、それはメソッドの名前で、それを「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"を返すようにできない......。

どのように解決するのですか?

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

コロンを付けるタイミングはどうすればいいのでしょうか? メッセージの名前にコロンをつけるのは、メッセージの呼び出し時にコロンをつける場合、つまり引数を1つ取る場合です。 引数をひとつしか取らない場合はそうなります。 lowercaseString のように)、コロンはありません。 複数の引数を取る場合は、次のように余分な引数名とコロンを追加しなければなりません。 compare:options:range:locale: .

また のドキュメントを参照してください。 を見て、末尾のコロンの有無に注意してください。