Swift方法中的第一个参数标签

时间:2017-04-18 07:21:07

标签: swift signature method-signature

这些方法中的哪一种遵循Swift意识形态?

  • func addChapter(_ chapter: Chapter)
  • func add(chapter chapter: Chapter)
  • func add(_ chapter: Chapter)

4 个答案:

答案 0 :(得分:1)

API Design guidelines开始,第一个似乎是正确的:

// Clear
func addChapter(_ chapter: Chapter)
variable.addChapter(x)

// Not clear
func add(chapter chapter: Chapter)
variable.add(chapter: x)

// Not clear
func add(_ chapter: Chapter)
variable.add(x)

注意:在Sulthan的评论之后改变了答案,请参考他的回答。

答案 1 :(得分:1)

TLDR:

根据chapter信息对于区分其他方法/含义是否重要,您应该使用第一个或第三个选项。不是第二种选择。

  

包括所有需要避免歧义的人所需的所有单词,以便阅读使用该名称的代码。

  

...,如果第一个参数构成语法短语的一部分,则省略其标签,将任何前面的单词附加到基本名称,例如x.addSubview(y)

(来自API Design Guidelines

在不知道课程的情况下,这不容易决定。

让我们考虑这是一个类:

class Book {
    var chapters: [Chapter]
    var pages: [Page]
    var metadata: [MetaData]
}

如果您查看Swift Evolution 0005关于导入Obj-C方法的方法,您可以了解导入方法[UIView addGestureRecognizer:]的首选方法是addGestureRecognizer(_:UIGestureRecognizer)

请注意理由:

  

如果我们放弃GestureRecognizer,只留下添加,我们最终会得到一个概念上修改gestureRecognizers属性但使用过于通用名称的方法。

这就是为什么有一条规则

  

永远不要从与封闭类的属性匹配的方法的基本名称修剪后缀:

您的第一个选择是正确的解决方案。

另一方面,如果您的班级有以下形式:

class Chapters {
   private var chapters: [Chapter]
}

(例如,类似阵列的容器)

然后add(_:)是正确的解决方案。

永远不要使用第二个选项add(chapter:)

答案 2 :(得分:0)

我认为这取决于具体情况。

例如,您有User struct。

struct User {
    static func add(with userId: String) {
        // ...
    }

    static func addFollower(for userId: String, _ followerId: String) {
        // ...
    }
}

当你使用它时:

User.add(with: newUserId) // Like sentense: User add with new user Id

User.addFollower(for: currentUserId, followerId) // Like sentense: User add follower for current user Id 

希望有所帮助

答案 3 :(得分:0)

就个人而言,我会选择

func add(chapter: Chapter)

这个解决方案似乎对我来说最清楚。