代码之家  ›  专栏  ›  技术社区  ›  Gazzer

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

  •  2
  • Gazzer  · 技术社区  · 16 年前

    我有一个关于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;
    

    我环顾四周,没有看到这样的例子,尽管我希望它是常见的。

    5 回复  |  直到 16 年前
        1
  •  9
  •   Community Mohan Dere    9 年前

    您的特定语法将作为消息声明工作,但结果将 做你所期望的。

    -(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 )和这个词 小时 已不在通话中。

    我不会用这种方式命名信息。AS Rudedog 这里已经说过了,你应该能像读英语句子一样读懂电话。使用与他或类似的名称 Nick Veys '的。

    从您的评论:

    这是我问题的一部分。那是 标准方法?以适应 方法本身到第一个 参数而不是标记 第一个参数和其他参数一样。

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

    totalSeconds::minutes:seconds
    

    顾名思义,选择器应该如下所示:

    totalSecondsFromHours:minutes:seconds
    
        2
  •  5
  •   Rudedog    16 年前

    我可能会说出那个方法

    [totalSecondsWithHours:9 minutes:59 seconds:59]
    

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

        3
  •  4
  •   John Rudy    16 年前

    为什么不这样:

    -(NSInteger) secondsFromHours:(NSInteger)h minutes:(NSInteger)m seconds:(NSInteger)s
    
        4
  •  4
  •   easeout    16 年前

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

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

    在第一个示例中,方法名是 totalSeconds:minutes:seconds: . 我认为这是个好建议 secondsFromHours:minutes:seconds: .

        5
  •  2
  •   NSResponder    16 年前

    这是:

    [totalSeconds:9 minutes:59 seconds:59]
    

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

    [receiver message]
    

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