Objective-C에서 예/no, true/false 및 true/false 사이에 차이가 있습니까?
-
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
그리고 YES
JSON 직렬화에 있습니다.
예를 들어 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)를 참조하는 다른 방법입니다.