Objective-C에서 예/no, true/false 및 true/false 사이에 차이가 있습니까?

StackOverflow https://stackoverflow.com/questions/615702

  •  03-07-2019
  •  | 
  •  

문제

정말 간단한 질문; 이 값 사이에 차이가 있습니까 (그리고 bool과 bool 사이에 차이가 있습니까)? 동료는 객관적인 C에서 다른 것들을 평가한다고 언급했지만, 각 .h 파일에서 typedefs를 보았을 때 예/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에서 상처를 입은 세계에서 자신을 아끼지 않을 것입니다.

다른 팁

나는 거기를 믿는다 ~이다 간의 차이 bool 그리고 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는 아니오!
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

이것에 대한 답을 읽고 싶을 수도 있습니다 의문. 요약하면, 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 그리고 YESJSON 직렬화에 있습니다.

예를 들어 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 그리고 값으로 캐스트 된 가치 @((BOOL)expression) 그렇습니다 __NSCFBoolean 입력하고 변환 true JSON 직렬화와 함께. 같은 다른 표현 @(expression1 && expression2) (조차 @(YES && YES))입니다 __NSCFNumber (int) 입력하고 변환 1 JSON에서.

추신 : 문자열 값 부울을 사용할 수 있습니다

@{@"bool" : @"true"}; // in JSON {"bool":true}

아무도 언급하지 않은 미묘한 버그가 있습니다. 나는 무엇보다 논리적 오류를 포함시킬 것이라고 생각했습니다.

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

여기서 문제는 바로 그 것입니다 (YES==1) 그리고 C에서 비교는 부울이 아니라 가치를 기반으로합니다.

왜냐하면 YES 그냥 a #define (언어에 내재 된 것이 아니라), 그것은 약간의 가치가되어야하며 1 가장 의미가 있습니다.

나는 그들이 많은 경우에 더 자기 설명하기 위해 예/아니오를 추가한다고 생각합니다. 예를 들어:

[button setHidden:YES];

보다 더 잘 들립니다

[button setHidden:TRUE];

먼저 진실과 거짓이 무엇인지, 그리고 무엇이 그들에게 무엇이 의미가 있는지 살펴 보겠습니다.

우리는 다음과 같이 Lambda 미적분학에서 A else c c c라고 불리는 구조를 구성 할 수 있습니다.

(\ifThenElse. <use if then else>)(\a. \b. \c. a b c)

JavaScript에서는 다음과 같습니다.

(function(ifThenElse) {
    // use ifThenElse
})(function(a) {
    return function(b) {
        return function(c) {
            return a(b)(c);
        };
    };
});

ifthenelse가 유용하기 위해서는 오른쪽 또는 왼쪽을 선택하는 함수 "true"가 필요하며 다른 옵션을 무시하는 동안 또는 "true"를 선택하지 않는 옵션을 선택하는 "false"기능이 필요합니다.

이러한 기능을 다음과 같이 정의 할 수 있습니다.

(\true. <use true>)(\a. \b. a) and (\false. <use false>)(\a. \b. b)

JavaScript에서는 다음과 같습니다.

(function(True) {
    // use True
})(function(a) {
     return function(b) {
         return a;
     }
});

(function(False) {
    // use True
})(function(a) {
     return function(b) {
         return b;
     }
});

이제 우리는 다음을 수행 할 수 있습니다

(\true. \false. \ifThenElse. \doThis. \doThat. ifThenElse true doThis doThat)
(\a. \b. a)(\a. \b. b)(\a. \b. \c. a b c)(\a. ())(\a. ())

Lambda Calculus는 인쇄/수학/문자열과 같은 서비스를 제공하지 않기 때문에 Dothis와 Dothat ( a. 우리가 원하는 부작용을 제공하는 우리의 시스템)

그래서 이것을 실제로 보자.

(function(True) {
    return (function(False) {
        return (function(ifThenElse) {
            return (function(doThis) {
                return (function(doThat) {
                    return ifThenElse(True)(doThis)(doThat);
                });
            });
        });
    })
})(function(a) {
     return function(b) {
         return a;
     }
})(function(a) {
     return function(b) {
         return b;
     }
})(function(a) {
    return function(b) {
        return function(c) {
            return a(b)(c);
        };
    };
})(function(a) { console.log("you chose LEFT!"); })
(function(a) {console.log("you chose RIGHT");})();

배열/맵/인수/또는 하나 이상의 문장을 여러 기능으로 나누기 위해 하나 이상의 진술을 사용할 수있게되면 단순화 될 수있는 깊은 환경이지만, 정확히 하나의 인수의 기능으로 제한 할 수있는 것만 큼 순수합니다. 뿐.

True/False라는 이름은 고유의 의미가 없으며, 예/아니오, 왼쪽/오른쪽, 오른쪽/왼쪽, Zero/One, Apple/Orange로 쉽게 이름을 바꿀 수 있습니다. 어떤 선택이든, 그것은 선택자가 만든 종류에 의해서만 발생한다는 것은 의미가 있습니다. 따라서 "왼쪽"이 인쇄된다면, 우리는 선택자가 사실 일 수 있다는 것을 알고 있으며,이 지식을 바탕으로 우리는 추가 결정을 안내 할 수 있습니다.

요약합니다

function ChooseRight(left) {
    return function _ChooseRight_inner(right) {
        return right;
    }
}
function ChooseLeft(left) {
    return function _ChooseLeft_inner(right) {
        return left;
    }
}

var env = {
    '0': ChooseLeft,
    '1': ChooseRight,
    'false': ChooseRight,
    'true': ChooseLeft,
    'no': ChooseRight
    'yes': ChooseLeft,
    'snd': ChooseRight,
    'fst': ChooseLeft
};
var _0 = env['0'];
var _1 = env['1'];
var _true = env['true'];
var _false = env['false'];
var yes = env['yes'];
var no = env['no'];

// encodes church zero or one to boolean
function lambda_encodeBoolean(self) {
    return self(false)(true);
}
// decodes a Boolean to church zero or one
function lambda_decodeBoolean(self) {
    console.log(self, self ? env['true'] : env['false']);
    return self ? env['true'] : env['false'];
}

lambda_decodeBoolean('one' === 'two')(function() {
    console.log('one is two');
})(function() {
    console.log('one is not two');
})();

lambda_decodeBoolean('one' === 'one')(function() {
    console.log('one is one');
})(function() {
    console.log('one is not one');
})();

아니오, 예/아니오는 true/false (1/0)를 참조하는 다른 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top