1
for(id key in stats) {
    NSLog(@"key=%@ value=%@", key, [stats objectForKey:key]);
}

我有一个数组字典,每个数组本身都有许多数组。它是字典中的多维数组。

但是上面的代码给了我以下

2012-11-30 21:36:07.203 key=main cat c value=(
"<Food: 0x6e5fb70>"
)
2012-11-30 21:36:07.205 key=main cat b value=(
"<Food: 0x6e5fa00>",
"<Food: 0x6e5faa0>"
)
2012-11-30 21:36:07.207 key=bakery_products value=(
"<Food: 0x6e5f510>",
"<Food: 0x6e5f660>",
"<Food: 0x6e5f700>",
"<Food: 0x6e5f810>",
"<Food: 0x6e5f900>",
"<Food: 0x6e5d5d0>"
)

如何访问那些显示为 Food 0x6e5fb70 的数组中的值?

我现在已经花了几个小时了,找不到解决方案。

4

3 回答 3

3

可能是这样的:

for (id key in [stats allKeys]) {
    NSArray *foodArray = [stats objectForKey:key];
    for (Food *food in foodArray) {
        // do stuff with Food object
    }
}

更新(对于 Ploto 的第二条评论):

你是这个意思吗:

NSArray *array = [stats objectForKey:@"bakery_products"];

更新#2 description

- (NSString *)description {
    return [NSString stringWithFormat:@"Food: %@, %@", whatever1, whatever2];
}
于 2012-11-30T21:42:49.540 回答
0

除了@rmaddy 提到的内容之外,如果您使用 Apple LLVM Compiler 4.0 +(我认为它与 xCode 4.4+ 一起提供),那么有一种简洁的方法可以使用文字来完成您需要的工作,根本不需要样板代码。

以下是您的操作方法:

for (id key in [stats allKeys]) {
    for (Food * food in stats[key]) {

        //this is the object you're looking for
        NSLog(@"Object: %@", food);

    }
}

其中 stats 是您的字典对象,它的每个键都有一个数组。更新到 LLVM 4.0 值得为此付出努力:)

如果您选择使用迭代器枚举每个数组,您甚至可以像这样访问对象:

stats[key][i]

于 2012-11-30T22:19:16.347 回答
0

一种更有效的枚举字典的方法

[stats enumerateKeysAndObjectsUsingBlock:^(NSString *category, NSArray *foodItems, BOOL *stop) {
  for (Food *food in foodItems) {
    // do something with food
  }
}];

显然,如果您每次都需要以相同的顺序迭代字典,则需要使用更长的时间

NSArray *sortedKeys = [[stats allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

for (id key in sortedKeys) {
  NSArray *foodArray = [stats objectForKey:key];
  for (Food *food in foodArray) {
    // do stuff with Food object
  }
}
于 2012-11-30T22:20:42.370 回答