0

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

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

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

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

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

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

'b' 是匿名参数吗?(如果是这样,不应该在“a”和“:”之间写一个空格来更好地表明这一点吗?)不过,我在 ObjC 文档中找不到任何关于 anon parms 的信息。

如果我将语法更改为为第二个参数命名并相应地修复签名引用,行为是否会有任何变化?我计划进行此更改以消除警告,但我想知道我可能会产生一个我不知道的问题。

4

2 回答 2

2

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

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

在Objective-C 编程语言的第 16 页“消息语法”上, 这被称为“未标记参数”“没有关键字的参数”

当然你也可以改成

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

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

于 2013-04-09T14:07:23.483 回答
2

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

是的,后面应该有一个空格a

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

于 2013-04-09T14:09:01.363 回答