Objective c 在Objective C中编写方法声明的标准方法是什么?

Objective c 在Objective C中编写方法声明的标准方法是什么?,objective-c,syntax,methods,Objective C,Syntax,Methods,我有一个关于Objective-C中第一个参数的问题 -(NSInteger) totalSeconds:(NSInteger)h minutes:(NSInteger)m seconds:(NSInteger)s; 我注意到,似乎第一个参数经常被“拉入”消息名称本身,而没有被命名 [totalSeconds:9 minutes:59 seconds:59] 这种语法是否可以接受: -(NSInteger) totalSeconds:hours:(NSInteger)h minut

我有一个关于Objective-C中第一个参数的问题

-(NSInteger) totalSeconds:(NSInteger)h minutes:(NSInteger)m seconds:(NSInteger)s;
我注意到,似乎第一个参数经常被“拉入”消息名称本身,而没有被命名

[totalSeconds:9 minutes:59 seconds:59]
这种语法是否可以接受:

    -(NSInteger) totalSeconds:hours:(NSInteger)h 
minutes:(NSInteger)m seconds:(NSInteger)s;

我环顾四周,没有看到过这样的例子,尽管我认为它很常见。

为什么不这样做呢:

-(NSInteger) secondsFromHours:(NSInteger)h minutes:(NSInteger)m seconds:(NSInteger)s
totalSecondsFromHours:minutes:seconds

我可能会给这个方法命名

[totalSecondsWithHours:9 minutes:59 seconds:59]

方法命名的想法是,您应该能够阅读调用,并使其看起来像一个英语句子。

您的特定语法将用作消息声明,但结果将与您预期的不一样

-(NSInteger) totalSeconds:hours:(NSInteger)h 
             minutes:(NSInteger)m seconds:(NSInteger)s;
编译器将看到以下内容:

-(NSInteger) totalSeconds:(id)hours:
             (NSInteger)h
             minutes:(NSInteger)m
             seconds:(NSInteger)s
h
成为
id
参数类型的参数名称,而不是
h
参数的标识符。为了给它打电话,这个电话看起来很时髦:

[self totalSeconds:nil :12 minutes:50 seconds:42];
请注意,您现在必须传递一个对象作为第一个参数(我选择了
nil
),并且
hours
一词不再出现在调用中

我不会以这种方式命名消息。正如在这里所说的,这个想法是你应该能够像读英语句子一样读电话。用一个和他或类似的名字

根据您的评论:


这是我问题的一部分。是吗 标准方式?改名 方法本身就是第一个 参数,而不是标记 第一个参数与其他参数相同

是的,标准是命名消息,使第一个参数“name”成为消息本身的一部分。请理解选择器包含所有这些信息。如上所述,消息的选择器为:

totalSeconds::minutes:seconds
如名称所示,选择器应如下所示:

-(NSInteger) secondsFromHours:(NSInteger)h minutes:(NSInteger)m seconds:(NSInteger)s
totalSecondsFromHours:minutes:seconds
“消息名”不仅是它的第一个组件,而且是参数前面的所有标记

考虑一个名为
totalSeconds
的方法。别紧张,这是一个好办法。有道理,对吧?现在考虑一个名为“代码> ToeStime:< /代码>的方法。这没有多大意义,因为它没有确定论点应该是什么。这就是为什么,您经常看到的不是
foo:
,而是
fooWithBar:
,并且从该模式可以扩展
fooWithBar:baz:hax:

在第一个示例中,方法名称是
totalSeconds:minutes:seconds:
。我认为把它称为秒是一个很好的建议,从小时:分钟:秒:这个:

[totalSeconds:9 minutes:59 seconds:59]
不是有效的消息表达式。Objective-C消息的语法为:

[receiver message]

您在上面所写的内容将尝试向
-:minutes:seconds:
totalSeconds

发送一条消息,或者类似的消息:
-(NSInteger)totalTimeFromHours:(NSInteger)h minutes:(NSInteger)m seconds:(NSInteger)s
。这是我问题的一部分。这是标准方式吗?将方法本身的名称调整为第一个参数,而不是像标记其他参数一样标记第一个参数。方法的默认参数类型为id。在上面的示例中,“小时”将假定为对象。绝对正确,然而,我想我们都认为他是想在
totalSeconds
之前拥有一个接收器。这可能不是一个有效的假设,但似乎是基于此处的其他活动: