Подтвердить что ты не робот

Как включить новые литералы объектов Objective-C в iOS?

Когда я создаю новый проект с Xcode 4.4 и добавляю следующие строки:

NSDictionary *test = @{ @"key" : @"test value" };
NSString *value = test[@"key"];
NSLog(@"value is: %@", value);

он компилируется без предупреждений и выполняется, как ожидалось.

Добавление тех же строк в существующий проект вызывает ошибку компилятора:

NSString *value = test[@"key"]; <-- Expected method to read dictionary element not found on object of type 'NSDictionary *'

Я сравнивал настройки целевой сборки обоих проектов, но ничего не выскочил на меня.

Update: Новый проект, который был успешно скомпилирован, был для OSX. Я попробовал еще один новый для iOS с указанными выше строками, и он не скомпилируется, как и мой предыдущий проект (iOS).

4b9b3361

Ответ 1

Это не имеет ничего общего со старым и новым проектом, а скорее является фактором используемого вами SDK. Проблема, с которой вы сталкиваетесь, заключается в том, что, хотя это функция компилятора, для нее требуется поддержка SDK. IOS 5 SDK не поддерживает эту поддержку, хотя SDK iOS 6.

По этой причине теперь вы должны просто использовать iOS 6 SDK. Продолжайте читать, если вы хотите использовать подтипы объектов с помощью iOS 5 SDK.

Все, что вам нужно сделать, это добавить файл заголовка, чтобы компилятор попытался выполнить вызов. Нет необходимости добавлять реализацию; он автоматически обрабатывается arclite. (Если вы не используете ARC, вам придется заставить компоновщик включать arclite. Но вам по-прежнему не нужно фактически переключаться на него.)

Создайте новый файл интерфейса, NSObject + subscriptipts.h.

#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000
@interface NSDictionary(subscripts)
- (id)objectForKeyedSubscript:(id)key;
@end

@interface NSMutableDictionary(subscripts)
- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
@end

@interface NSArray(subscripts)
- (id)objectAtIndexedSubscript:(NSUInteger)idx;
@end

@interface NSMutableArray(subscripts)
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
@end
#endif

Я поставил этот фрагмент на github.

Примечание. Раньше я предлагал добавить необходимые методы к NSObject, прежде чем объяснять, как их добавлять только к соответствующим объектам. В ретроспективе, я считаю, что это была ошибка с моей стороны; это привело к тому, что ошибки были обнаружены во время выполнения, а не времени компиляции, в отличие от подхода, представленного здесь. Этот подход по-прежнему находится в моем блоге , но теперь я считаю, что это более классный взломать, чем полезный подход.

Источник: