2011-04-26 41 views
3

我一直在浏览很多网站和教程以及Apple文档,但仍然没有找到解决方案:在我看来,NSArray,NSDictionary及其可变对象完全不像Perl的简单功能。当然,我希望我错了。如何在Objective-C中实现Perl哈希?

我需要什么:动态键和值(1键-1值,就这么简单)的可变结构!我的意思是,我不提前知道密钥,我需要轻松检查一个密钥是否存在,如果它存在,则检索值或更新值,如果不存在,请使用新值输入新密钥。我需要的值是花车,而不是对象或数组。在完成填充结构之后,我需要能够检索这些键并最终通过检索到的键循环访问这些值。

所有这一切都在Perl是很容易实现下列要求:

my %expenses; 

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

[...] 

有没有人谁可以告诉我如何实现不使用基本类型在Objective-C类似的东西?

非常感谢您的帮助。 Fabrizio

+1

为什么你不能用'NSMutableDictionary'?你的代码不会像Perl版本那么短,但我相信它可以做你需要的一切。不幸的是,它也会让你用'NSNumber'包装你的浮点数。 – LnxPrgr3 2011-04-26 03:10:32

+0

我以为我不能使用它,我以为我尝试了正确的方式,但我错了,因为这里的另外两张海报向我展示了......我很高兴我错了:)谢谢。 – 2011-04-26 10:56:27

回答

1

这工作:

NSString *[email protected]"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); 
+0

胡萝卜顶,我可以放在这里比我的调试控制台的线更好的评论? Ops ...我不能放这么多的字符,但它工作顺利!非常感谢你,我一直在创建一个NSDirearies的NSArray,但看不到简单的方法。非常感谢!!! – 2011-04-26 10:51:28

+0

啊......忘了问两个问题:1)金额/ 2的含义是什么? 2)我的密钥实际上是三个密钥的组合,我可以使用它们并在它们的任何组合上执行搜索吗?我的意思是key1和key2,key1和key2和key3,只有key3等...? – 2011-04-26 11:02:55

+0

'amount/2'只是一个随机数,可以让if子句的第一部分触发。 – 2011-04-26 13:40:07

4

可可和核心基金会的集合类通常面向存储对象而不是原始值;像你的问题通常的解决方案是将浮动包装在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]; 
} 
+0

您需要添加某种'[NSMutableDictionary dictionary]'代码来实例化开支。 – 2011-04-26 09:26:26

+0

谢谢Anomie,你的回答指向了正确的方向,胡萝卜顶使他的代码更简单,但你们都帮了我很多。谢谢! – 2011-04-26 10:55:25

+0

@ carrot-top:Duh。我在* nota bene *评论中指出了这一点。 – Anomie 2011-04-26 15:42:10