Может ли LLVM 4.0 использоваться в Xcode 4.3?

Другими словами, используйте литералы, но предназначенные для iOS 5.

Я знаю этот, но этот пост не является окончательным.

Ответ 1

Вы можете отключить компилятор, но он не работает, как вы могли подумать (я попробовал это сейчас). Существует несколько требований к компиляции SDK для использования этого нового синтаксиса (т.е. Он будет работать на предыдущих версиях iOS, но вам нужно скомпилировать его с помощью iOS 6.0 SDK). Я не думаю, что мне разрешено обсуждать их здесь в данный момент, но они подробно освещены в видео "Modern Objective-C" WWDC 2012.

В принципе, у вас будет синтаксис, но библиотеки не будут знать, как реагировать на него.

Существует альтернативная теория, хотя... что я просто не сделал это правильно ^^;

В конце концов, вы не имеете, чтобы использовать 4.3 для развертывания в приложениях 5.x. Таким образом, мое предложение - это просто обновление, на самом деле нет недостатка в нем (если вы не будете развертывать приложение в ближайшее время, но в этом случае просто перепутайте все, поскольку я предполагаю, что вы почти закончили).

РЕДАКТИРОВАТЬ (через 2 месяца теперь открыт iOS 6). Вы можете определенно использовать категории, чтобы обойти требования SDK нового синтаксиса objective-c. Добавьте категории в NSArray и NSDictionary для - (id)objectAtIndexedSubscript:(NSUInteger)idx и - (id)objectForKeyedSubscript:(id)key соответственно, которые возвращают objectAtIndex: и objectForKey: (это то, что они делают в любом случае в iOS 6). Также для NSMutableArray и NSMutableDictionary добавьте методы категорий для - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index и - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)index соответственно, которые просто добавят объект, если он еще не существует, и замените его, если это произойдет.

Один улов: определения YES и NO изменены в iOS 6 для размещения булевых литералов для NSNumber. Поэтому вам нужно сделать следующее:

#if __has_feature(objc_bool)
#undef YES //Before it was (BOOL)1
#undef NO //Before it was (BOOL)0

#define YES __objc_yes
#define NO __objc_no
#endif

Причина в том, что в новом синтаксисе уже есть определение синтаксиса @( ... ) (вложенные в ящик выражения), и старое определение будет разрешено @(BOOL)1, которое является ошибкой.