iPhone: Дублирование ключевых проблем с NSMutableDictionary - PullRequest
0 голосов
/ 25 января 2012

Я получаю данные в формате XML с сервера и анализирую их в сценарии.У меня проблемы с помещением этих данных в ключ, значение пары с помощью NSMutableDictionary.Потому что ключ NSMutableDictionary является уникальным.Таким образом, он перезаписывает ключ с существующим предыдущим значением, если такие же ключи поступают из xml.Например: мои XML-данные приведены ниже.

<?xml version='1.0' encoding='utf-8'?><order>
            <number>123</number>
            <detail>

                <name>shoe</name> 
                <description>This is from nike</description>
                <price>10.00</price>

                <name>discount</name> 
                <description>This is from Arrow</description>
                <price>-1.00</price>

                <name>bag</name> 
                <description>This is a leather one</description>
                <price>10.00</price>

            </detail>
          </order>

[appDelegate.finalOrderDict setObject:trimmString forKey:elementName];

Я пытаюсь поместить данные в пару ключ-значение, используя NSMutableDictionary, потому что я буду показывать вывод в другом представлении, как показано ниже.

Summary:
Shoe     $ 10.00
Discount $ -1.00   
Bag      & 10.00
Discount $ -2.00 

Но, поскольку ключи повторяются одинаково, он перезаписывает данные из существующего.

Может ли кто-нибудь помочь мне разрешить дублирование ключа в случае, если в данных присутствуют одинаковые ключи, и мы пытаемся поместить это в NSDictionary.

Спасибо!

1 Ответ

3 голосов
/ 25 января 2012

NSDictionary ведет себя как задумано - при вызове -setObject:forKey: существующая пара ключ-значение перезаписывается, если старый ключ и новый ключ отвечают YES на -isEqual:.Звучит так, будто вам нужно изменить структуру данных.

Одной из идей было бы иметь appDelegate.finalOrderDict вместо NSArray объектов NSDictionary.Тогда каждый NSDictionary будет иметь пары ключ-значение «имя» и «цена».

Вы также можете преобразовать каждое значение в массив, если оно уже существует:

id existingValue = [appDelegate.finalOrderDict objectForKey:forKey:elementName];
if ([existingValue isKindOfClass:[NSMutableArray class]]) {
    [existingValue addObject:trimmString];
} else if (existingValue) {
    [appDelegate.finalOrderDict setObject:[NSMutableArray arrayWithObjects:existingValue, trimmedString, nil] forKey:elementName];
} else {
    [appDelegate.finalOrderDict setObject:trimmedString forKey:elementName];
}

Этот подхододнако, более рискованно, так как вы должны проверить все объекты, полученные из finalOrderDict, чтобы проверить, являются ли они строками или массивами.

...