我遇到了别人的代码,声明了这样的方法:
- (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的任何内容。
如果我将语法更改为为第二个参数指定名称并相应地修复签名引用,行为是否会有任何变化?我打算做出这个改变以摆脱警告,但我想我可能会创建一个我不知道的问题。
答案 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->重命名功能,只需在第二个:
之前插入一些文本。它将更新所有引用,您应该没有遇到任何问题。