Литерал @YES не работает в iOS 5 / Xcode 4.4

Выпущен новый Xcode 4.4, и он должен поддерживать такие литералы, как

@42
@"String"
@23.0L
@{ @"key" : obj } а также
@[obj1, obj2]

и это должно также поддерживать @YES а также @NO, который не работает при таргетинге на последнюю iOS 5 (и ранее). После компиляции покажите сообщение об ошибке:

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

Я знаю, что вы можете это исправить, набрав @(YES) а также @(NO), Но я хочу знать причину, почему это не работает, как ожидалось.

2 ответа

Решение

Причина в том, что Apple забыла здесь скобки:

#define YES             (BOOL)1

Это будет исправлено в iOS 6 SDK:

#define YES             ((BOOL)1)

В то же время вы должны ввести @(YES),

Это полезно для информации о литералах.

Комментатор на этот ответ также указывает:

Есть одна маленькая вещь, о которой я хотел бы предупредить. Литеральные bools также не поддерживаются из-за этого. Тем не менее, быстрое исправление, которое я реализовал, добавило это в начало одного из моих общих заголовков (в проекте iOS)

#ifndef __IPHONE_6_0 
#if __has_feature(objc_bool) 
#undef YES 
#undef NO 
#define YES __objc_yes 
#define NO __objc_no 
#endif 
#endif

@ phix23s ответ, кажется, более к сути. Вы должны принять это.

Это стоило добавить из комментариев:

Следует отметить, что это необходимо сделать после #import. Если вы поместите эти #defines в свой Prefix.pch, они должны обязательно импортировать Foundation ранее в pch

Другие вопросы по тегам