Почему @YES выдает ожидаемую ошибку выражения, но @(YES) компилируется?

Используя XCode 4.4 Convert to Modern Objective C Syntax, мои вызовы [NSNumber numberWithBool:YES] были преобразованы в @(YES). У меня была проблема, о которой я теперь забыл, и я сам изменил их на @YES, что должно быть правильным синтаксисом.

Однако это дает мне ошибку:

Неожиданное имя типа 'BOOL': ожидаемое выражение

Я знаю, что есть синтаксис "выражения", но я не понимаю, почему я не могу просто использовать @YES и @NO.

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

// No error
NSDictionary *userDefaultsDefaults = @{@"hasBeenLaunched": @(YES)};

Почему @(YES) компилируется, а @YES нет, и что я могу сделать, чтобы исправить это?


person akaru    schedule 28.07.2012    source источник


Ответы (2)


Краткий ответ:

Используйте @(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
person James Webster    schedule 28.07.2012
comment
Понимаю. Так что я не сумасшедший. Спасибо за внимание. Я добавил это к моему префиксу и смог использовать синтаксис без скобок по желанию. - person akaru; 28.07.2012
comment
Похоже, это исправлено в Xcode 4.5 — с использованием в основном того же кода, судя по LLVM docs< /а>. - person Siobhán; 29.07.2012

Новые числовые литералы (например, @YES) в обновлении Clang не полностью реализованы в XCode до версии 4.5.

person Jeff Wolski    schedule 20.09.2012