当我得到超过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而不是包含所有参数的整个对象(我不是我知道这是否是正确的名称)
怎么可能?
答案 0 :(得分:2)
您的一些结果不是完整的NSDictionaries,而只是NSStrings。你可以检查一下:
for (id result in array) {
if ([result isKindOfClass:[NSDictionary class]]) {
NSDictionary *resultDict = (NSDictionary *)result;
...
答案 1 :(得分:1)
当您对NSDictionary使用快速枚举时,迭代变量来自字典中的键集,而不是值。
答案 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;
}
尝试两者,无论哪种作品都应该没问题。