当1返回时,NSdictionary返回错误

时间:2012-11-14 18:23:45

标签: objective-c nsdictionary

当我得到超过1个对象时,一切都有效但是当它只有1个时它反应奇怪,我无法找到它的解决方案。

首先我将所有内容都放在一个数组中:

NSArray *array = [[[dictionary objectForKey:@"Response"] objectForKey:@"objecten"] objectForKey:@"object"];
if (array == nil) {
    NSLog(@"Expected 'results' array");
    return;
}

然后我在字典上使用for循环

for (NSDictionary *resultDict in array) {

    SearchResult *searchResult;


NSString *wrapperType = [resultDict objectForKey:@"type"];    

 if ([wrapperType isEqualToString:@"rent"]) 
 {
        searchResult = [self parseHuur:resultDict];

 }

        if (searchResult != nil) {
            [searchResults addObject:searchResult];
        }}

所以当结果回到1以后,一切都很好,但当只有一个回来时,我得到:

-[__NSCFString objectForKey:]: unrecognized selector sent to instance 0x6e52c30
*** Terminating app due to uncaught exception 
'NSInvalidArgumentException', reason: '-[__NSCFString objectForKey:]: 
unrecognized selector sent to instance 0x6e52c30'

它指向这一行:

NSString *wrapperType = [resultDict objectForKey:@"type"];    

我真的不明白...... 我在浏览器中使用相同的链接检查api的结果,它确实返回1个对象,但是当我记录resultDict(NSlog)时,我只得到一个答案:id而不是包含所有参数的整个对象(我不是我知道这是否是正确的名称)

怎么可能?

5 个答案:

答案 0 :(得分:2)

您的一些结果不是完整的NSDictionaries,而只是NSStrings。你可以检查一下:

for (id result in array) {
   if ([result isKindOfClass:[NSDictionary class]]) {
      NSDictionary *resultDict = (NSDictionary *)result;
   ...

答案 1 :(得分:1)

当您对NSDictionary使用快速枚举时,迭代变量来自字典中的键集,而不是值。

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocFastEnumeration.html

答案 2 :(得分:1)

根据您的评论,array并不总是您提到的数组。它可以是数组或字典。所以试试这个,

id someObject = [[[dictionary objectForKey:@"Response"] objectForKey:@"objecten"] objectForKey:@"object"]; //naming it as someObject since it is not always an array

if (someObject == nil) {
    NSLog(@"Expected 'results' array");
    return;
}

if ([someObject isKindOfClass:[NSDictionary class]]) { //Just add this
    someObject = [NSArray arrayWithObject:someObject];
} 

NSArray *array = (NSArray *)someObject;//type cast to an array now

for (NSDictionary *resultDict in array) {

   SearchResult *searchResult;
   NSString *wrapperType = [resultDict objectForKey:@"type"];    

   if ([wrapperType isEqualToString:@"rent"]) 
   {
        searchResult = [self parseHuur:resultDict];
   }
   if (searchResult != nil) {
        [searchResults addObject:searchResult];
   }
}

答案 3 :(得分:0)

resultDict不是NSDictionary,因此您无法在此对象上调用objectForKey :.

更好的解决方案是在for循环中将resultDict视为id type,并在使用之前检查其NSDictionary的类类型。

答案 4 :(得分:0)

-[__NSCFString objectForKey:]

因此它在objectForKey:上调用NSString方法。看来你用来获取对象的API遵循一个常见的习惯用法:它使用duck-typing / polimorphism(使用这些漂亮的与OO相关的单词)并返回数组对象(如果它具有多个结果)或单个对象(以及一个元素的数组)只有一个结果时。所以,你必须使用反射(OMG,甚至更多的OO术语!)来检查返回的对象是否实际上是一个数组 -

id result = [dictionary objectForKey:@"Response"];
id value;
if ([result isKindOfClass:[NSDictionary class]]) {
    value = [[result object objectForKey:@"objecten"] objectForKey:@"object"];
} else {
    value = result;
}

id value;
if ([dictionary isKindOfClass:[NSDictionary class]]) {
    value = [[[dictionary objectForKey:@"Result"] result object objectForKey:@"objecten"] objectForKey:@"object"];
} else {
    value = dictionary;
}

尝试两者,无论哪种作品都应该没问题。