gpt4 book ai didi

iphone - NSDictionary for 循环异常

转载 作者:行者123 更新时间:2023-12-03 16:27:17 26 4
gpt4 key购买 nike

我有一个包含这部分代码的方法:

NSDictionary *tmpDict = [self getJsonDictionary];

NSInteger tmpID;

for (NSDictionary *d in tmpDict) {
tmpID = [[d objectForKey:@"id"] integerValue];
}

tmpDict 是一个大小可变的 NSDictionary。如果 tmpDict 至少包含 2 个对象(2 个 NSDictionary),则效果良好,但如果仅包含 1 个对象(1 NSDictionary),则会抛出此异常:

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

为什么会这样?如果 tmpDict 只有 1 个对象,如何修复?

可能 for (NSDictionary *d in tmpDict) 是问题所在,当 tmpDict 有 1 个对象时 d 是一个 NSCFString,但为什么呢?

-- 更新

问题是当 tmpDict 有 1 个项目(一个 NSDictionary)时,for (NSDictionary *d in tmpDict) 会获取字典中的每个键/值项目,这是异常(exception)的原因。否则,如果 tmpDict 有 2 个以上项目,则它是 NSDictionary 的 NSDictionary,并且效果很好。我需要一种仍然使用 for 循环来解决这个问题的方法。有想法吗?

-- 更新 2*

实际上这段代码可以工作,但它是多余的:

if ([tmpObject isKindOfClass:[NSDictionary class]]) {
tmpID = [[tmpObject objectForKey:@"id"] integerValue];
tmpProp2 = [tmpObject objectForKey:@"prop2"];
tmpProp3 = [tmpObject objectForKey:@"prop3"];
tmpProp4 = [tmpObject objectForKey:@"prop4"];
} else if ([tmpObject isKindOfClass:[NSArray class]]) {
for (NSDictionary *d in tmpObject) {
tmpID = [[d objectForKey:@"id"] integerValue];
tmpProp2 = [d objectForKey:@"prop2"];
tmpProp3 = [d objectForKey:@"prop3"];
tmpProp4 = [d objectForKey:@"prop4"];
}
}

它需要改进。

最佳答案

我很惊讶它居然能起作用。对于字典,快速枚举会枚举。这就是为什么它告诉您 -objectForKey: 已发送到 NSCFString,因为来自 JSON 的字典的键始终是字符串。

也许你应该这样做:

for (id d in [tmpDict objectEnumerator])
{
// Objects in a JSON dictionary aren't necessarily dictionaries
if([d isKindOfClass:[NSDictionary class]])
{
tmpID = [[d objectForKey:@"id"] integerValue];
}
}
<小时/>

它可以与两个字典一起使用的一个可能原因是顶级项目实际上是一个数组,而不是字典。如果您有:

[ { "id" : 1 }, { "id" : 2 } ]

您的 JSON 解析器将为您提供一个 NSArray,而不是 NSDictionary,即使您假设您的顶级项目是字典,也可以使用您的代码对其进行解析。

编辑:看到您的更新后,我确信这就是正在发生的事情。如果您有一个对象,您的 JSON 字符串如下所示:

{ "id" : 1, "prop2" : "value1", "prop3" : "value1", "prop4" : "value1" }

如果你有两个对象,它可能看起来像:

[
{ "id" : 1, "prop2" : "value1", "prop3" : "value1", "prop4" : "value1" },
{ "id" : 2, "prop2" : "value1", "prop3" : "value1", "prop4" : "value1" }
]

注意方括号,这表示 JSON 数组。

关于iphone - NSDictionary for 循环异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7145612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com