【问题标题】:What is the standard way to write a method declaration in Objective C?在 Objective C 中编写方法声明的标准方法是什么?
【发布时间】:2010-12-30 12:46:12
【问题描述】:

我对 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;

我环顾四周并没有看到这样的例子,尽管我预计它会很常见。

【问题讨论】:

    标签: objective-c syntax methods


    【解决方案1】:

    您的特定语法将用作消息声明,但结果将不是是您所期望的。

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

    编译器将看到的方式如下:

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

    hours 成为id 参数类型的参数名称,而不是h 参数的标识符。为了调用它,调用结果看起来非常时髦:

    [self totalSeconds:nil :12 minutes:50 seconds:42];
    

    请注意,您现在必须传递一个对象作为第一个参数(我选择了nil),并且单词hours 不再出现在调用中。

    我不会以这种方式命名消息。正如Rudedog 在这里所说,这个想法是您应该能够像阅读英文句子一样阅读电话。使用与他或Nick Veys'相似的名字。

    来自您的评论:

    这是我的问题的一部分。就是它 标准方式?为了适应名称 方法本身到第一个 参数而不是标记 第一个参数和其他参数一样。

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

    totalSeconds::minutes:seconds
    

    正如命名更好,选择器应该是这样的:

    totalSecondsFromHours:minutes:seconds
    

    【讨论】:

    • 方法参数的默认类型是id。在上面的示例中,“小时”将被假定为一个对象。
    【解决方案2】:

    我可能会命名该方法

    [totalSecondsWithHours:9 minutes:59 seconds:59]
    

    方法命名的想法是你应该能够阅读调用并让它看起来像一个英文句子。

    【讨论】:

      【解决方案3】:

      为什么不这样:

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

      【讨论】:

      • 或类似:- (NSInteger)totalTimeFromHours:(NSInteger)h minutes:(NSInteger)m seconds:(NSInteger)s.
      • 这是我的问题的一部分。这是标准的方式吗?使方法本身的名称适应第一个参数,而不是像其他参数那样标记第一个参数。
      【解决方案4】:

      “消息名称”不仅是它的第一个组成部分,而且是参数前面的所有标记。

      考虑一个名为totalSeconds 的方法。很简单,它是一个吸气剂。有道理,对吧?现在考虑一个名为totalSeconds: 的方法。这没有多大意义,因为它没有确定论点应该是什么。这就是为什么您经常看到fooWithBar: 而不是foo:,并且您可以从该模式扩展fooWithBar:baz:hax:

      在您的第一个示例中,方法名称是totalSeconds:minutes:seconds:。我认为将其命名为secondsFromHours:minutes:seconds: 是一个不错的建议。

      【讨论】:

        【解决方案5】:

        这个:

        [totalSeconds:9 minutes:59 seconds:59]
        

        不是有效的消息表达式。 Objective-C 消息的语法是:

        [receiver message]
        

        您在上面写的内容将尝试向totalSeconds 发送-:minutes:seconds: 消息

        【讨论】:

        • 绝对正确,但我想我们都认为他打算在totalSeconds 之前有一个接收器。这可能不是一个有效的假设,但似乎是基于这里的其余活动。 :)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-05
        • 2012-06-16
        • 2013-07-10
        • 1970-01-01
        • 2012-10-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多