回答:
の定義から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
ます。Objective-Cフレームワークはすべてを使用しますBOOL
。
NSInteger progressTime = 2;//any value NSInteger totalTime = 1;//any value BOOL success = (progressTime>=totalTime)
//それは常に与えられますが、型にNO
その(progressTime>=totalTime)
値を受け取ると 、正しい結果を返します。私はこの行動を理解していません。私が使用しており、バージョンはでした。@BarryWarkbool
success
Xcode 7.x
iOS
8.x
上記のように、BOOLは署名付き文字です。bool-C99標準からの型(int)。
BOOL-はい/いいえ。bool-true / false。
例を見る:
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");
そして結果は
REAL b1
REAL b2
REAL b2
bool!= BOOLであることに注意してください。以下の結果は、もう一度だけです-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");
そして、..私たちは今何を得るのですか?:-)
!!b1
。それらの間で変換するには
執筆時点では、これは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");
}
ところで、可能な値の約0.4%が負になるのでarray.count
、BOOL
変数に変数などを割り当てることはありません。
使用するObjective-CタイプはBOOL
です。ネイティブのブールデータ型のようなものはないため、すべてのコンパイラでコードがコンパイルされることを確認するには、を使用しますBOOL
。(これはApple-Frameworksで定義されています。
BOOL
、Objective-C言語(objc/*.h
ヘッダーの1つにあります)によって定義されます。また、C99でコンパイルすると(デフォルトだと思います)、ネイティブのブール型があります_Bool
(または含まれているbool
場合stdbool.h
)。
うん、BOOLはobjc.hによると、signed charのtypedefです。
でも、私はブールについて知りません。それはC ++のことですよね?1がYES / trueで、0がNO / falseである署名付き文字として定義されている場合、どちらを使用してもかまいません。
ただし、BOOLはObjective-Cの一部であるため、わかりやすくするためにBOOLを使用する方が理にかなっています(他のObjective-C開発者がboolの使用を見ると困惑する場合があります)。
boolとBOOLのもう1つの違いは、キー値の監視を行う場合、または-[NSObject valueForKey:]のようなメソッドを使用する場合、同じ種類のオブジェクトに正確に変換されないことです。
誰もがここで言ったように、BOOLはcharです。そのため、charを保持するNSNumberに変換されます。このオブジェクトは、「A」や「\ 0」などの通常の文字から作成されたNSNumberと区別できません。最初にBOOLを持っていたという情報を完全に失いました。
ただし、boolはCFBooleanに変換されます。これはNSNumberと同じように動作しますが、オブジェクトのboolean原点を保持します。
私はこれがBOOL対boolの議論での議論であるとは思わないが、これはいつかあなたに噛みつくかもしれない。
これは、Cocoa / iOS API(C99およびそのネイティブのブール型の前に設計された)のあらゆる場所で使用される型であるため、一般的には、ブール型を使用する必要があります。
ここでは慣習に反対します。typedefを基本型にするのは好きではありません。価値を取り除くのは無用な間接法だと思います。
size_t
、bool
(C99)とBOOL
(ObjC)の両方がそのカテゴリに分類されます。typedefの変更が原因でコードが失敗した場合は、typedefを不透明なものとして処理せず、1つのプラットフォームでの実装に依存していたため、コードのせいにします。(恥ずかしいことは何もありませんが、起こりますが、それはtypedefではありません。)
BOOL varname
代わりにchar varname
、その変数の2つの有効な値がtrue
/ YES
またはfalse
/ であることがより明白であることを意味しますNO
。
上記のようBOOL
に、はタイプですがunsigned char
、アーキテクチャによってはタイプになる場合があります。簡単な実験により、BOOLとboolの動作が異なる理由がわかります。bool
int
bool ansicBool = 64;
if(ansicBool != true) printf("This will not print\n");
printf("Any given vlaue other than 0 to ansicBool is evaluated to %i\n", ansicBool);
BOOL objcBOOL = 64;
if(objcBOOL != YES) printf("This might print depnding on your architecture\n");
printf("BOOL will keep whatever value you assign it: %i\n", objcBOOL);
if(!objcBOOL) printf("This will not print\n");
printf("! operator will zero objcBOOL %i\n", !objcBOOL);
if(!!objcBOOL) printf("!! will evaluate objcBOOL value to %i\n", !!objcBOOL);
驚いたことにif(objcBOOL != YES)
、YES
実際には文字コード1 であるため、コンパイラーは1と評価します。コンパイラーの観点では、文字コード64はもちろん文字コード1 と等しくないため、ifステートメントはYES/true/1
次のように評価され、次の行は実行します。ただし、ゼロなしのbool
タイプは常に整数値1に評価されるため、上記の問題はコードに影響しません。Objective-C BOOL
タイプとタイプを使用したい場合のヒントを以下に示しますANSI C bool
。
YES
or NO
値を割り当て、それ以外は何も割り当てません。BOOL
double not !!
演算子を使用して型を変換し、予期しない結果を回避します。YES
使用をチェックするif(!myBool) instead of if(myBool != YES)
ときは、not !
演算子を使用する方がずっときれいで、期待どおりの結果が得られます。また、署名付きのcharにキャストするため、特にビットマスクを使用する場合は、キャストの違いに注意してください。
bool a = 0x0100;
a == true; // expression true
BOOL b = 0x0100;
b == false; // expression true on !((TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH), e.g. MacOS
b == true; // expression true on (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH
BOOLがboolではなく、signed charである場合、BOOLへの0x0100のキャストは単にセットビットをドロップし、結果の値は0になります。