답변:
의 정의에서 objc.h
:
#if (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH
typedef bool BOOL;
#else
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#endif
#define YES ((BOOL)1)
#define NO ((BOOL)0)
따라서 BOOL이 문자라고 가정 할 수 있습니다. (C99) bool
유형을 사용할 수 있지만 모든 Apple Objective-C 프레임 워크 및 대부분의 Objective-C / Cocoa 코드는 BOOL을 사용하므로 BOOL을 사용하여 typedef가 변경되면 두통을 피할 수 있습니다.
bool
합니다. 모든 Objective-C 프레임 워크는을 사용 BOOL
합니다.
NSInteger progressTime = 2;//any value NSInteger totalTime = 1;//any value BOOL success = (progressTime>=totalTime)
// 항상 제공 NO
하지만 해당 (progressTime>=totalTime)
값을 bool
유형 으로 받으면 success
올바른 결과를 반환합니다. 나는이 행동을 이해하지 못한다. 사용 Xcode 7.x
하고 있으며 iOS
버전은 8.x
입니다. @BarryWark
위에서 언급했듯이 BOOL은 부호가있는 문자입니다. bool-C99 표준 (int)의 유형입니다.
BOOL-예 / 아니요. 부울-참 / 거짓.
예를보십시오 :
bool b1 = 2;
if (b1) printf("REAL b1 \n");
if (b1 != true) printf("NOT REAL b1 \n");
BOOL b2 = 2;
if (b2) printf("REAL b2 \n");
if (b2 != YES) printf("NOT REAL b2 \n");
결과는
실제 b1
실제 b2 실제 b2
아님
bool! = BOOL입니다. 아래 결과는 ONCE AGAIN-REAL b2 에만 해당됩니다.
b2 = b1;
if (b2) printf("ONCE AGAIN - REAL b2 \n");
if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n");
bool을 BOOL로 변환하려면 다음 코드를 사용해야합니다
BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false;
따라서 우리의 경우 :
BOOL b22 = b1 ? 2 : NO;
if (b22) printf("ONCE AGAIN MORE - REAL b22 \n");
if (b22 != YES) printf("ONCE AGAIN MORE- NOT REAL b22 \n");
그리고 우리는 지금 무엇을 얻습니까? :-)
!!b1
. 그들 사이에 변환
글을 쓰는 시점에서 이것은 최신 버전의 objc.h입니다.
/// Type to represent a boolean value.
#if (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH
#define OBJC_BOOL_IS_BOOL 1
typedef bool BOOL;
#else
#define OBJC_BOOL_IS_CHAR 1
typedef signed char BOOL;
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
// even if -funsigned-char is used.
#endif
즉, 64 비트 iOS 기기와 WatchOS BOOL
는 bool
다른 모든 기기 (OS X, 32 비트 iOS)와 동일하지만 signed char
컴파일러 플래그로 재정의 할 수 없습니다.-funsigned-char
또한이 예제 코드는 다른 플랫폼에서 다르게 실행된다는 것을 의미합니다 (자체 테스트 한 결과).
int myValue = 256;
BOOL myBool = myValue;
if (myBool) {
printf("i'm 64-bit iOS");
} else {
printf("i'm 32-bit iOS");
}
BTW 는 가능한 값의 약 0.4 %가 음수가되기 때문에 변수 와 같은 array.count
것을 할당하지 않습니다 BOOL
.
사용해야하는 Objective-C 유형은 BOOL
입니다. 기본 부울 데이터 유형과 같은 것은 없으므로 모든 컴파일러에서 코드를 컴파일 할 때 사용하십시오 BOOL
. (Apple-Frameworks에 정의되어 있습니다.
BOOL
Objective-C 언어 ( objc/*.h
헤더 중 하나에 있음)로 정의됩니다 . 또한 C99로 컴파일 할 때 (기본이라고 생각합니다) 기본 부울 유형이 있습니다 _Bool
(또는 포함 된 bool
경우 stdbool.h
).
예, BOOL은 objc.h에 따르면 서명 된 문자의 typedef입니다.
그래도 bool에 대해서는 모른다. 그것은 C ++ 일입니까? 1이 YES / true이고 0이 NO / false 인 부호있는 문자로 정의 된 경우 어떤 문자를 사용하든 상관 없습니다.
그러나 BOOL은 Objective-C의 일부이므로 명확성을 위해 BOOL을 사용하는 것이 더 합리적입니다.
bool과 BOOL의 또 다른 차이점은 키-값 관찰을 수행하거나-[NSObject valueForKey :]와 같은 메소드를 사용할 때 동일한 종류의 객체로 정확하게 변환되지 않는다는 것입니다.
모두가 여기에서 말했듯이 BOOL은 char입니다. 따라서 char를 보유한 NSNumber로 변환됩니다. 이 개체는 'A'또는 '\ 0'과 같은 일반 문자로 만든 NSNumber와 구별 할 수 없습니다. 당신은 당신이 원래 BOOL을 가지고 있었던 정보를 완전히 잃어 버렸습니다.
그러나 bool은 CFNumber로 변환되어 NSNumber와 동일하게 동작하지만 오브젝트의 부울 원점은 유지합니다.
나는 이것이 BOOL vs. bool 토론에서 논쟁이라고 생각하지 않지만 이것은 언젠가 물릴 수 있습니다.
Cocoa / iOS API (C99 이전에 설계된 기본 bool 유형)에서 사용되는 유형이므로 일반적으로 BOOL을 사용해야합니다.
나는 여기서 대회에 반대한다. 나는 typedef를 기본 유형에 좋아하지 않습니다. 나는 그것이 가치를 제거하는 쓸모없는 간접적이라고 생각합니다.
size_t
), 두 bool
(C99) 및 BOOL
그 카테고리에 (ObjC) 가을. 그리고 typedef의 변경으로 인해 코드가 실패한 경우 typedef를 불투명 한 것으로 취급하지 않았지만 하나의 플랫폼에서의 구현에 의존했기 때문에 코드가 책임이 있습니다. (부끄러워 할 것은 없지만, 그렇게하는 것은 typedef가 아닙니다.)
BOOL varname
대신 char varname
이 그 변수에 대한 두 개의 유효한 값이라는 것을 더 분명하다 true
/ YES
나 false
/ NO
.
위에서 언급했듯이 아키텍처에 따라 유형 BOOL
이 될 수 있지만 unsigned char
유형 bool
은입니다 int
. 간단한 실험은 BOOL과 bool이 다르게 동작 할 수있는 이유를 보여줍니다.
bool ansicBool = 64;
if(ansicBool != true) printf("This will not print\n");
printf("Any given vlaue other than 0 to ansicBool is evaluated to %i\n", ansicBool);
BOOL objcBOOL = 64;
if(objcBOOL != YES) printf("This might print depnding on your architecture\n");
printf("BOOL will keep whatever value you assign it: %i\n", objcBOOL);
if(!objcBOOL) printf("This will not print\n");
printf("! operator will zero objcBOOL %i\n", !objcBOOL);
if(!!objcBOOL) printf("!! will evaluate objcBOOL value to %i\n", !!objcBOOL);
놀랍게도 실제로 문자 코드 1 if(objcBOOL != YES)
이므로 컴파일러가 1로 평가합니다. 컴파일러 YES
의 눈에는 문자 코드 64가 문자 코드 1 과 동일하지 않으므로 if 문이 평가되고 YES/true/1
다음 줄은 운영. 그러나 none zero bool
유형은 항상 정수 값 1로 평가되므로 위의 문제는 코드에 영향을 미치지 않습니다. 다음은 Objective-C BOOL
type과 type 을 사용하려는 경우 유용한 팁입니다 ANSI C bool
.
YES
또는 NO
값을 지정하고 다른 것은 지정 하지 마십시오.BOOL
double not !!
연산자를 사용하여 유형을 변환하십시오 .YES
사용을 점검 할 때 if(!myBool) instead of if(myBool != YES)
not !
연산자 를 사용 하는 것이 훨씬 깨끗 하며 예상 된 결과를 제공합니다.또한 서명 된 문자로 캐스트하기 때문에 특히 비트 마스크로 작업 할 때 캐스트의 차이점에 유의하십시오.
bool a = 0x0100;
a == true; // expression true
BOOL b = 0x0100;
b == false; // expression true on !((TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH), e.g. MacOS
b == true; // expression true on (TARGET_OS_IPHONE && __LP64__) || TARGET_OS_WATCH
BOOL이 부울 대신 부호있는 문자 인 경우 0x0100을 BOOL로 캐스트하면 단순히 설정된 비트가 삭제되고 결과 값은 0입니다.