2013-01-20 27 views
0

我需要接受字符串鍵值對的NSMutableDictionary,我需要複製到stl映射。有沒有簡單的方法來做到這一點? 我試過這個,但這不起作用。如何將值從NSMutableDictionary複製到地圖?

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; 
    [dictionary setObject:@"10" forKey:@"6"]; 
    [dictionary setObject:@"10" forKey:@"7"]; 
    [dictionary setObject:@"10" forKey:@"8"]; 

    NSEnumerator *enumerator = [dictionary keyEnumerator]; 
    NSString *key; 
    while ((key = [enumerator nextObject])) { 
     std::string *keyString = new std::string([key UTF8String]); 
     std::string *valueString = new std::string([[dictionary objectForKey:key] UTF8String]); 
     map[*keyString] = *valueString; 
    } 

回答

2

你爲什麼要用new?只是-UTF8String結果直接傳遞到地圖,它將把它們變成std::string給你的:

map[[key UTF8String]] = [[dictionary objectForKey:key] UTF8String]; 

您現有的new代碼不僅是無用的,但它也泄露的字符串。


你也應該溝NSEnumerator。我們已經有更好的方法來列舉幾年來的字典了。具體而言,您可以使用快速枚舉,也可以使用基於塊的枚舉。快速枚舉循環如下所示:

for (NSString *key in dictionary) { 
    map[[key UTF8String]] = [[dictionary objectForKey:key] UTF8String]; 
} 

基於塊的枚舉會是這樣的:

// if map is a local variable it must be declared with __block 
// like __block std::map<std::string,std::string> map; 
// If it's static, global, or an instance or member variable, then it's fine as-is 
[dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop){ 
    map[[key UTF8String]] = [value UTF8String]; 
}]; 

在這種情況下,我會建議快速枚舉循環,因爲它不需要修改聲明map

+0

這太棒了。你也可以評論如何做到相反,即轉換映射到NSMutableDictionary?我可能有一個解決方案,但由於我是Obj-C的初學者,我非常喜歡你的輸入。 – unj2

+0

@ kunj2aan:在地圖上迭代,並使用'[NSString stringWithUTF8String:str.c_str()]'將每個'std :: string'轉換爲'NSString *'。 –

相關問題