本当に簡単な質問。これらの値に違いはありますか(また、BOOLとboolには違いがありますか)?同僚はObjective-Cで異なることを評価すると述べましたが、それぞれの.hファイルのtypedefを見ると、YES/TRUE/trueはすべて1
およびNO/FALSE/falseとして定義されていましたすべて0
として定義されていました。本当に違いはありますか?
実用的な違いはありませんprovidedブール値としてBOOL
変数を使用します。 Cは、0と評価されるかどうかに基づいてブール式を処理します。
if(someVar ) { ... }
if(!someVar) { ... }
と同じ意味
if(someVar!=0) { ... }
if(someVar==0) { ... }
これが、ブール型テスト(たとえばポインターを含む)としてプリミティブ型または式を評価できる理由です。後者ではなく前者を実行する必要があることに注意してください。
isいわゆるBOOL
変数に鈍角値を割り当ててテストする場合、違いがあることに注意してください特定の値なので、常にブール値として使用し、#define
値からのみ割り当てます。
重要なのは、文字比較を使用してブール値をテストしないことです。someVar
にYESではないゼロ以外の値を割り当てることができるため、リスクがあるだけでなく、より重要なことに、意図を正しく表現できません。
if(someVar==YES) { ... } // don't do this!
if(someVar==NO ) { ... } // don't do this either!
言い換えると、使用することが意図され、文書化されているとおりに構造を使用すると、Cの傷の世界から身を守ることができます。
私はそこにあると信じていますisbool
とBOOL
の違いは、このウェブページで理由の説明をチェックしてください:
http://iosdevelopertips.com/objective-c/of-bool-and-yes.html
BOOL
はプリミティブ型ではなくunsigned char
であるため、BOOL
型の変数にはYES
およびNO
以外の値を含めることができます。
次のコードを検討してください。
BOOL b = 42;
if (b) {
printf("b is not NO!\n");
}
if (b != YES) {
printf("b is not YES!\n");
}
出力は次のとおりです。
bはNOではありません!
bはYESではありません!
ほとんどの人にとってこれは不必要な懸念事項ですが、本当にブール値が必要な場合は、bool
を使用することをお勧めします。追加する必要があります:iOS SDKは通常、そのインターフェイス定義でBOOL
を使用するため、BOOL
に固執する引数です。
これについて徹底的なテストを行いました。私の結果は自分自身で話す必要があります:
//These will all print "1"
NSLog(@"%d", true == true);
NSLog(@"%d", TRUE == true);
NSLog(@"%d", YES == true);
NSLog(@"%d", true == TRUE);
NSLog(@"%d", TRUE == TRUE);
NSLog(@"%d", YES == TRUE);
NSLog(@"%d", true == YES);
NSLog(@"%d", TRUE == YES);
NSLog(@"%d", YES == YES);
NSLog(@"%d", false == false);
NSLog(@"%d", FALSE == false);
NSLog(@"%d", NO == false);
NSLog(@"%d", false == FALSE);
NSLog(@"%d", FALSE == FALSE);
NSLog(@"%d", NO == FALSE);
NSLog(@"%d", false == NO);
NSLog(@"%d", FALSE == NO);
NSLog(@"%d", NO == NO);
//These will all print "0"
NSLog(@"%d", false == true);
NSLog(@"%d", FALSE == true);
NSLog(@"%d", NO == true);
NSLog(@"%d", false == TRUE);
NSLog(@"%d", FALSE == TRUE);
NSLog(@"%d", NO == TRUE);
NSLog(@"%d", false == YES);
NSLog(@"%d", FALSE == YES);
NSLog(@"%d", NO == YES);
NSLog(@"%d", true == false);
NSLog(@"%d", TRUE == false);
NSLog(@"%d", YES == false);
NSLog(@"%d", true == FALSE);
NSLog(@"%d", TRUE == FALSE);
NSLog(@"%d", YES == FALSE);
NSLog(@"%d", true == NO);
NSLog(@"%d", TRUE == NO);
NSLog(@"%d", YES == NO);
出力は次のとおりです。
2013-02-19 20:30:37.061 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.061 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.072 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.073 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.073 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.074 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.074 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.075 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.075 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.076 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.077 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.077 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.078 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.078 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.079 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.079 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.080 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.080 BooleanTests[27433:a0f] 1
2013-02-19 20:30:37.081 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.081 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.082 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.091 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.092 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.093 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.093 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.094 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.094 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.095 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.095 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.096 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.096 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.097 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.098 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.101 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.102 BooleanTests[27433:a0f] 0
2013-02-19 20:30:37.102 BooleanTests[27433:a0f] 0
これに対する答えを読むことをお勧めします question 。要約すると、Objective-Cで(objc.hの定義から):
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#define OBJC_BOOL_DEFINED
#define YES (BOOL)1
#define NO (BOOL)0
true
とYES
の主な(危険な!)違いはJSONシリアル化にあります。
たとえば、JSONタイプのサーバーリクエストがあり、jsonでtrue/falseを送信する必要があります。
NSDictionary *r1 = @{@"bool" : @(true)};
NSDictionary *r2 = @{@"bool" : @(YES)};
NSDictionary *r3 = @{@"bool" : @((BOOL)true)};
次に、送信する前にJSON文字列に変換します
NSData *data = [NSJSONSerialization dataWithJSONObject:requestParams options:0 error:nil];
NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
結果は
jsonString1 // {"bool":1}
jsonString2 // {"bool":true}
jsonString3 // {"bool":true}
APIロジックjsonString1
により、エラーが発生する可能性があります。
そのため、Objective-Cではブール値に注意してください。
要約すると、正確な@YES
と@((BOOL)expression)
としてキャストされた値のみが__NSCFBoolean
型であり、JSONシリアル化でtrue
に変換されます。 @(expression1 && expression2)
などのその他の式(@(YES && YES)
でも)は__NSCFNumber (int)
タイプであり、JSONで1
に変換されます。
追伸単純に文字列値のブール値を使用できます
@{@"bool" : @"true"}; // in JSON {"bool":true}
ここには誰も言及していない微妙なバグがあり、私は含めると思っていました...何よりも論理的なエラーの詳細:
int i = 2;
if(i); //true
if(i==YES); // false
if((!!i)==YES); //true
したがって、ここでの問題は(YES==1)
であり、Cでは比較がブール値ではなく、値に基づいていることです。
YES
は#define
(言語固有のものではなく)であるため、何らかの値である必要があり、1
が最も理にかなっています。
YES/NOを追加すると、多くの場合、よりわかりやすいと思います。例えば:
[button setHidden:YES];
より良い音
[button setHidden:TRUE];