为什么@YES给出"预期表达式"错误,但@(YES)编译?

aka*_*aru 5 compiler-errors objective-c objective-c-literals

使用XCode 4.4的转换为现代目标C语法,我的[NSNumber numberWithBool:YES]调用被转换为@(YES).我有一些问题,我现在已经忘记了,并将自己更改为@YES,这应该是正确的语法.

但是,这样做会给我一个错误:

意外的类型名称'BOOL':预期的表达式

我知道有一个"表达式"语法,但我不明白为什么我不能简单地使用@YES@NO.

// Compiler error:
NSDictionary *userDefaultsDefaults = @{@"hasBeenLaunched": @YES};

// No error
NSDictionary *userDefaultsDefaults = @{@"hasBeenLaunched": @(YES)};
Run Code Online (Sandbox Code Playgroud)

为什么@(YES)编译时@YES没有,我可以做些什么来解决这个问题?

Jam*_*ter 10

简短回答:

使用@(YES)@(NO)


更长的回答:

看看这个答案,这个答案解释说这主要是对Apple的疏忽.

这个答案的评论者也指出:

我想提醒一件小事.因此,也不支持文字布尔.但是,我实现的快速修复是将其添加到我的一个常见标题的开头(在iOS项目中)

#ifndef __IPHONE_6_0 
#if __has_feature(objc_bool) 
#undef YES 
#undef NO 
#define YES __objc_yes 
#define NO __objc_no 
#endif 
#endif
Run Code Online (Sandbox Code Playgroud)