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

First argument label in Swift method

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

我觉得要看情况。

例如,您有 User 结构。

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 

希望对您有所帮助

来自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的评论后修改了答案,请参考他的回答。

TLDR:

根据 chapter 信息是否重要以区别于其他 methods/meanings,您应该使用第一个或第三个选项。不是第二个选项。

Include all the words needed to avoid ambiguity for a person reading code where the name is used.

..., if the first argument forms part of a grammatical phrase, omit its label, appending any preceding words to the base name, e.g. x.addSubview(y)

(来自 API Design Guidelines


不了解class就没那么容易决定了。

我们假设这是一个 class:

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

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

注意理由:

If we were to drop GestureRecognizer, leaving just add, we end up with a method that conceptually modifies the gestureRecognizers property but uses an overly generic name to do so.

所以有规则

Never prune a suffix from the base name of a method that matches a property of the enclosing class:

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

另一方面,如果您的 class 具有以下形式:

class Chapters {
   private var chapters: [Chapter]
}

(例如,类似数组的容器)

那么add(_:)就是正确的解法

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

我个人会选择

func add(chapter: Chapter)

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