如何在iOS上启用新的Objective-C对象文字?

当我使用Xcode 4.4创build一个新项目并添加这些行时:

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 *' 

我比较了这两个项目的目标构build设置,但是没有什么突出的。

更新:成功编译的新项目用于OSX。 我用上面的代码尝试了另外一个新的iOS版本,它不能编译,和我之前的(iOS)项目一样。

这与旧项目和新项目无关,而是您使用的SDK的一个因素。 你遇到的问题是,虽然这是一个编译器function,它需要SDK支持。 尽pipeiOS 6 SDK支持,但iOS 5 SDK不提供这种支持。

出于这个原因,现在你应该只使用iOS 6 SDK。 如果您想使用iOS 5 SDK的对象下标,请继续阅读。

所有你需要做的就是添加一个头文件,以便编译器会尝试这个调用。 没有必要添加一个实现; 它由arclite自动处理。 (如果你不使用ARC,你将不得不强制链接器包含arclite ,但是你仍然不必切换到它。)

创build一个新的接口文件, NSObject +下标.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上 。

注意:我曾经build议在向NSObject添加必要的方法之前解释如何将它们仅添加到相关的对象。 回想起来,我认为这是我的错误。 它导致错误在运行时被捕获,而不是编译时间,不像现在介绍的方法。 这种方法仍然在我的博客上 ,但我现在认为它比一种有用的方法更酷。

资源:

  • Peter Steinberger,使用Xcode 4.4和iOS 4.3+的下标