我一直在浏览许多网站和教程,以及Apple文档,但仍未找到解决方案:在我看来,NSArray,NSDictionary及其可变对应物完全不像Perl的简单功能哈希值。我希望我当然错了。
我需要的是:动态键和值的可变结构(1键 - 1值,就这么简单)!我的意思是,我不提前知道密钥,我需要轻松检查密钥是否存在,是否存在检索值或更新它,如果不存在,请输入带有新值的新密钥。我需要值浮点数,而不是对象和数组。在我完成填充结构后,我需要能够检索键,最后通过我检索的键循环遍历值。
所有这些都可以通过以下方式在Perl中轻松完成:
my %expenses;
if (exists $expenses{$key}) {
$expenses{$key} += $amount;
} else {
$expenses{$key} = $amount;
}
[...]
是否有人可以告诉我如何在不使用原始类型的情况下在objective-c中实现类似的东西?
非常感谢您的帮助。 的Fabrizio
答案 0 :(得分:4)
Cocoa和Core Foundation集合类通常面向存储对象而不是原始值;像你这样的问题的通常解决方案是将浮动包装在NSNumber对象中。不幸的是,获取和设置对象的语法比Perl的
更详细除此之外,NSMutableDictionary应该完全符合您的要求。密钥可以是任何字符串,或任何其他可以复制的对象(即它符合NSCopying协议),您可以获得所有密钥的列表,并且您可以通过简单地尝试检查字典中是否存在密钥“存在”获取相应的值。与您的示例对应的代码可能如下所示:
// 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];
}
答案 1 :(得分:1)
这有效:
NSString *key=@"fish";
NSMutableDictionary *expenses = [NSMutableDictionary dictionary];
float amount=22.0;
[expenses setObject:[NSNumber numberWithFloat:amount/2] forKey:key];
if ([expenses objectForKey:key]) {
[expenses setObject:
[NSNumber numberWithFloat:
[[expenses objectForKey:key] floatValue] + amount] forKey:key];
} else {
[expenses setObject:[NSNumber numberWithFloat:amount] forKey:key];
}
NSLog(@"expenses: %@",expenses);