【问题标题】:Is it possible to use fast enumeration on a NSMutableDictionary?是否可以在 NSMutableDictionary 上使用快速枚举?
【发布时间】:2025-12-18 16:20:03
【问题描述】:

我有如下方法(是ShoppingCart的实例方法):

- (void) showShoppingCartProducts
 {
   for (Product *eachProduct in products)
    {
      [eachProduct logName]
    }
}

我还有一个方法(是ShoppingCart的实例方法):

- (void) addProduct: (Product *) newProduct {
    [products objectForKey: newProduct.name];
}

它应该遍历(NSMutableDictionary *) products中的每个(Product *) eachProduct

logName 执行以下操作(它是Product 的实例方法):

- (void) logName
{
  NSLog(@"%@", self.name);
}

这是我的main() 函数

int main(int argc, const char * argv[]) {

    ShoppingCart* myShoppingCart = [[ShoppingCart alloc] init];

    Product* myProduct = [[Product alloc] init];

    myProduct.name = @"My Latest Product";

    [myShoppingCart addProduct: myProduct];

    [myShoppingCart showShoppingCartProducts];

    return 0;
}

程序运行后返回0,但什么也不显示。

是否可以在 NSMutableDictionary 上使用快速枚举?

【问题讨论】:

  • 你永远不会打电话给showShoppingCartProducts
  • 您没有在代码示例中的任何地方使用showShoppingCartProducts...?
  • 而且你没有向我们展示 Product 是如何声明的,或者其中的数组是如何初始化的。
  • 也许你只需要调出 Xcode 窗口中输出的部分。按右上角these three buttons的中间一个
  • @adam,您的链接显示了一些广告截图。这是故意的吗?

标签: objective-c macos fast-enumeration


【解决方案1】:

这个:

注意:[myShoppingCart addProduct: myProduct] 只是将 (Product) myProduct 添加到 (ShoppingCart *) myShoppingCart 中的 NSMutableDictionary 产品中

解释不够充分。没有“只是将对象添加到NSMutableDictionary”之类的东西。您为字典中的键设置值。 myProduct 是值还是键?如果是价值,关键是什么?如果是关键,价值是什么?

回答基本问题:是的,您可以快速枚举字典。 被枚举。如果您想要每个键的值,则必须使用 -objectForKey: 或下标语法来查找。

如果您认为您正在将对象添加到字典(或任何其他集合)但字典(集合)似乎是空的,那可能是因为您正在处理 nil 指针而不是实际收藏。您忽略了创建集合并存储对它的强引用。


您已编辑问题以显示此方法:

- (void) addProduct: (Product *) newProduct {
    [products objectForKey: newProduct.name];
}

该方法不会将产品添加到字典中。 -objectForKey: 查找一个可能已经在字典中的对象。它不会修改字典。您可能打算这样做:

- (void) addProduct: (Product *) newProduct {
    [products setObject:newProduct forKey:newProduct.name];
}

假设您成功地将Product 实例添加到字典中并且nameNSString*,您的枚举应该如下所示:

for (NSString* name in products)
{
    Product* product = [products objectForKey:name];
    [product logName]
}

【讨论】:

  • 抱歉,我修正了错误。我要记录的值是“Products”类实例的“@property NSString *name”(在本例中,我有一个:myProduct)
  • 那么,NSMutableDictionary 没有问题,只是方法不对?不过,当我使用正确的方法(你给我的)时,结果是一样的。
  • 你确定products 实例变量(我假设它是一个实例变量)不是nil 吗?尝试记录它。另外,显示它的设置位置。这可能应该在-[ShoppingCart init] 的实现范围内。
  • 这很好。 @property 是作为 setter/getter 方法为我做的,还是我必须自己覆盖它?如果有,怎么做?
  • @property 声明一个属性,这通常相当于声明(但不定义)访问器方法。 @synthesize,可以在现代编译器中隐含,可以生成(定义)访问器方法,甚至可以为您生成实例变量(尽管它通常会有一个下划线,例如_products;您将无法只需将其称为products)。但是,变量只是指向对象的指针的持有者。它不会创建对象本身。你需要这样做。例如,_products = [[NSMutableDictionary alloc] init]; 中的 -init