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 BOOL
で bool
とまったく同じです 他のすべてのデバイス (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% が負になるためです。