2011-04-26 26 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