首先,我不确定我真的明白选择器是什么.根据我的理解,它是方法的名称,您可以将其分配给类型为"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:
消息.
你怎么知道什么时候加一个冒号?如果要在调用时添加冒号,则在消息名称中添加冒号,如果它需要一个参数,则会发生冒号.如果它采用零参数(就像这样lowercaseString
),那么就没有冒号.如果它需要多个参数,则必须添加额外的参数名称及其冒号,如compare:options:range:locale:
.
您还可以查看文档并注意是否存在尾部冒号.
选择器是直接在编译代码中引用方法的有效方法 - 编译器实际上是将值赋给SEL.
其他已经覆盖了q的第二部分,最后的':'匹配的签名与您正在寻找的签名不同(在这种情况下签名不存在).
那是因为你想要@selector(lowercaseString)
而不是@selector(lowercaseString:)
.有一个细微的区别:第二个意味着一个参数(注意结尾的冒号),但- [NSString lowercaseString]
不带参数.
在这种情况下,选择器的名称是错误的.这里的冒号是方法签名的一部分; 这意味着该方法采用一个参数.我相信你想要的
SEL sel = @selector(lowercaseString);