Objective-C :BOOL と bool

objc.h の定義より :

#if (TARGET_OS_IPHONE && __LP64__)  ||  TARGET_OS_WATCH
typedef bool BOOL;
#else
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#endif

#define YES ((BOOL)1)
#define NO  ((BOOL)0)

したがって、はい、BOOL は char であると想定できます。 (C99) bool を使用できます 型ですが、Apple のすべての Objective-C フレームワークとほとんどの Objective-C/Cocoa コードは BOOL を使用しているため、BOOL を使用するだけで typedef が変更された場合でも頭を悩ませることはありません。


前述のように、BOOL は signed char です。 bool - C99 標準の型 (int)。

BOOL - はい/いいえ。 bool - 真/偽。

例を参照してください:

bool b1 = 2;
if (b1) printf("REAL b1 \n");
if (b1 != true) printf("NOT REAL b1 \n");

BOOL b2 = 2;
if (b2) printf("REAL b2 \n");
if (b2 != YES) printf("NOT REAL b2 \n");

結果は

bool !=BOOL であることに注意してください。以下の結果は ONCE AGAIN - REAL b2 のみです

b2 = b1;
if (b2) printf("ONCE AGAIN - REAL b2 \n");
if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n");

bool を BOOL に変換したい場合は、次のコードを使用する必要があります

BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false;

したがって、私たちの場合:

BOOL b22 = b1 ? 2 : NO;
if (b22)    printf("ONCE AGAIN MORE - REAL b22 \n");
if (b22 != YES) printf("ONCE AGAIN MORE- NOT REAL b22 \n");

それで..今何が得られますか? :-)


これを書いている時点で、これは objc.h の最新バージョンです:

/// Type to represent a boolean value.
#if (TARGET_OS_IPHONE && __LP64__)  ||  TARGET_OS_WATCH
#define OBJC_BOOL_IS_BOOL 1
typedef bool BOOL;
#else
#define OBJC_BOOL_IS_CHAR 1
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
#endif

これは、64 ビット iOS デバイスおよび WatchOS BOOLbool とまったく同じです 他のすべてのデバイス (OS X、32 ビット iOS) では signed char です。 コンパイラフラグ -funsigned-char でオーバーライドすることさえできません

また、このサンプル コードはプラットフォームによって異なる動作をすることも意味します (自分でテストしました):

int myValue = 256;
BOOL myBool = myValue;
if (myBool) {
    printf("i'm 64-bit iOS");
} else {
    printf("i'm 32-bit iOS");
}

ところで array.count のようなものを割り当てないでください BOOL まで 可能な値の約 0.4% が負になるためです。