在Objective-C方法中,可以使用关键字_cmd
获取方法的选择器。对于参数的名称是否存在这样的事情?
例如,如果我有一个声明的方法:
- (void)methodWithAnArgument:(id)foo {
...
}
是否有某种构造允许我访问某种类似字符串的变量名表示?也就是说,不是foo的值,而是在方法内的局部变量中实际反映变量名“foo”的东西。
此信息似乎不存储在NSInvocation
或其任何相关类(NSMethodSignature
等)中,所以我不乐观这可以使用Apple的框架或运行时来完成。我怀疑它可能有某种编译时宏,但我不熟悉C宏,所以我不知道从哪里开始。
编辑以包含有关我实际尝试的更多信息。
我正在构建一个工具,以帮助您更轻松地使用第三方URL方案。我希望我的API看起来有两个方面:
作为URL方案的使用者,我可以调用类似[twitterHandler showUserWithScreenName:@"someTwitterHandle"];
作为具有网址方案的应用的创建者,我可以在plist字典中定义我的网址,其键值对看起来像@"showUserWithScreenName": @"twitter://user?screenName={screenName}"
。
我现在正在努力寻找将这些粘合在一起的最佳方法。 showUserWithScreenName:
当前功能齐全的实现看起来像这样:
- (void)showUserWithScreenName:(NSString *)screenName {
[self performCommand:NSStringFromSelector(_cmd) withArguments:@{@"screenName": screenName}];
}
其中performCommand:withArguments:
是一种方法(除了其他一些逻辑)在plist中查找命令键(在本例中为“showUserWithScreenName:”)并使用传递的字典作为值将值作为模板进行评估绑定。
我正在尝试解决的问题:有许多这样的方法看起来完全相同,但只是换掉字典定义以包含正确的模板参数。在每种情况下,所需的字典键是参数的名称。我正试图找到一种方法来最小化我的样板。
在实践中,我认为我会接受需要一些样板,但我可能会因为NSDictionaryOfVariableBindings
而使它变得更加清洁(感谢@CodaFi - 我不是熟悉那个宏!)。为了论证,我很好奇是否有可能使用像forwardInvocation:
这样的东西完全元编程,据我所知,这需要一些方法来访问参数名称。
答案 0 :(得分:0)
从componentsSeparatedByString:
获取字符串后,可以将:
与NSStringFromSelector(_cmd)
一起使用,并使用@selector
的参数名称将参数放入正确的顺序。
您还可以查看此post,它描述了Objective C中的方法命名约定