Мне нужно принять NSMutableDictionary пар ключ-значение строк, и мне нужно скопировать в карту STL. Есть ли простой способ сделать это?
Я пробовал это, но это не работает.
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;
}
Почему вы используете 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
,
Других решений пока нет …