背景: 寫多混編語言 把swift 習慣帶入到了OC 就比如這個布爾值的寫法 前言:雖然 true 和 YES 實際上等效為 1,但為了代碼的一致性和可讀性,最好在 Objective-C 中用 YES 和 NO 1. 類型不同 YES 和 NO 是 Objective-C 的 BOOL 類型,它本 ...
背景: 寫多混編語言 把swift 習慣帶入到了OC 就比如這個布爾值的寫法
前言:雖然 true 和 YES 實際上等效為 1,但為了代碼的一致性和可讀性,最好在 Objective-C 中用 YES 和 NO
1. 類型不同
YES 和 NO 是 Objective-C 的 BOOL 類型,它本質上是一個 signed char,YES 等於 1,NO 等於 0。
true 和 false 是 C語言 C99 標準中的布爾值類型,來自 stdbool.h,屬於 bool 類型,true 是 1,false 是 0。
雖然它們在數值上相同(1 和 0),但它們屬於不同的類型。如果代碼中混用 BOOL 和 bool,可能會導致一些不容易察覺的細微問題。
2.跨語言和庫相容性
如果你在一個項目中混合使用 C、C++ 和 Objective-C 代碼,可能會有如下情況:
BOOL 類型與 bool 類型的轉換:雖然 BOOL 可以和 bool 直接比較,但它們屬於不同的類型。在跨越 C 和 Objective-C 的介面時,類型不匹配可能會導致警告或行為差異。
BOOL objcFlag = YES; // Objective-C 中使用 YES
bool cFlag = true; // C 中使用 true
if (objcFlag == cFlag) {
// 這個比較可以工作,但編譯器可能會發出警告
}
舊代碼中的習慣:如果你的項目中有大量的舊式 Objective-C 代碼,開發者習慣使用 YES 和 NO。如果新代碼突然使用 true 和 false,可能會讓其他開發者誤解這部分代碼在使用 C 或 C++ 中的布爾邏輯。
3.比較時的語義混淆
雖然在數值上 YES
、true
、1
都等同於真值,NO
、false
、0
都等同於假值,但在習慣上,人們傾向於在不同的上下文中使用不同的布爾值:
- 在 Objective-C 中,使用
YES
和NO
。 - 在 C 或 C++ 中,使用
true
和false
。
如果你在 Objective-C 中使用 true
和 false
,其他開發者可能會困惑你的意圖,特別是當你在同一個項目中有混合的 C 和 Objective-C 代碼時,這樣的代碼風格不一致會讓代碼的可讀性變差。
4. 風險來源
並非技術上的風險,而更多的是代碼可讀性和維護性。在大型項目或多人協作項目中,保持代碼風格的一致性非常重要。如果有些地方使用 YES
,有些地方使用 true
,讀代碼的人可能會困惑,尤其是面對維護舊代碼的開發者。他們可能會以為 true
和 YES
之間有某種語義上的區別,而實際上它們在這裡的意義是相同的。
BOOL flag = true; // 這是完全可以工作的代碼 if (flag == YES) { // 可以正確執行,但有人可能不清楚為什麼不用 true 或者直接用 YES // 而不是用 true,這會讓代碼變得不統一。 }
總結
風險主要來自於代碼的可維護性和一致性,而非功能本身。如果在 Objective-C 中混合使用 true/false
和 YES/NO
,開發者可能對代碼的風格產生困惑。為了避免這種情況,建議在 Objective-C 代碼中統一使用 YES
和 NO
。