Objective-C方法签名。它们不一致吗?

时间:2010-10-11 15:42:53

标签: objective-c

我是Objective-C的新手,但请在这里帮助我。

我所看到的是Objective-C中采用多个参数的方法签名似乎不一致。

示例:

- (void) sendEmail: (NSString *) toStr
         subject:(NSString *) subjectStr
         body:(NSString *) bodyStr;

好的,所以这里我们有3个“参数”(至少那是我习惯称之为的),但其中2个有“外部”名称(主题,正文),但第一个没有!从一致性/风格的角度来看,这有什么不对吗?

当我们称这种方法时,我们会这样做:

[emailObj sendEmail:@"test@test.com" subject:@"testSub" body:@"this is a test"]

(希望我做得对,记得我是新手。)

因此主题和正文在通话中有明确标记,但不是“到”地址?这对我来说似乎真的很糟糕。为什么第一个参数得到特殊处理?

3 个答案:

答案 0 :(得分:14)

我猜你在方法声明中认为

-(void) A:(NSObject*)a B:(NSObject*)b C:(NSObject*)c

A是方法名称,BC是参数的名称。

在Objective-C中,总体A:B:C:是方法名称(在技术上更称为选择器),并在按名称调用方法时用作单位。例如,

 if([obj respondsToSelector:@selector(A:B:C:)]){
     ...
 }

检查obj是否响应A:B:C:。但在这种情况下,[obj respondsToSelector:@selector(A:)]将为NO

因此,您应该将A:B:C:的整体视为方法名称,A是第一个参数的名称。

另请注意,您也无法将A:B:C:称为A:C:B:

答案 1 :(得分:12)

在大多数情况下,通常会对这样的方法进行命名,以便第一个参数上缺少名称。在这种情况下,我会期待类似sendEmailTo

的内容

答案 2 :(得分:10)

我会说如果你对一个方法的作用感到困惑,那么它可能没有被命名,也可能没有。

鉴于上面的选择器,我希望3个参数是某种电子邮件对象,主题和正文。但是,由于第一个参数不是“电子邮件”对象而是电子邮件的收件人,我可能会将此方法重命名为:

- (void) sendEmailToRecipient:(NSString *)recipient subject:(NSString *)subject body:(NSString *)body;