web-dev-qa-db-ja.com

Objective-CでYES / NO、TRUE / FALSEとtrue / falseの違いはありますか?

本当に簡単な質問。これらの値に違いはありますか(また、BOOLとboolには違いがありますか)?同僚はObjective-Cで異なることを評価すると述べましたが、それぞれの.hファイルのtypedefを見ると、YES/TRUE/trueはすべて1およびNO/FALSE/falseとして定義されていましたすべて0として定義されていました。本当に違いはありますか?

149
Kevlar

実用的な違いはありません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の傷の世界から身を守ることができます。

81
Lawrence Dol

私はそこにあると信じていますisboolBOOLの違いは、このウェブページで理由の説明をチェックしてください:
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に固執する引数です。

97
Dan J

これについて徹底的なテストを行いました。私の結果は自分自身で話す必要があります:

//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
50
Supuhstar

これに対する答えを読むことをお勧めします 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
14
Barry Wark

trueYESの主な(危険な!)違いは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}
10
malex

ここには誰も言及していない微妙なバグがあり、私は含めると思っていました...何よりも論理的なエラーの詳細:

int i = 2;
if(i);        //true
if(i==YES);   // false
if((!!i)==YES); //true

したがって、ここでの問題は(YES==1)であり、Cでは比較がブール値ではなく、値に基づいていることです。

YES#define(言語固有のものではなく)であるため、何らかの値である必要があり、1が最も理にかなっています。

1
Grady Player

YES/NOを追加すると、多くの場合、よりわかりやすいと思います。例えば:

[button setHidden:YES];

より良い音

[button setHidden:TRUE];
0
Marco