上次寫了篇 “關於 condition 的原來如此” 後, 仔細思索了在 Objective-C 中 BOOL 這種形態可能會發生的問題. 在 Java 中的 boolean 是一個 type safe 的資料形態, 也就是除了 true 和 false 之外, boolean 不能存其它數值.
但在 Objective-C 中呢?
=> BOOL 和 YES 與 NO 的關係可不像 Java 中的 boolean 那麼簡單.
再看一次 BOOL、YES 與 NO 的定義:
由 BOOL 的資料形態我們可以發現, 只要是合法的 signed char 都可以存入 BOOL 之中. 這意味著 BOOL 不單單能存 YES 與 NO 這兩種數值, 也就是 BOOL 並不是一個 type safe 的 boolean 形態.
看到這也許會有個疑問
=> 反正在 condition 中, 0 代表 false, 非 0 代表 true, 就算 BOOL 可以存 0 (NO) 與 1 (YES) 以外的數值也不會造成什麼影響.
其實是有影響的! 看個簡單的範例.
原因就在於 YES 代表的數值是 1, 而非所有非 0 的數值.
有趣吧? 在 Objective-C 使用 BOOL 時, 得謹慎些, 別誤以為 BOOL 是個 type safe 的 boolean 形態, 而發生了上頭這樣的錯誤.
但在 Objective-C 中呢?
=> BOOL 和 YES 與 NO 的關係可不像 Java 中的 boolean 那麼簡單.
再看一次 BOOL、YES 與 NO 的定義:
typedef signed char BOOL;很清楚的, BOOL 的資料形態是 signed char, 而 YES 與 NO 分別為數值為 1 和 0 的 BOOL.
#define YES (BOOL)1
#define NO (BOOL)0
由 BOOL 的資料形態我們可以發現, 只要是合法的 signed char 都可以存入 BOOL 之中. 這意味著 BOOL 不單單能存 YES 與 NO 這兩種數值, 也就是 BOOL 並不是一個 type safe 的 boolean 形態.
看到這也許會有個疑問
=> 反正在 condition 中, 0 代表 false, 非 0 代表 true, 就算 BOOL 可以存 0 (NO) 與 1 (YES) 以外的數值也不會造成什麼影響.
其實是有影響的! 看個簡單的範例.
BOOL isBool = 2;因為 BOOL 不是個 type safe 的 boolean, 不限只能使用 YES 或 NO 指派, 於是範例中使用了一個代表 true 的非 0 數值進行指派. 那麼, 程式執行完的結果會是如何?
if (isBool) {
NSLog(@"isBool? YES");
}
if (isBool != YES) {
NSLog(@"isBool? NO");
}
isBool? YES這下可好了, isBool 為 true 但卻不等於 YES.
isBool? NO
原因就在於 YES 代表的數值是 1, 而非所有非 0 的數值.
有趣吧? 在 Objective-C 使用 BOOL 時, 得謹慎些, 別誤以為 BOOL 是個 type safe 的 boolean 形態, 而發生了上頭這樣的錯誤.
留言