Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在iOS上启用新的Objective-C对象文本?_Objective C_Ios_Xcode - Fatal编程技术网

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

如何在iOS上启用新的Objective-C对象文本?,objective-c,ios,xcode,Objective C,Ios,Xcode,当我使用Xcode 4.4创建新项目并添加以下行时: NSDictionary *test = @{ @"key" : @"test value" }; NSString *value = test[@"key"]; NSLog(@"value is: %@", value); 它编译时没有警告,并按预期执行 将相同的行添加到现有项目会产生编译器错误: NSString *value = test[@"key"]; <-- Expected method to read dictiona

当我使用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 *'

NSString*value=test[@“key”] 这与新旧项目无关,而是您使用的SDK的一个因素。您遇到的问题是,虽然这是一个编译器功能,但它需要SDK支持。iOS 5 SDK不提供这种支持,尽管iOS 6 SDK提供这种支持

因此,现在您应该只使用iOS6SDK。如果要在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
#如果(IPHONE)操作系统(OS)版本(MAX)允许<60000
@接口字典(下标)
-(id)objectforkeydsubscript:(id)键;
@结束
@接口NSMutableDictionary(下标)
-(void)setObject:(id)obj forkeydsubscript:(id)键;
@结束
@接口NSArray(下标)
-(id)objectAtIndexedSubscript:(NSUInteger)idx;
@结束
@接口NSMutableArray(下标)
-(void)setObject:(id)obj atIndexedSubscript:(nsuiger)idx;
@结束
#恩迪夫
我已经把这一块放上去了

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

资料来源:


两个项目都使用了clang 4.0?@特洛伊木马,都使用了“Apple LLVM compiler 4.0”。而且都是针对x86_64(不是i386)?嗯。。。编译的目标是OSX(i386 x86_64)和失败的iOS(armv6 armv7)。Arm LLVM编译器不支持新的对象文本?是的,它应该可以工作。“所有这些新的语言功能都需要现代Objective-C运行时。此运行时用于iOS的所有体系结构和Mac上的64位x86(x86_64)。在Mac上针对i386时不支持这些功能。”这为我完成了任务,谢谢!在Xcode 4.5提供正式的iOS支持之前一切都会好的。我只是在NSDictionary/NSArray上添加了它,并实现了它来调用常规方法。它工作得很好(ios 6就是这么做的)。你不需要@implementation。但是,今天,我在添加我需要的类别到我想要的类时没有问题。我会更新答案。有人知道苹果在提交应用程序时会怎么想吗?据我所知,ARClite实际上添加了必要的实现本身,因此从苹果公司的角度来看,方法
objectAtIndexedSubscript:
etc不是未记录的私有方法,而是用户定义的方法,对吗?如果您试图从类
+(void)加载
方法!此时似乎还没有加载arclite。