我們需要經(jīng)常帶著新問題來重新審視一下以前的代碼規(guī)范。
Kevin 的規(guī)范:“如果尾部的閉包參數(shù)是函數(shù)式的就用圓括號(hào)。如果是程序式的就用花括號(hào)?!?/p>
myCollection.map({blah}).filter({blah}).etc
myCollection.forEach {} // 或者
dispatch_after(when, queue) {}
樣式一致性與閉包是否有返回值相關(guān)。目前存在的爭(zhēng)議是我們是否應(yīng)該在尾部花括號(hào)的左邊留空格。
self
的規(guī)范:“當(dāng)編譯器可以自動(dòng)推斷成員類型時(shí),你就可以在使用隱式成員表達(dá)式時(shí)省略 self
。但無論何時(shí),只要一個(gè)方法調(diào)用會(huì)反射到一個(gè)實(shí)例,就要使用 self
。“
仔細(xì)考慮下面 for
循環(huán)語句中的 where
分支。contains
方法就是在沒有明確對(duì)象的情況下調(diào)用的。那是誰做了 contains
操作呢? 因?yàn)榉椒▍?shù)中沒有傳入容器對(duì)象,所以這個(gè)對(duì)象只能是調(diào)用這個(gè)方法的實(shí)例。
for (flagLessOne, string) in strings.enumerate()
where contains(
Features(rawValue: 1<<(flagLessOne + 1))) {
nameArray.append(string)
}
完全合格的調(diào)用明確指出了原本模糊不清的對(duì)象,同時(shí)極大滴提高了代碼的可讀性:
for (flagLessOne, string) in strings.enumerate()
where self.contains(
Features(rawValue: 1<<(flagLessOne + 1))) {
nameArray.append(string)
}
條件級(jí)聯(lián)綁定的規(guī)范:“除非你做的是 var
和 let
混合的條件綁定,只用一個(gè) 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)鍵字可以讓級(jí)聯(lián)綁定更加簡(jiǎn)潔,而且 Xcode 會(huì)幫你對(duì)這些代碼的格式進(jìn)行很好的調(diào)整:
if let
x = x,
y = y,
z = z {
...blah...
}
盡管級(jí)聯(lián)綁定避免了 pre-Swift 2 中的“鞭尸金字塔“,但它們又導(dǎo)致了“恐怖便秘塊“的問題。這種問題主要出現(xiàn)在下面兩種情況:
guard
語句時(shí)。if let
// 以字典的方式訪問 JSON
json = json as? NSDictionary,
// 檢查結(jié)果數(shù)組
resultsList = json["results"] as? NSArray,
// 提取第一項(xiàng)
results = resultsList.firstObject as? NSDictionary,
// 提取名字和價(jià)格
name = results["trackName"] as? String,
price = results["price"] as? NSNumber {
// ... blah blah ...
}
模式匹配關(guān)鍵字的規(guī)范:“如果都是綁定,那就要把綁定組合起來?!?/p>
通過把關(guān)鍵字移動(dòng)到元組外面的方式來把多模式匹配綁定組合起來。將下面的代碼:
if case (let x?, let y?) = myOptionalTuple {
print(x, y)
}
替換為:
if case let (x?, y?) = myOptionalTuple {
print(x, y)
}
isEmpty
的規(guī)范:“如果你在檢測(cè)一個(gè)集合元素的個(gè)數(shù),你可能就是在犯錯(cuò)。”用 isEmpty
替換 count == 0
。
void
的規(guī)范:“使用 void
返回類型,而不是 ()
?!毕旅媸且粋€(gè)返回 -> Void
而不是 -> ()
的方法。
func doThis() -> Void
func notThis() -> ()
!
的規(guī)范:“每當(dāng)你在 Swift 中用驚嘆號(hào)的時(shí)候,一只小貓就會(huì)死?!北M可能的避免使用強(qiáng)制轉(zhuǎn)換和強(qiáng)制解包。
創(chuàng)建集合的規(guī)范:“使用顯式類型和空集合?!鳖愋驮谫x值操作符的左邊,空實(shí)例在賦值操作符的右邊。
把下面的代碼:
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”的冒號(hào)規(guī)范:“右側(cè)加上空格,而左側(cè)不需要?!監(jiān)r no soup for you!
將:
[key: value] // 以及
struct Foo: MyProtocol
替換為:
[key : value]
struct Foo : MyProtocol
從 Objective-C 過來的規(guī)范:
CGPoint(x: 1, y:1)
替代 CGPointMake(1, 1)
-避免使用行尾分號(hào),盡管這樣是可以編譯通過的。它們會(huì)讓你的代碼看起來很糟糕,而且用起來體驗(yàn)也很差。更新
當(dāng)然,這不是說說而已,我已經(jīng)在代碼中進(jìn)行了實(shí)踐:
github 代碼地址
更多建議: