幾個 Swift 代碼規(guī)范

作者:Erica Sadun,原文鏈接,原文日期:2015-11-17
譯者:mmoaay;校對:lfb_CD;定稿:shanks

我們需要經(jīng)常帶著新問題來重新審視一下以前的代碼規(guī)范。

Kevin 提供的一套規(guī)范:“如果尾部的閉包參數(shù)是函數(shù)式的就用圓括號。如果是程序式的就用花括號?!?/p>

myCollection.map({blah}).filter({blah}).etc
myCollection.forEach {} // 或者 
dispatch_after(when, queue) {}

樣式一致性與閉包是否有返回值相關(guān)。目前存在的爭議是我們是否應(yīng)該在尾部花括號的左邊留空格。

self 的使用規(guī)范:“當(dāng)編譯器可以自動推斷成員類型時,你就可以在使用隱式成員表達式時省略 self。但無論何時,只要一個方法調(diào)用會反射到一個實例,就要使用 self?!?/p>

仔細考慮下面 for 循環(huán)語句中的 where 分支。contains 方法就是在沒有明確對象的情況下調(diào)用的。那是誰做了 contains 操作呢? 因為方法參數(shù)中沒有傳入容器對象,所以這個對象只能是調(diào)用這個方法的實例。

for (flagLessOne, string) in strings.enumerate() 
    where contains(
        Features(rawValue: 1<<(flagLessOne + 1))) {
    nameArray.append(string)
}

完全合格的調(diào)用明確指出了原本模糊不清的對象,同時極大滴提高了代碼的可讀性:

for (flagLessOne, string) in strings.enumerate() 
    where self.contains(
        Features(rawValue: 1<<(flagLessOne + 1))) {
    nameArray.append(string)
}

條件級聯(lián)綁定的規(guī)范:“除非你做的是 varlet 混合的條件綁定,只用一個 if let 或者 if var 就可以了,需要的話可以自由添加空格。“

不要使用下面的方式:

if let x = x, let y = y, let z = z {blah}

使用這種:

if let x = x, y = y, z = z {blah}

省略多余的 let 關(guān)鍵字可以讓級聯(lián)綁定更加簡潔,而且 Xcode 會幫你對這些代碼的格式進行很好的調(diào)整:

if let
    x = x,
    y = y,
    z = z {
    ...blah...
}

盡管級聯(lián)綁定避免了 pre-Swift 2 中的“鞭尸金字塔(pyramids of doom)“,但它們又導(dǎo)致了“恐怖便秘塊(constipated blocks of horror)“的問題。這種問題主要出現(xiàn)在下面兩種情況:

  • 存在大量的串行綁定,再加上空行和注釋時(就像下面的代碼)

  • 使用了一系列 guard 語句時。

    if let
    // 以字典的方式訪問 JSON
    json = json as? NSDictionary,

     // 檢查結(jié)果數(shù)組
     resultsList = json["results"] as? NSArray,
    
     // 提取第一項
     results = resultsList.firstObject as? NSDictionary,
    
     // 提取名字和價格
     name = results["trackName"] as? String, 
     price = results["price"] as? NSNumber {
    
     // ... blah blah ...
    

    }

模式匹配關(guān)鍵字的規(guī)范:“如果都是綁定,那就要把綁定組合起來。”

通過把關(guān)鍵字移動到元組外面的方式來把多模式匹配綁定組合起來。將下面的代碼:

if case (let x?, let y?) = myOptionalTuple {
    print(x, y)
}

替換為:

if case let (x?, y?) = myOptionalTuple {
    print(x, y)
}

isEmpty 的使用規(guī)范:“如果你在檢測一個集合元素的個數(shù),你可能就是在犯錯?!庇?isEmpty 替換 count == 0

void 的使用規(guī)范:“使用 void 返回類型,而不是 ()?!毕旅媸且粋€返回 -> Void 而不是 -> () 的方法。

func doThis() -> Void 
func notThis() -> ()

! 的使用規(guī)范:“每當(dāng)你在 Swift 中用驚嘆號的時候,一只小貓就會死?!北M可能的避免使用強制轉(zhuǎn)換和強制解包。

創(chuàng)建集合的規(guī)范:“使用顯式類型和空集合?!鳖愋驮谫x值操作符的左邊,空實例在賦值操作符的右邊。

把下面的代碼:

var x = [String: Int]() // 以及
var y = [Double]()
var z = Set<String>()
var mySet = MyOptionSet()

替換為:

var x: [String: Int] = [:]
var y: [Double] = []
var z: Set<String> = []
var mySet: MyOptionSet = []

引用

Mike Ash”的冒號規(guī)范:“右側(cè)加上空格,而左側(cè)不需要。”O(jiān)r no soup for you!

應(yīng)該使用:

[key: value] // 以及
struct Foo: MyProtocol

而不是:

[key : value]
struct Foo : MyProtocol

從 Objective-C 過來的規(guī)范

  • 不要在 if 和 switch 條件兩邊或者 return 關(guān)鍵詞上加 Objective-C 樣式的圓括號。
  • 為所有常量使用“駱駝拼寫法”,如 allTheConstants 而不是 ALL_CAPS
  • 用 Swift 的構(gòu)造器替代傳統(tǒng)的,例如:用 CGPoint(x: 1, y:1) 替代 CGPointMake(1, 1)
  • 避免使用行尾分號,盡管這樣是可以編譯通過的。但是它們會讓你的代碼看起來很糟糕,而且用起來體驗也很差。

更新

當(dāng)然,這不是說說而已,我已經(jīng)在代碼中進行了實踐:

這里寫圖片描述
這里寫圖片描述

github 代碼地址

本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán),最新文章請訪問 http://swift.gg

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,026評論 4 61
  • 你說 你個小蠢貨 因為不知道哪個環(huán)節(jié)出了錯 大家要在五號緊張的考期去補上那節(jié)技能實習(xí)課 你說不要說的太多 要去做 ...
    菀卿閱讀 145評論 0 0
  • 自去年三月在F+訂花以來,每個周六,固定的收花日。每次鮮花送來,小朋友總是要來認一認花兒,也陸續(xù)知道了很多不...
    未央_半樹薔薇閱讀 510評論 0 4

友情鏈接更多精彩內(nèi)容