這是 Linkedin Swift 的代碼規范,我挑出了我懂的地方進行翻譯。
原文
代碼格式
- 一個 tab 四行
- 一行別超過 160 個字符
- 確保每個文件的末尾都有換行符
- 確保任何地方的尾部沒有空格
- 不要另起一行放開口括號
- 當在聲明一個屬性,常量,字典的 key ,函數參數,或者遵循一個協議,繼承某個父類,冒號前面別加空格
- 一般來說,逗號后面要有一個空格符
- 二元操作符前后應該有空格,但是 ( 后面和 ) 前面不應該有空格
- 遵循 Xcode 的對齊方式。當聲明一個跨越多行的函數的時候,最好用 Xcode 7.3 的對齊方式
- 當在調用一個有許多參數的函數的時候,每個參數一行并加額外的縮進
- 當在處理一個大的,大到你必須要分行寫這個數組或者字典的時候,[] 的寫法應該跟 () 在 if 語句中的寫法一樣
- 盡量避免多行的謂詞
命名
- 不要使用 OC 式的前綴
- 類型名開頭大寫
- 其他的一般開頭小寫
- 當在處理縮略詞或者全大寫的名詞,一般來說在代碼中還是全大寫,除非這個詞你要放在開頭,這樣你每個字母都小寫
- 所有的常量除了單例對象都應該是 static。所有的 static 的 constants 應該放在 enum 的容器內。enum 的命名必須是單數形式的,并且命名可以很明顯的讓人看出這是一個常量的容器。如果取不出一個好名字,就在名字后面加上 Constant.
- 命名不要使用縮略名
- 當變量或者常量的命名不能容易的看出類型信息的時候,加上類型信息
代碼風格
- 盡量使用 let 而不是 var
- 盡量使用 map, filter, reduce 的組合
- 如果常量或者變量可以被編譯器推斷出類型,就不要寫類型名
- 如果想一個函數返回多個值,盡量使用 tuple 而不是使用 inout 參數,并且最好使用帶 labeled tuple。如果使用某一 tuple 多次,考慮使用 typelias。如果返回的 tuple 包含3個或者3個以上的值,考慮用 struct 或者 類
- 調用類方法,帶上類名
- 當在寫 methods 的時候,隨時想著這個method 是否會被重寫,如果不會 mark final。final methods 可以縮短編譯的時間
- 當在聲明函數和屬性的時候,盡量用 static 而不是 class,因為用 static 聲明的無法被重寫,但是如果你想在子類重寫你的 type property 或者 type function 考慮用 protocol
- 如果你的函數不需要參數,沒什么副作用,只是用來返回一些的值的,最好用計算屬性替代
修飾符訪問
- access modifier keyword 寫在最前面
- 盡量用 private 而不是 fileprivate
自定義操作符
- 最好用函數替代自定義操作符
Switch 語句和 enum
- 在使用 switch 語句的時候,如果所有的可能性是可以枚舉完的,不要使用 default 語句,unuse case 用 break
- 如果你的 default 不應該被 reach 到,你應該 throw 一個 error
可選值
- 只有在 @IBOutlet 情況下才使用 ! 隱式解包
- 不要使用 as! or try!
- 不要使用 unowned
- 當對一個可選值解包的時候,盡量用同樣的名字
協議
- 當實現協議的時候,用 //MARK:: 或者 extension
屬性
- willSet/didSet 就使用默認的 newValue 和 oldvalue 就好了
閉包
- 如果閉包參數很明顯,省略類型名是OK的,但是你寫出來也沒問題,可讀性是最重要的
- 如果一個參數類型是一個閉包,除非有必要,該類型不需要用括號擴起來
數組
- 一般情況,避免直接通過數組下標去訪問數組元素
- 不要使用 += or + 操作符來操作數組,使用 .append() 或者 .append(contentsOf:),因為后者有更好的性能, 像這種
let myNewArray = arr1 + arr2
可以用let myNewArray = [arr1, arr2].joined()
錯誤處理
- 一般來說,如果一個方法可能會失敗,使用可選值會使得錯誤不那么明顯,那就用 try catch 吧。提供了一種自定義錯誤的構造
struct Error: Swift.Error {
public let file: StaticString
public let function: StaticString
public let line: UInt
public let message: String
public init(message: String, file: StaticString = #file, function: StaticString = #function, line: UInt = #line) {
self.file = file
self.function = function
self.line = line
self.message = message
}
}
使用 guard 語句
- 我們采用遇到錯誤盡早退出的原則,在選擇 if 還是 guard 的時候,最重要的是代碼的可讀性和減少 if - else 嵌套
文檔/Comments
- 如果一個 function 的事件復雜度大于 O(1),你應該增加一個 doc comment。如果代碼里加了一些非常 tricky 的技巧,應該記錄在文檔內。復雜的類,結構體,協議,枚舉,屬性都要寫文檔
- 看 Swift 的 Markup Comment Markup 鏈接