[objective-c] objective-c에서 YES / NO, TRUE / FALSE와 true / false 사이에 차이가 있습니까?

간단한 질문은 정말로; 이 값들 사이에 차이가 있습니까 (그리고 BOOL과 bool 사이에 차이가 있습니까)? 동료는 Objective-C에서 다른 것으로 평가한다고 언급했지만 각각의 .h 파일에서 typedef를 볼 때 YES / TRUE / true는 모두 정의 1되었고 NO / FALSE / false는 모두로 정의되었습니다 0. 실제로 어떤 차이가 있습니까?



답변

실질적인 차이가 없습니다 제공 당신이 사용하는 BOOL논리 값으로 변수. C는 0으로 평가되는지 여부에 따라 부울 표현식을 처리합니다. 따라서 :

if(someVar ) { ... }
if(!someVar) { ... }

와 같은 의미

if(someVar!=0) { ... }
if(someVar==0) { ... }

그렇기 때문에 모든 기본 유형 또는 표현식을 부울 테스트 (예 : 포인터 포함)로 평가할 수 있습니다. 후자는 아니라 전자를해야합니다.

참고가 있다는 것입니다 당신이 소위에 둔각 값을 할당하면 차이 BOOL때문에 항상 논리 값으로 사용할하고 그들의에서 그들을 지정, 특정 값에 대한 변수 테스트 #define값.

중요한 것은 문자 비교를 사용하여 부울을 테스트하지 마십시오. 예가 someVar아닌 0이 아닌 값을 할당 할 수 있기 때문에 위험 할뿐만 아니라 더 중요한 것은 의도를 올바르게 표현하지 못하는 것입니다.

if(someVar==YES) { ... } // don't do this!
if(someVar==NO ) { ... } // don't do this either!

다시 말해, 사용하도록 의도되고 문서화 된 구성을 사용하면 C의 상처를 입은 세상에서 벗어날 수 있습니다.


답변

와 사이에 차이 있다고 생각 하는 이유는 다음 웹 페이지에서 확인하십시오. http://iosdevelopertips.com/objective-c/of-bool-and-yes.htmlboolBOOL

프리미티브 유형 BOOL이 아니기 때문에 unsigned char유형의 변수는 및 BOOL이외의 값을 포함 할 수 있습니다 .YESNO

이 코드를 고려하십시오.

BOOL b = 42;

if (b) {
    printf("b is not NO!\n");
}

if (b != YES) {
    printf("b is not YES!\n");
}

출력은 다음과 같습니다.

b는 아니요가 아닙니다!
b는 그렇습니다!

대부분의 사람들에게 이것은 불필요한 관심사이지만 실제로 부울을 원한다면을 사용하는 것이 좋습니다 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


답변

질문에 대한 답변을 읽을 수도 있습니다 . 요약하면 오브젝티브 -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


답변

주 (위험!) 차이가 사이 trueYESJSON 직렬화에 있습니다.

예를 들어 JSON 유형의 서버 요청이 있으며 json sence로 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하고 캐스팅 된 값만 JSON 직렬화 로 변환됩니다 . (even ) 과 같은 다른 표현식 은 유형이 있으며 JSON으로 변환됩니다 .@((BOOL)expression)__NSCFBooleantrue@(expression1 && expression2)@(YES && YES)__NSCFNumber (int)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];