目标C中的select器
首先,我不确定我真的明白select器是什么。 根据我的理解,这是一个方法的名称,您可以将其分配给types为“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'条件返回“是”…
你必须非常小心的方法名称。 在这种情况下,方法名称只是“ lowercaseString
”,而不是“ lowercaseString:
”(注意不存在冒号)。 这就是为什么你NO
返回,因为NSString
对象响应lowercaseString
消息,但不是lowercaseString:
消息。
你怎么知道什么时候添加冒号? 如果在调用时添加冒号,则冒号添加冒号到消息名称,如果冒号只有一个参数,则会发生冒号。 如果它的参数为零(与lowercaseString
),那么就没有冒号。 如果需要多个参数,则必须添加额外的参数名称以及冒号,如compare:options:range:locale:
您也可以查看文档并注意是否存在尾部冒号。
那是因为你需要@selector(lowercaseString)
,而不是@selector(lowercaseString:)
。 有一个微妙的区别:第二个意味着一个参数(注意冒号在最后),但是- [NSString lowercaseString]
不带参数。
select器是在编译代码中直接引用方法的有效方式 – 编译器实际上是将值赋给SEL的。
其他已经涵盖了你的q的第二部分,':'在最后匹配一个不同于你正在寻找的签名(在这种情况下,该签名不存在)。
在这种情况下,select器的名称是错误的。 这里的冒号是方法签名的一部分。 这意味着该方法只有一个参数。 我相信你想要的
SEL sel = @selector(lowercaseString);
NSString的方法是lowercaseString
(0个参数),而不是lowercaseString:
(1个参数)。
不要把冒号看作是函数名的一部分,把它看作是一个分隔符,如果你没有任何东西可以分开(没有用函数的值),那么你就不需要它了。
我不知道为什么,但所有这些OO的东西似乎是外国的苹果开发商。 我强烈build议你抓住Visual Studio Express并且玩弄它。 不是因为一个人比另一个人好,只是看devise问题和思考方式的好方法。
喜欢
introspection = reflection + before functions/properties = static - = instance level
以不同的方式来看待问题总是很好的,编程是最终的难题。
根据我对Apple文档的理解,select器代表了您要调用的方法的名称。 关于select器的好处是你可以在被调用的确切方法变化的情况下使用它们。 作为一个简单的例子,你可以做这样的事情:
SEL selec; if (a == b) { selec = @selector(method1) } else { selec = @selector(method2) }; [self performSelector:selec];