在Swift中改变函数的命名约定

d.b*_*erg 9 naming-conventions swift

在Ruby中,变体方法(即修改self的方法)按照惯例标记为bang(!),以将它们与不修改self的类似命名方法分开.

例如,Array#sort返回一个已排序的数组,但Array#sort!会修改调用它的数组.

我现在开始研究Swift.我如何命名一种变异方法将它与非变异双胞胎分开?

我知道,Python有sorted(list)VS list.sort().这是一个好的模式,即.sorted()(非变异)和.sort()(变异)?

那些不容易以这种方式转变的名字怎么样,比如String#nextvs String#next!?

Cœu*_*œur 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)
    
    Run Code Online (Sandbox Code Playgroud)

    喜欢用动词的过去来命名nonmutating变形词(通常是追加"ED"):

    /// Reverses `self` in-place.
    mutating func reverse()
    
    /// Returns a reversed copy of `self`.
    func reversed() -> Self
    ...
    x.reverse()
    let y = x.reversed()
    
    Run Code Online (Sandbox Code Playgroud)

    当加入"ED"是不是语法,因为动词有直接的对象,用动词的现在命名nonmutating变异词,通过附加"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()
    
    Run Code Online (Sandbox Code Playgroud)
  • 当操作由名词自然描述时,使用名词作为非突变方法,并应用"形式"前缀来命名其变异对应物.

    Nonmutating         Mutating
    x = y.union(z)      y.formUnion(z)
    j = c.successor(i)  c.formSuccessor(&i)
    
    Run Code Online (Sandbox Code Playgroud)

Ray Wenderlich在自己的Swift风格指南中总结了这一点:

动词方法遵循非变异版本的-ed,-ing规则
名词方法遵循非变异版本的formX规则

请注意,根据提案:Dave Abrahams的 SE-0059 ,更新API命名指南和重写集API,官方指南已针对Swift 3进行了更新.因此,在2016年4月18日获得批准后.

但是在五天前,即2016年4月13日,Erica Sadun在她的文章" 停止疯狂"和修复Swift API指南中表达了一些不同的观点.让我们补充一点,埃里卡以前写过她自己的文章,命名方法和函数,也可以在她的书Swift Style中找到.为了好玩,她试图用表情符号解释变异命名.