2013-03-22 4 views
4

мне нужно следующее в результате:NSDictionary внутри NSMutableArray (IOS)

(

    "some_key" = { 
     "another_key" = "another_value"; 
    }; 

); 

Для того, чтобы сделать это, у меня есть этот код, но он не работает:

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"another_value", @"another_key", nil]; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 
[array setValue:dictionary forKey:@"some_key"]; 

Любой Идея? Благодаря!

+0

Когда я' NSLog', он возвращает '()'. –

+1

В примере, который вы предоставили, используется массив смешивания и синтаксис словаря. Неясно, должен ли результат быть словарь или массив. –

+0

@NikolaiRuhe На самом деле 'setValue: forKey:' отлично действует как аксессуар KVC для 'NSArray'. Поскольку массив пуст, он ничего не делает. – Monolo

ответ

14

Ваша ошибка здесь:

NSMutableArray *array = [[NSMutableArray alloc] init]; 
[array setValue:dictionary forKey:@"some_key"]; 

------------ ^^^^^

Вы устанавливаете это в массив.

Попробуйте это:

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"another_value", @"another_key", nil]; 
NSDictionary *outDict=[[NSDictionary alloc]initWithObjectsAndKeys:dictionary,@"some_key", nil]; 
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:outDict, nil]; 

В новых литералов:

NSDictionary *[email protected]{@"another_key":@"another_value"}; 
NSDictionary *[email protected]{@"some_key":d}; 
NSArray *[email protected][c]; 

Или вложенная создание:

NSArray *[email protected][@{@"some_key":@{@"another_key":@"another_value"}}]; 
+0

Мне нравится вложенное творение лучшее. –

4

NSMutableArray обычно может быть построен только при добавлении объектов до конца , метод addObject:

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"another_value", @"another_key", nil]; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 
[array addObject:dictionary]; 

С другой стороны, если вы хотите обратиться к словарю с помощью ключа (@ «some_key»), то вам нужен внешний контейнер, чтобы быть словарем, тоже:

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"another_value", @"another_key", nil]; 
NSMutableDictionary *outerDict = [NSMutableDictionary dictionary]; 
[outerDict setObject:dictionary forKey:@"some_key"]; 
2

из документов

SetValue: forKey: - Устанавливает свойство приемника, заданного данного ключа к заданному значению.

Это NSKeyValueCoding протокол. Вы используете неправильный метод для добавления объекта в массив, NSArray - это упорядоченная коллекция, а не словарь. Самый простой способ сделать то, что вам нужно:

NSDictionary* dic = @{@"some_key": @{@"another_key": @"another_value"}}; 

Как вы можете видеть на выходе будет NSDictionary не NSArray.

2

Array's не использует setValue:forKey: (а не setObject:forKey:), а массивы не являются ассоциативными, как словари.

setValue:forKey: KVC (кодирование с ключевыми значениями).

Вы хотите массив словарей словарей (ниже в псевдо форме Plist)

<array> 
    <dict> 
    <key>someKey</key> 
    <dict> 
     <key>someOtherKey</key> 
     <string>someValue</string> 
    </dict> 
    </dict> 
    <dict> 
    <key>someKey</key> 
    <dict> 
     <key>someOtherKey</key> 
     <string>someValue</string> 
    </dict> 
    </dict> 
    <dict> 
    <key>someKey</key> 
    <dict> 
     <key>someOtherKey</key> 
     <string>someValue</string> 
    </dict> 
    </dict> 
    <dict> 
    <key>someKey</key> 
    <dict> 
     <key>someOtherKey</key> 
     <string>someValue</string> 
    </dict> 
    </dict> 
</array> 

`

2

Я думаю, что вы ищете такого рода структуры

NSDictionary *anotherKeyValueDictionary = 
[[NSDictionary alloc] initWithObjectsAndKeys:@"another_value", 
               @"another_key", nil]; 
NSDictionary *someKeyValueDictionary = 
[[NSDictionary alloc] initWithObjectsAndKeys:@"anotherKeyValueDictionary", 
               @"some_key", nil]; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 
[array addObject:someKeyValueDictionary]; 
Смежные вопросы