当前位置:  开发笔记 > IOS > 正文

Objective C中的选择器

如何解决《ObjectiveC中的选择器》经验,为你挑选了4个好方法。

首先,我不确定我真的明白选择器是什么.根据我的理解,它是方法的名称,您可以将其分配给类型为"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"...



1> Adam Rosenfi..:

您必须非常小心方法名称.在这种情况下,方法名称只是" lowercaseString"而不是" lowercaseString:"(注意没有冒号).这就是你NO返回的原因,因为NSString对象会响应lowercaseString消息而不是lowercaseString:消息.

你怎么知道什么时候加一个冒号?如果要在调用时添加冒号,则在消息名称中添加冒号,如果它需要一个参数,则会发生冒号.如果它采用零参数(就像这样lowercaseString),那么就没有冒号.如果它需要多个参数,则必须添加额外的参数名称及其冒号,如compare:options:range:locale:.

您还可以查看文档并注意是否存在尾部冒号.



2> dstnbrkr..:

选择器是直接在编译代码中引用方法的有效方法 - 编译器实际上是将值赋给SEL.

其他已经覆盖了q的第二部分,最后的':'匹配的签名与您正在寻找的签名不同(在这种情况下签名不存在).



3> mipadi..:

那是因为你想要@selector(lowercaseString)而不是@selector(lowercaseString:).有一个细微的区别:第二个意味着一个参数(注意结尾的冒号),但- [NSString lowercaseString]不带参数.



4> mkb..:

在这种情况下,选择器的名称是错误的.这里的冒号是方法签名的一部分; 这意味着该方法采用一个参数.我相信你想要的

SEL sel = @selector(lowercaseString);

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有