Swift 方法中的第一个参数标签
First argument label in Swift method
这些方法中的哪一种遵循 Swift 意识形态?
func addChapter(_ chapter: Chapter)
func add(chapter chapter: Chapter)
func add(_ chapter: Chapter)
我觉得要看情况。
例如,您有 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)
不了解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)
这个解决方案对我来说似乎是最清楚的。
这些方法中的哪一种遵循 Swift 意识形态?
func addChapter(_ chapter: Chapter)
func add(chapter chapter: Chapter)
func add(_ chapter: Chapter)
我觉得要看情况。
例如,您有 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)
不了解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)
这个解决方案对我来说似乎是最清楚的。