我有一个数组,其中包含一个函数的名称和一个参数,看起来像这样。
(
[0] => (
[0] => @"getName"
[1] => @"This is the name"
)
)
对于我的方法,它看起来像这样
-(NSString *)getName:(NSString *)name {...}
我知道要触发一个方法,我必须执行[[AppDelegate alloc] getName:string];
,但是否有任何方法将getName
替换为array[0][0]
和string
替换为array[0][1]
?
因为你需要传入参数并获得返回值,所以使用NSInvocation。更多细节在这里NSInvocation for Dummies?
对于NSInvocation
的set Selector,可以将选择器设置为NSSelectorFromString(array[0][0]);
参数和返回值也类似。
你在这里做的事情有点危险。无论如何,你可以通过使用选择器来实现这一点。
对象采用一种协议,该协议告诉它们是否可以执行某些操作。所以基本上,你必须首先从数组中获取函数的字符串和参数。
然后使用允许在运行时调用的函数来创建选择器。
SEL aSelector = NSSelectorFromString(@"methodName");
然后,询问你的对象是否可以执行选择器(如果你只是盲目地发送它,可能会发生不好的事情)
- (BOOL)respondsToSelector:(SEL)aSelector
最后你可以用你之前得到的对象(这是参数)执行选择器。
- (id)performSelector:(SEL)aSelector withObject:(id)anObject
查看选择器:https://developer.apple.com/library/ios/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html
对象协议:https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Protocols/NSObject_Protocol/Reference/NSObject.html//apple_ref/occ intfm/NSObject/respondstoselectorismemberofclass:
编辑:正如danh提到的,选择器名称后面有一个冒号是很重要的,因为你的方法接受一个参数。如果没有传递参数,就不需要它。
以来- (id)doSomething;
与
不同- (id)doSomething:(id)argument;
这是@Chiquis想法的一个工作示例。(注意你的选择器需要一个冒号):
-(void)doSomethingALittleDangerous
NSArray *array = @[@[@"getName", @"this is the name"]];
NSString *notQuiteTheSelectorStr = array[0][0];
NSString *selectorStr = [notQuiteTheSelectorStr stringByAppendingString:@":"];
SEL selector = NSSelectorFromString(selectorStr);
// this generates a warning because the compiler cannot confirm that
// self implements this programmatically derived selector
if ([self respondsToSelector:selector]) {
NSString *name = [self performSelector:selector withObject:array];
}
NSLog(@"%@", name);
}
- (NSString *)getName:(NSArray *)array {
return array[0][1];
}