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

Fra*_*gle 15 objective-c

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

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

例:

- (void) sendEmail: (NSString *) toStr
         subject:(NSString *) subjectStr
         body:(NSString *) bodyStr;
Run Code Online (Sandbox Code Playgroud)

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

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

[emailObj sendEmail:@"test@test.com" subject:@"testSub" body:@"this is a test"]
Run Code Online (Sandbox Code Playgroud)

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

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

Yuj*_*uji 14

我猜你在方法声明中认为

-(void) A:(NSObject*)a B:(NSObject*)b C:(NSObject*)c
Run Code Online (Sandbox Code Playgroud)

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

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

 if([obj respondsToSelector:@selector(A:B:C:)]){
     ...
 }
Run Code Online (Sandbox Code Playgroud)

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

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

还需要注意的是,你不能打电话A:B:C:A:C:B:,无论是.

  • 如果你不喜欢它,我不能为你做任何事.这就是Objective-C的生活.您需要告诉Apple中的Objective-C实现者.并且,您应该将那些引用"A"作为方法名称的书籍烧成灰烬.这在技术上是错误的,只是让读者感到困惑.你选错了书. (5认同)

Ada*_*son 12

在大多数情况下,这样的方法通常被命名为在第一个参数上缺少名称是有意义的.在这种情况下,我会期待类似的东西sendEmailTo.


Dav*_*ong 10

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

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

- (void) sendEmailToRecipient:(NSString *)recipient subject:(NSString *)subject body:(NSString *)body;
Run Code Online (Sandbox Code Playgroud)