Ответ 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
, прежде чем объяснять, как их добавлять только к соответствующим объектам. В ретроспективе, я считаю, что это была ошибка с моей стороны; это привело к тому, что ошибки были обнаружены во время выполнения, а не времени компиляции, в отличие от подхода, представленного здесь. Этот подход по-прежнему находится в моем блоге , но теперь я считаю, что это более классный взломать, чем полезный подход.
Источник: