常量
在常量的使用上呻畸,建議盡量使用類型常量碟贾,不要使用宏定義币喧,不如要定義一個常量轨域,推薦這樣寫:
static NSString * const STMProjectName = @"GCDFetchFeed"
而不是這樣寫:
#define STMProjectName @"GCDFetchFeed"
變量
1.變量名應(yīng)該可以明確體現(xiàn)出功能,最好再加上類型做后綴杀餐。這樣也就明確了每個變量都是做什么的干发,而不是把一個變量當(dāng)作不同的值用在不同的地方。
2.在使用之前史翘,需要先對變量做初始化枉长,并且初始化的地方離使用它的地方越近越好。
3.不要濫用全局變量琼讽,盡量少用它來傳遞值必峰,通過參數(shù)傳值可以減少功能模塊間的耦合。
比如钻蹬,下面這段代碼中吼蚁,當(dāng)名字為字符串時,就可以把字符串類型作為后綴加到變量名后面问欠。
let nameString = "Tom"
print("\(nameString)")
nameLabel.text = nameString
屬性
在 iOS 開發(fā)中肝匆,關(guān)于屬性的編碼規(guī)范,需要針對開發(fā)語言做區(qū)分:
- Objective-C 里的屬性顺献,要盡量通過 get 方法來進(jìn)行懶加載术唬,以避免無用的內(nèi)存占用和多余的計算。
- Swift 的計算屬性如果是只讀滚澜,可以省掉 get 子句。示例代碼如下:
var rectangleArea: Double {
return long * wide
}
條件語句
在條件語句中嫁怀,需要考慮到條件語句中可能涉及的所有分支條件设捐,對于每個分支條件都需要考慮到,并進(jìn)行處理塘淑,減少或不使用默認(rèn)處理萝招。特別是使用 Switch 處理枚舉時,不要有 default 分支存捺。
在 iOS 開發(fā)中槐沼,你使用 Swift 語言編寫 Switch 語句時,如果不加 default 分支的話捌治,當(dāng)枚舉有新增值時岗钩,編譯器會提醒你增加分支處理。這樣肖油,就可以有效避免分支漏處理的情況兼吓。
另外,條件語句的嵌套分支不宜過多森枪,可以充分利用 Swift 中的 guard 語法视搏。比如审孽,這一段處理登錄的示例代碼:
if let userName = login.userNameOK {
if let password = login.passwordOK {
// 登錄處理
...
} else {
fatalError("login wrong")
}
} else {
fatalError("login wrong")
}
上面這段代碼表示的是,當(dāng)用戶名和密碼都沒有問題時再進(jìn)行登錄處理浑娜。那么佑力,我們使用 guard 語法時,可以改寫如下:
guard
let userName = login.userNameOK,
let password = login.passwordOK,
else {
fatalError("login wrong")
}
// 登錄處理
...
可以看到筋遭,改寫后的代碼更易讀了打颤,異常處理都在一個區(qū)域,guard 語句真正起到了守衛(wèi)的職責(zé)宛畦。而且你一旦聲明了 guard瘸洛,編譯器就會強(qiáng)制你去處理異常,否則就會報錯次和。異常處理越完善反肋,代碼就會越健壯。所以踏施,條件語句的嵌套處理石蔗,你可以考慮使用 guard 語法。
循環(huán)語句
在循環(huán)語句中畅形,我們應(yīng)該盡量少地使用 continue 和 break养距,同樣可以使用 guard 語法來解決這個問題。解決方法是:所有需要 continue 和 break 的地方統(tǒng)一使用 guard 去處理日熬,將所有異常都放到一處棍厌。這樣做的好處是,在維護(hù)的時候方便邏輯閱讀竖席,使得代碼更加易讀和易于理解耘纱。
函數(shù)
對于函數(shù)來說,體積不宜過大毕荐,最好控制在百行代碼以內(nèi)束析。如果函數(shù)內(nèi)部邏輯多,我們可以將復(fù)雜邏輯分解成多個小邏輯憎亚,并將每個小邏輯提取出來作為一個單獨的函數(shù)员寇。每個函數(shù)處理最小單位的邏輯,然后一層一層往上組合第美。這樣蝶锋,我們就可以通過函數(shù)名明確那段邏輯處理的目的,提高代碼的可讀性什往。
拆分成多個邏輯簡單的函數(shù)后牲览,我們需要注意的是,要對函數(shù)的入?yún)⑦M(jìn)行驗證,guard 語法同樣適用于檢查入?yún)⒌谙住1热缦旅娴倪@個函數(shù):
func saveRSS(rss: RSS?, store: Store?) {
guard let rss = rss else {
return
}
guard let store = store else {
return
}
// 保存 RSS
return
}
如上面代碼所示贡必,通過 guard 語法檢查入?yún)?rss 和 store 是否異常,提高函數(shù)的健壯性會來得更容易些庸毫。
另外仔拟,函數(shù)內(nèi)盡量避免使用全局變量來傳遞數(shù)據(jù),使用參數(shù)或者局部變量傳遞數(shù)據(jù)能夠減少函數(shù)對外部的依賴飒赃,減少耦合利花,提高函數(shù)的獨立性,提高單元測試的準(zhǔn)確性载佳。
類
在 Objective-C 中炒事,類的頭文件應(yīng)該盡可能少地引入其他類的頭文件。你可以通過 class 關(guān)鍵字來聲明蔫慧,然后在實現(xiàn)文件里引入需要的其他類的頭文件挠乳。
對于繼承和遵循協(xié)議的情況,無法避免引入其他類的頭文件姑躲,所以你在代碼設(shè)計時還是要盡量減少繼承睡扬,特別是繼承關(guān)系太多時不利于代碼的維護(hù)和修改,比如說修改父類時還需要考慮對所有子類的影響黍析,如果評估不全卖怜,影響就難以控制。
分類
在寫分類時阐枣,分類里增加的方法名要盡量加上前綴马靠,而如果是系統(tǒng)自帶類的分類的話,方法名就一定要加上前綴蔼两,來避免方法名重復(fù)的問題虑粥。
分類的作用如其名,就是對類做分類用的宪哩,所以我建議你,能夠把一個類里的公共方法放到不同的分類里第晰,便于管理維護(hù)锁孟。分類特別適合多人負(fù)責(zé)同一個類時,根據(jù)不同分類來進(jìn)行各自不同功能的代碼維護(hù)茁瘦。
推薦:
Spotify 的 Objective-C 編碼規(guī)范:https://github.com/spotify/ios-style
紐約時報的 Objective-C 的編碼規(guī)范:https://github.com/NYTimes/objective-c-style-guide
Raywenderlich 的 Objective-C 編碼規(guī)范:https://github.com/raywenderlich/objective-c-style-guide
Raywenderlich 的 Swift 編碼規(guī)范:https://github.com/raywenderlich/swift-style-guide