首先,我不确定我是否真的理解选择器是什么。据我了解,它是一个方法的名称,您可以将它分配给一个类型为“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,并且应该响应小写字符串,但我无法让 'respondsToSelector' 条件返回“YES”...
最佳答案
您必须非常小心方法名称。在这种情况下,方法名称只是“lowercaseString
”,而不是“lowercaseString:
”(注意没有冒号)。这就是返回 NO
的原因,因为 NSString
对象响应 lowercaseString
消息而不是 lowercaseString:
消息。
您如何知道何时添加冒号?如果您在调用它时添加一个冒号,则在消息名称中添加一个冒号,如果它接受一个参数就会发生这种情况。如果它接受零个参数(如 lowercaseString
的情况),则没有冒号。如果它需要多个参数,则必须添加额外的参数名称及其冒号,如 compare:options:range:locale:
。
您也可以查看documentation并注意是否存在尾随冒号。
https://stackoverflow.com/questions/738622/