当我使用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 *'
我比较了两个项目的目标构建设置,但没有任何东西在我身上跳过。
更新 成功编译的新项目是针对OSX的。我用上面的代码尝试了另一个新的iOS版本,它无法编译,就像我之前存在的(iOS)项目一样。
答案 0 :(得分:48)
这与旧项目和新项目无关,而是您使用的SDK的一个因素。您遇到的问题是虽然这是一个编译器功能,但它需要SDK支持。 iOS 5 SDK不提供这种支持,但iOS 6 SDK可以提供。
出于这个原因,现在你应该使用iOS 6 SDK。如果您想使用iOS 5 SDK的对象下载,请继续阅读。
您需要做的就是添加一个头文件,以便编译器尝试调用。没有必要添加实现;它由arclite
自动处理。 (如果您不使用ARC,则必须强制链接器包含arclite
。但您仍然不必切换到它。)
创建一个新的界面文件 NSObject + subscripts.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
。回想起来,我认为这是我的错误;它导致错误在运行时捕获而不是编译时间,这与此处介绍的方法不同。这种方法仍然在blog上,但我现在认为它更像是一种很酷的黑客而不是一种有用的方法。
来源: