Objective c 当1返回时,NSdictionary返回错误

Objective c 当1返回时,NSdictionary返回错误,objective-c,nsdictionary,Objective C,Nsdictionary,当我取回超过1个对象时,一切都正常,但当只有1个对象时,它的反应很奇怪,我找不到解决方案 首先,我将所有内容设置为一个数组: NSArray *array = [[[dictionary objectForKey:@"Response"] objectForKey:@"objecten"] objectForKey:@"object"]; if (array == nil) { NSLog(@"Expected 'results' array"); return; } 然后我在

当我取回超过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个对象,但当我记录ResultDisct(NSlog it)时,我只得到一个答案:id,而不是包含所有参数的整个对象(我不知道这是否是它的正确名称)


这怎么可能呢?

您的一些结果不是完整的NSDictionary,而是NSString。您可以检查以下内容:

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

您的一些结果不是完整的NSDictionary,而是NSString。您可以检查以下内容:

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

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


更好的解决方案是将ResultDisct视为for循环,并在使用它之前检查它的类类型是否为NSDictionary。

ResultDisct不是NSDictionary,因此不能在此对象上调用objectForKey:

-[__NSCFString objectForKey:]
更好的解决方案是将resultDict作为for循环处理,并在使用它之前检查它的类类型是否为NSDictionary

-[__NSCFString objectForKey:]
因此,它在
NSString
上调用
objectForKey:
方法。您用于获取对象的API似乎遵循了一个常见的习惯用法:它使用duck类型化/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;
}

两种都试试,哪一种都行

因此,它在
NSString
上调用
objectForKey:
方法。您用于获取对象的API似乎遵循了一个常见的习惯用法:它使用duck类型化/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;
}


两种方法都可以。当您对NSDictionary使用快速枚举时,迭代变量来自dictionary中的键集,而不是值


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


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

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];
   }
}

根据您的评论,
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];
   }
}


谢谢你的回答,我试过了,现在它检查每一个结果,如果是nsdictionary类,它非常慢,但最终它工作了,但现在当它只返回一个结果时,它显示=找不到,而不是结果…谢谢你的回答,我试过了,现在它检查每一个结果,如果是nsdictionary类,它非常慢,但最终它工作了,但现在当它只返回一个结果时,它显示=未找到任何结果,而不是结果…我理解你所说的(lol术语),但我无法让它工作…等等,我将用logoke编辑这篇文章。这是个问题:我使用NSlog查看它的去向,无论应用程序是否返回错误,它都使用True语句。所以同样的错误又回来了…我明白你说的(lol术语),但我无法让它工作…等等,我会用logoke编辑这篇文章。这就是问题所在:我使用NSlog查看它的去向,无论应用程序是否返回错误,它是否使用了True语句。所以同样的错误又回来了…所以当你只得到一个时,是字典还是字符串?你打印了数组并检查了吗?@ACB我检查了它,它是一个数组,我用类记录了它,它激发了真实的语句。。。我不明白它的意思是对象,它是字典还是字符串,作为单个元素存在于数组中。您是否尝试打印数组的objectAtIndex:0?@ACB如果我在objectAtIndex:0处登录,我会遇到相同的错误(无法识别的选择器等),那么我如何知道它是哪种类型的值..尝试打印,[[dictionary objectForKey:@“Response”]objectForKey:@“objecten”],如果这也会崩溃,请打印[dictionary objectForKey:@“Response”]。其中一个返回字符串而不是字典。检查这是否是您所期望的格式。因此,当您只返回一个时,是字典还是字符串?你打印了数组并检查了吗?@ACB我检查了它,它是一个数组,我用类记录了它,它激发了真实的语句。。。我不明白它的意思是对象,它是字典还是字符串,作为单个元素存在于数组中。您是否尝试打印数组的objectAtIndex:0?@ACB如果我在objectAtIndex:0处登录,我会遇到相同的错误(无法识别的选择器等),那么我如何知道它是哪种类型的值..尝试打印,[[dictionary objectForKey:@“Response”]objectForKey:@“objecten”],如果这也会崩溃,请打印[dictionary objectForKey:@“Response”]。其中一个返回字符串而不是字典。检查这是否是您期望的格式。完美的答案,没有丢失任何结果!完美的答案,没有失去任何结果!