在Ruby中,变异方法(即修改self的方法)按照惯例标记为bang(!),以将它们与不修改self的类似命名方法分开。
例如Array#sort
返回一个已排序的数组,但Array#sort!
修改了调用它的数组。
我现在开始研究Swift。我如何命名一种变异方法将它与非变异双胞胎分开?
我知道Python有sorted(list)
vs list.sort()
。这是一个很好的模式,即.sorted()
(非变异)和.sort()
(变异)?
那些不易以这种方式转换的名称,例如String#next
vs String#next!
?
答案 0 :(得分:8)
关于发布官方指南,这里是: https://swift.org/documentation/api-design-guidelines/#name-according-to-side-effects
名称突变/非突变方法对一致。变异方法通常会有一个具有相似语义的非变异变体,但会返回一个新值而不是就地更新实例。
当操作由动词自然描述时,请使用动词对变异方法的命令,并应用“ed”或“ing”后缀来命名其非突变对应物。
Mutating Nonmutating x.sort() z = x.sorted() x.append(y) z = x.appending(y)
更喜欢使用动词的过去participle命名非变异变体(通常附加“ed”):
/// Reverses `self` in-place. mutating func reverse() /// Returns a reversed copy of `self`. func reversed() -> Self ... x.reverse() let y = x.reversed()
当添加“ed”不具有语法性,因为动词具有直接对象时,请使用动词的当前participle命名非变异变体,方法是附加“ing”。
/// Strips all the newlines from `self` mutating func stripNewlines() /// Returns a copy of `self` with all the newlines stripped. func strippingNewlines() -> String ... s.stripNewlines() let oneLine = t.strippingNewlines()
当操作由名词自然描述时,使用名词作为非突变方法,并应用“形式”前缀来命名其变异对应物。
Nonmutating Mutating x = y.union(z) y.formUnion(z) j = c.successor(i) c.formSuccessor(&i)
Ray Wenderlich总结了自己的Swift Style Guide:
动词方法遵循非变异版本的-ed,-ing规则 名词方法遵循非变异版本的formX规则
请注意,在2016年4月18日获得批准后,感谢提案:SE-0059 Dave Abrahams,Update API Naming Guidelines and Rewrite Set APIs Accordingly的官方指南已针对Swift 3进行了更新。
但是在五天前,即2016年4月13日,Erica Sadun在她的文章Stop the Madness and fix the Swift API guidelines中表达了一种不同的观点。让我们补充一点,Erica之前写过她自己的文章Naming Methods and Functions,也可以在她的书 Swift Style 中找到。为了好玩,她试图explain mutating naming with emoji。