编译器如何处理Objective-C中缺少的参数名称?

时间:2013-04-09 14:02:09

标签: objective-c selector

我遇到了别人的代码,声明了这样的方法:

- (void) method:(id)a:(NSString*)b { }

编译器接受此代码,只发出警告:

'a' used as the name of the previous parameter rather than as part of the selector

代码使用此类型声明各种函数,然后使用签名“methodname ::”通过NSSelectorFromString调用它们。所以这一切都是一致的。

我想知道这种方法签名是否只是一个错误,或者它是否还有更多。由于它在代码中使用一致,我不认为这是一个错字。我不知道作者,所以我不知道这是天才的代码还是相反。

'b'是匿名参数吗? (如果是这样的话,不应该在“a”和“:”之间用空格来表示这更好吗?)但是我在ObjC文档中找不到关于anon parms的任何内容。

如果我将语法更改为为第二个参数指定名称并相应地修复签名引用,行为是否会有任何变化?我打算做出这个改变以摆脱警告,但我想我可能会创建一个我不知道的问题。

2 个答案:

答案 0 :(得分:2)

可以使用签名method::,即使大多数人不推荐这样做。 只需在每个:分隔参数之前插入一个空格字符,编译器就会很高兴:

- (void) method:(id)a :(NSString*)b

第16页The Objective-C Programming Language的“消息语法” 这称为“未标记的参数”,或者没有关键字“的”参数。

当然你可以把它改成

- (void) method:(id)a withB:(NSString*)b

但这会将选择器更改为method:withB:

答案 1 :(得分:2)

你描述的一切都非常正确。这是非常糟糕的风格,但从技术上讲,它只是一个双参数选择器,恰好在第二个:之前没有文本。我不会将b称为匿名参数,因为您仍然可以为其命名,它只是在它之前没有任何描述性文本作为选择器名称的一部分。

是的,a之后可能应该有一个空格。

如果要重命名,可以使用Xcode的标准Refactor->重命名功能,只需在第二个:之前插入一些文本。它将更新所有引用,您应该没有遇到任何问题。