为什么不能将NSDictionary valueForKey方法强制转换为NSString?

时间:2016-06-15 13:04:23

标签: ios objective-c nsdictionary

首先,让我告诉你一段代码:

NSURL *url = [NSURL URLWithString:@"http://www....../struct1.js"];
//create a NSData file from url.
NSData *myData = [NSData dataWithContentsOfURL:url];
NSError *theError = nil;
//some framework
NSDictionary *dict = [[CJSONDeserializer deserializer] deserializeAsDictionary:myData error:&theError];  

NSString * products;
for(id key in dict){
    NSLog(@"key: %@, value: %@",key,[dict objectForKey:key]);
    if([key isEqualToString:@"product_reviews"]){
        products = (NSString *)[dict valueForKey:key];
        break;
    }
}

//gives an error at the execution, why?
NSLog(@"products : %@",[NSString stringWithString:products]);

我在执行时遇到错误,例如 products 不是NSString,不是吗?为什么我不能施展它?

这是错误:

0x00e0eb2c __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke3246 + 68
    19  UIKit                               0x00de5b8a -[UIApplication workspaceDidEndTransaction:] + 163
    2123
    31  UIKit                               0x00de52da -[UIApplication _run] + 540

........ .....

32  UIKit                               0x00deaeb9 UIApplicationMain + 160
33  App1                                0x000416ca main + 138
34  libdyld.dylib                       0x03156a25 start + 1

) libc ++ abi.dylib:以NSException类型的未捕获异常终止

2 个答案:

答案 0 :(得分:1)

您应该使用-objectForKey:而不是-valueForKey:

请参阅:Difference between objectForKey and valueForKey?

答案 1 :(得分:0)

投放某些内容并不会如此。它只是试图说服编译器你知道你在说什么,所以你可以假装一个非类型(或id)值属于一个特定的类,然后在编码时获得更有用的编译时间检查

如果你输错了,那么你会在运行时崩溃。

你得到一个数组,你不能把它转换为字符串并期望它能够工作。你需要转换它。既然你没有说出你想要对阵列做什么,那么就很难提供专门的帮助。

由于您刚刚记录了该值,因此您可以将相关的代码行更改为:

NSLog(@"products : %@", products);

一切都很清楚。