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

时间:2016-02-18 14:31:01

标签: swift naming-conventions

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

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

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

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

那些不易以这种方式转换的名称,例如String#next vs String#next!

1 个答案:

答案 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 AbrahamsUpdate 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