objective-c - 如何在 objective-c 中实现 Perl 哈希?

标签 objective-c nsarray nsdictionary

我浏览了许多网站和教程以及 Apple 文档,但仍然没有找到解决方案:在我看来,NSArray、NSDictionary 和它们的可变对应物根本不像 Perl 的简单功能哈希。我当然希望我是错的。

我需要的是:动态键 和值的可变结构(1 个键 - 1 个值,就这么简单)!我的意思是,我事先不知道 key ,我需要轻松检查 key 是否存在,如果存在则检索值或更新它,如果不存在则输入具有新值的新 key 。我需要的值是 float ,而不是对象或数组。完成填充结构后,我需要能够检索键并最终通过检索到的键循环遍历值。

所有这些都可以在 Perl 中使用以下命令轻松完成:

    my %expenses;

    if (exists $expenses{$key}) {
       $expenses{$key} += $amount;
    } else {
       $expenses{$key} = $amount;
    }

[...]

有没有人可以告诉我如何在不使用原始类型的情况下在 objective-c 中实现类似的东西?

非常感谢您的帮助。 法布里齐奥

最佳答案

Cocoa 和 Core Foundation 集合类通常面向存储对象而不是原始值;像您这样的问题的通常解决方案是将 float 包装在 NSNumber 对象中。不幸的是,获取和设置对象的语法比 Perl 的语法更冗长

除此之外,NSMutableDictionary 应该完全按照您的意愿行事。键可以是任何字符串,或任何其他可以复制的对象(即它符合 NSCopying 协议(protocol)),您可以获得所有键的列表,并且您可以通过简单地尝试检查字典中是否“存在”键获取相应的值。与您的示例相对应的代码可能如下所示:

// NB: there no autovivification in Objective-C. Be sure to initialize this somewhere
// before using it!
NSMutableDictionary *expenses;

if ([expenses objectForKey:key]) {
    // This *could* be done in one statement. But it would be very long, so I split
    // it in two for clarity.
    float currentValue = [[expenses objectForKey:key] floatValue];
    [expenses setObject:[NSNumber numberWithFloat:currentValue + amount] forKey:key];
} else {
    [expenses setObject:[NSNumber numberWithFloat:amount] forKey:key];
}

关于objective-c - 如何在 objective-c 中实现 Perl 哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5785275/

相关文章:

ios - 将超链接添加到来自 iOS 应用程序的电子邮件中的预加载文本中

ios - 从核心数据创建 JSON

ios - 给定一个 NSDictionary 对象数组如何获取所有键?

python - 将 "NS.time"从 plist 转换为实际时间

ios - 错误 : Linker command failed: duplicate symbol for architecture x86_64

iphone - 在 uitableview 中间插入单元格

ios - 动态添加到字典

ios - NSSet Iteration 比 NSMutableArray Iteration 消耗更多时间,NSArray Iteration 比 NSMutableArray Iteration 消耗更多时间

cocoa - 按数组中包含的 int 对 NSArray 进行排序

ios - 比较两个数组的内容并找出差异