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

dar*_*inm 23 xcode objective-c ios

当我使用Xcode 4.4创建一个新项目并添加以下行时:

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

它编译时没有警告并按预期执行.

将相同的行添加到现有项目会产生编译器错误:

NSString *value = test[@"key"]; <-- Expected method to read dictionary element not found on object of type 'NSDictionary *'
Run Code Online (Sandbox Code Playgroud)

我比较了两个项目的目标构建设置,但没有任何东西在我身上跳跃.

更新: 成功编译的新项目是针对OSX的.我用上面的代码尝试了另一个新的iOS版本,它无法编译,就像我之前存在的(iOS)项目一样.

Ste*_*her 48

这与旧项目和新项目无关,而是您使用的SDK的一个因素.您遇到的问题是虽然这是一个编译器功能,但它需要SDK支持.虽然iOS 6 SDK可以提供,但iOS 5 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
Run Code Online (Sandbox Code Playgroud)

我把这个块放在github上.

注意:我曾经建议NSObject在解释如何仅将它们添加到相关对象之前添加所需的方法.回想起来,我认为这是我的错误; 它导致错误在运行时捕获而不是编译时间,这与此处介绍的方法不同.这种方法仍然在我的博客上,但我现在认为它更像是一个很酷的黑客而不是一个有用的方法.

资源: