我们应该在方法的第一个参数中添加外部参数名吗?为什么?

时间:2016-07-24 00:39:18

标签: swift swift2 naming-conventions

注意:我这里只谈论Swift 2。

我见过两种方法命名约定:

func animateWithDuration(duration: NSTimeInterval, animation: () -> Void)

func animate(withDuration duration: NSTimeInterval, animation: () -> Void)

我听说其中一个更“狡猾”。但我不记得是哪一个。但为什么人们甚至会关心这个呢?这两个约定在调用时看起来几乎相同:

animateWithDuration(10) { ... }

animate(withDuration: 10) { ... }

当你试图大声读出这个方法时,它的字样完全相同:

  

持续时间为10的动画

哪个更开心,为什么?

2 个答案:

答案 0 :(得分:1)

讨论编码风格是多余的,有很多论据支持或反对。有点重要的是,Swift 3 API将使用第二种风格,因此建议将其用于Swift代码。

一些代表第二种风格的论点是它与多个参数更加一致,例如

animate(withDuration: 10, andEffect: .Blend)

另一个论点是它使关键字参数保持一致,例如与init

let a = Animation(withDuration: 10, andEffect: .Blend)

在所有()调用语法之后,首先使用句子样式方法调用并不能很好地发挥作用。使用此(IMO),Smalltalk或ObjC要好得多。

答案 1 :(得分:1)

以前的语法是Swift 2的首选/默认语法,后者是Swift 3的首选/默认语法。

在WWDC 2016的视频Swift API Design Guidelines中,他们描述了他们对Cocoa API中这种旧的,以前的语法的印象:

  

因此,当您将为Objective-C编写的所有这些API未经修改地添加到Swift中时,它们似乎有点不合时宜。他们觉得有点不太快。

因此,根据Apple自己的估计,新语法更加Swifty。

话虽如此,如果你限制自己考虑使用Swift 2.x,你可以轻松地为了保持一致性而坚持使用传统语法。或者(在我看来更引人注目),您可以开始采用新语法,您可以自然地这样做,以简化Swift 3迁移路径。

但我认为它不像“始终包含方法名称中的参数名称”或“不是”那么简单。在Swift 3中有一些情况,我们将定义一个方法,其第一个参数不具有外部参数名称(就像在Swift 2中一样,我们将为第一个参数提供外部名称)。最好让原则in that video(或outlined on the swift.org site)管理您的方法命名实践。