Objective c 如何确定@选择器是否需要参数?
在这个场景中,我有一个对象,它存储了一个外部@selector,供以后使用。根据设计,我希望能够添加两种选择器。简单的一个没有参数,如Objective c 如何确定@选择器是否需要参数?,objective-c,selector,introspection,Objective C,Selector,Introspection,在这个场景中,我有一个对象,它存储了一个外部@selector,供以后使用。根据设计,我希望能够添加两种选择器。简单的一个没有参数,如[对象添加:@selector(doSomething)],而更复杂的一个只有一个参数,如[对象添加:@selector(doSomething:)](注意冒号)。假设选择器存储在变量SEL mySelector中 在执行过程中,我需要在[另一个对象执行选择器:mySelector]或[另一个对象执行选择器:mySelector with object:userI
[对象添加:@selector(doSomething)]
,而更复杂的一个只有一个参数,如[对象添加:@selector(doSomething:)]
(注意冒号)。假设选择器存储在变量SEL mySelector
中
在执行过程中,我需要在[另一个对象执行选择器:mySelector]
或[另一个对象执行选择器:mySelector with object:userInfo]
之间做出选择
我实现这个决定的方法是提供一个BOOL标志,它冗余地存储性能是否应该有额外的参数。然而,尽管我在文档中找不到这一点,但我觉得我也应该能够向选择器询问一些类似-(BOOL)needsParameter
的问题。例如,我知道UIGestureRecognitor的addTarget:action:以某种方式自动进行了这种区分
有人能给我指一下正确的方向吗?你可以使用
NSMethodSignature
类。比如说,
SEL mySelector = …;
NSMethodSignature *msig = [anotherObject methodSignatureForSelector:mySelector];
if (msig != nil) {
NSUInteger nargs = [msig numberOfArguments];
if (nargs == 2) { // 0 non-hidden arguments
}
else if (nargs == 3) { // 1 non-hidden argument
}
else {
}
}
或者,您可以使用
NSStringFromSelector()
获取mySelector
的字符串表示形式,并计算冒号字符的出现次数。可能重复的重复次数非常多!我今天还学了一个新单词,它叫“arity”:)谢谢尤拉斯!太好了NSMethodSignature
确实是我所需要的,您提供的示例几乎可以立即使用NSMethodSignature
将至少有两个参数,因为self
和@selector
占用参数0和1。将示例更改为if(nargs==2){…}else if(nargs==3){…}else{…}
,它就可以工作了。谢谢别担心,老兄,你帮了我大忙!有时候我希望自己能从文档中提取这种东西,但我想这是经验带来的。。。