【问题标题】:Loop through NSArray of objects that has no id's - Objective C循环遍历没有id的对象的NSArray-Objective C
【发布时间】:2017-08-01 20:33:25
【问题描述】:

我有一个如下所示的 NSArray

[{
   "Id":"456",
   "Type":"Dog",
   "Sound":"Bark",
},
{
   "Id":"789",
   "Type":"Cat",
   "Sound":"Meow",
}]

我尝试了以下

for (id key in array) { // Doesn't work
  NSLog(@"%@", key[@"Type"]);
}

我试过了

NSLog(@"%@", [array firstObject]); // Doesn't work

但这不起作用,因为没有可访问的 ID。我得到了两个NSInvalidArgumentException。我如何成功地遍历我拥有的两个对象并打印出类型?

【问题讨论】:

  • 看起来你的数组变量不是 NSArray 子类。添加断点并检查它。
  • 是的,您的代码看起来不错。数组是如何设置的?你怎么知道内容是什么?发布该代码,您将更有可能获得有用的答案。
  • 如果[array firstObject] 为您提供NSInvalidArgumentException,则array 不是NSArray。阅读错误消息,看看它到底是什么。
  • 输入真实代码。看来您不知道向我们隐瞒太多信息。您需要显示真实代码、获取数据的方式,还需要显示NSInvalidArgumentException 的真实完整错误消息。它有很多调试信息,但你对我们隐藏了它们。

标签: ios objective-c arrays nsarray


【解决方案1】:

这有点令人困惑,因为你说:

I have an NSArray that looks like the following

[{
   "Id":"456",
   "Type":"Dog",
   "Sound":"Bark",
},
{
   "Id":"789",
   "Type":"Cat",
   "Sound":"Meow",
}]

但是,你也说:

NSLog(@"%@", [数组 firstObject]); // 无效

当然,您没有指出“不起作用”是什么意思……它会引发错误吗?它什么都不输出吗?它会输出一些东西,但不是你所期望的吗?

但是,如果您确实有一个“看起来像那样”的数组,那么让我们看看它实际上是什么......

我们可以将字典视为:

{ key1:value1, key2:value2, key3:value3, etc... }

我们可以把数组想象成:

[object1, object2, object3, etc...]

因此,假设您的示例数据 在有效的NSArray 中具有类似的结构,这意味着您有一个包含 2 个 Dictionary 对象的数组。如果你想将它们输出到控制台,你可以这样做:

// log the first object in the array
NSLog(@"%@", [array firstObject]);

输出应该是字典:

{
    Id = 456;
    Sound = Bark;
    Type = Dog;
}

你也可以这样做:

// for each element (each Dictionary) in array, output the dictionary
for (NSDictionary *d in array) {
    NSLog(@"%@", d);
}

导致:

...[1234:4321] {
    Id = 456;
    Sound = Bark;
    Type = Dog;
}

...[1234:4321] {
    Id = 789;
    Sound = Meow;
    Type = Cat;
}

最后:

// for each element (each Dictionary) in array
for (NSDictionary *d in array) {
    // for each Key in each Dictionary
    for (NSString *key in [d allKeys]) {
        NSLog(@"%@ - %@", key, d[key]);
    }
}

这会给你:

...[1234:4321] Sound - Bark
...[1234:4321] Id - 456
...[1234:4321] Type - Dog
...[1234:4321] Sound - Meow
...[1234:4321] Id - 789
...[1234:4321] Type - Cat

请注意,字典是*无序的,所以不要指望每次都以相同的顺序遍历键。

希望这是有道理的。当然,你仍然需要弄清楚为什么你认为你有一个 NSArray 而你却没有。

【讨论】:

  • 谢谢,我在执行这些操作时遇到的错误是“由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[__NSCFString firstObject]: unrecognized selector sent to instance 0x600000253e00'”,这导致我假设你说它不是 NSArray 时是正确的。但是为什么我首先能够创建一个看起来像这样的 NSArray 呢?如果我有一个看起来相同的 NSDictionary,那也是不正确的吗?
  • 你是什么意思“看起来像这样”?你怎么看“那个”?您如何创建您正在查看的任何对象?它来自哪里?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多