這個(gè)小系列是從 "Zen and the Art of the Objective-C Craftsmanship"中 進(jìn)行的摘抄,共分成6篇,大部分是講代碼風(fēng)格及美化,偶爾看看也不錯(cuò)。
- 原文GitHub地址:
https://github.com/objc-zen/objc-zen-book - 中文版GitHub地址:
https://github.com/oa414/objc-zen-book-cn
-
條件語(yǔ)句
條件語(yǔ)句體應(yīng)該總被大括號(hào)包圍。只有一行代碼最好也加上,否則會(huì)帶來安全隱患。
// 推薦 if (!error) { return success; } // 不推薦 if (!error) return success; if (!error) return success;
-
尤達(dá)表達(dá)式(Yoda)
不要使用尤達(dá)表達(dá)式。(名字起源于星球大戰(zhàn)中尤達(dá)大師的講話方式,總是用倒裝的語(yǔ)序)
// 推薦 if ([myValue isEqual:@42]) { ... // 不推薦 if ([@42 isEqual:myValue]) { ...
-
nil和BOOL的檢查
一些人喜歡用這樣的方式來檢查nil:
if (nil == myValue) { ...
這樣做可以避開少些一個(gè)"=“的錯(cuò)誤,因?yàn)橐坏┥賹懸粋€(gè)”=“,那么nil是不能被賦值的,編譯器會(huì)報(bào)錯(cuò)。
但是前面提到,最好不要使用尤達(dá)表達(dá)式。所以更好的解決方法是用”!”來完成nil和BOOL的檢查。
// 推薦 if (someObject) { ... if (![someObject boolValue]) { ... if (!someObject) { ... // 不推薦 if (someObject == YES) { ... // Wrong if (myRawValue == YES) { ... // Never do this. if ([someObject boolValue] == NO) { ...
-
不要嵌套多個(gè)if語(yǔ)句
不要嵌套多個(gè)if語(yǔ)句,而是使用多個(gè)return來避免增加復(fù)雜度,并提高代碼可讀性。
也就是說,在一個(gè)方法中,重要的部分盡量不要放在if語(yǔ)句中,而是將”其它情況”放在if中。
// 推薦 - (void)someMethod { if (![someOther boolValue]) { return; } //Do something important } // 不推薦 - (void)someMethod { if ([someOther boolValue]) { //Do something important } }
-
復(fù)雜的表達(dá)式
當(dāng)一個(gè)判斷條件很復(fù)雜時(shí),應(yīng)該將它們提取出來賦值給一個(gè)BOOL變量。
BOOL nameContainsSwift = [sessionName containsString:@"Swift"]; BOOL isCurrentYear = [sessionDateCompontents year] == 2014; BOOL isSwiftSession = nameContainsSwift && isCurrentYear; if (isSwiftSession) { // Do something very cool }
-
三元運(yùn)算符
三元運(yùn)算符要保證可讀性。
// 推薦 result = a > b ? x : y; // 不推薦 result = a > b ? x = c > d ? c : d : y;
當(dāng)三元運(yùn)算符的第二個(gè)參數(shù)(if 分支)返回和條件語(yǔ)句中已經(jīng)檢查的對(duì)象一樣的對(duì)象的時(shí)候,下面的表達(dá)方式更靈巧:
// 推薦 result = object ? : [self createObject]; // 不推薦 result = object ? object : [self createObject];
-
錯(cuò)誤處理
有些方法通通過參數(shù)返回 error 的引用,使用這樣的方法時(shí)應(yīng)當(dāng)檢查方法的返回值,而非 error 的引用。
// 推薦 NSError *error = nil; if (![self trySomethingWithError:&error]) { // Handle Error }
-
switch語(yǔ)句中的case,如果只有一行代碼可以不必加上大括號(hào),但是多行需要加上。
switch (condition) { case 1: // ... break; case 2: { // ... // Multi-line example using braces break; } case 3: // ... break; default: // ... break; }
-
枚舉類型
使用NS_ENUM()這個(gè)宏來定義枚舉,它有更強(qiáng)大的的類型檢查和代碼補(bǔ)全。
typedef NS_ENUM(NSUInteger, ZOCMachineState) { ZOCMachineStateNone, ZOCMachineStateIdle, ZOCMachineStateRunning, ZOCMachineStatePaused };
所有文章
【objc-zen-book】1.條件語(yǔ)句&Case語(yǔ)句的注意
【objc-zen-book】2.命名
【objc-zen-book】3.類
【objc-zen-book】4.Category & NSNotification
【objc-zen-book】5.美化代碼 & 代碼組織
【objc-zen-book】6.Block & self的循環(huán)引用