NSDictionary, содержащий NSArray - PullRequest
       4

NSDictionary, содержащий NSArray

1 голос
/ 03 апреля 2011

Я очень плохо знаком с Objective-C и не имел большого опыта работы с C, поэтому прошу прощения за мое невежество. У меня такой вопрос: возможно ли добавить массив в словарь? Вот что я бы сделал в Python, и это очень удобно:

if 'mykey' not in mydictionary:
    mydictionary['mykey']=[] # init an empty list for 'mykey'
mydictionary['mykey'].append('someitem')

Я хочу что-то вроде этого, что работает:

NSMutableDictionary *matchDict = [NSMutableDictionary dictionary];
NSMutableArray *matchArray = [NSMutableArray array]; 

while (blah):
    [matchDict setObject: [matchArray addObject: myItem] forKey: myKey];

Я посмотрел везде без удачи, просто собирался сдаться. Любые отзывы будут оценены!

Ответы [ 3 ]

5 голосов
/ 03 апреля 2011

Это не очень отличается от того, что вы делали в Python.

NSMutableDictionary *matchDict = ...
NSMutableArray *matchArray = ...
[matchDict setObject:matchArray forKey:someKey];
// This is same as: mydictionary['mykey']=[]


// 'matchArray' is still a valid pointer so..
[matchArray addObject:someObj];

// or later if 'matchArray' were no longer in scope 
// it would look like this:

NSMutableArray* arrayForKey = [matchDict objectForKey:someKey];
[arrayForKey addObject:someObj];

// or more simply:
[[matchDict objectForKey:someKey] addObject:someObj];

// this is same as: mydictionary['mykey'].append('someitem')

edit

Так что если вам нужно добавить массивы для более чем одного ключа, вы можетесделать это:

Учитывая массив из двух ключей:

NSArray *keys = [NSArray arrayWithObjects:@"key0",@"key1", nil];

И словарь ...

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:[keys count]];

Вот как вы можете создать массив для каждогоключ:

for (id key in keys) {

    // Create a new array each time...

    NSMutableArray *array = [NSMutableArray array];

    // and insert into dictionary as value for this key

    [dict setObject:array forKey:key];
}

Надеюсь, это даст вам идею.

1 голос
/ 03 апреля 2011

Вот как это сделать:

    [matchDict setObject:matchArray forKey:@"myKey"];

Я должен был задать этот вопрос сам 3 месяца назад, так что не слишком волнуйтесь насчет вопроса;)

0 голосов
/ 07 апреля 2011

Подумав об этом, я решил проблему.Если вы хотите динамически заполнять массив для каждого ключа, вы делаете это следующим образом:

While (something)
{
    // check if key is already in dict.
    if ([_matchesDictionary objectForKey: hashKey]) 
        {
            // pull existing array from dict and add new entry to array for said key.
            NSMutableArray *keyArray = [_matchesDictionary objectForKey: hashKey];
            [keyArray addObject: newPath];

            // put the array back into the dict for said key.
            [_matchesDictionary setObject: keyArray forKey: hashKey];

     } else {

            // create new array, assign empty array to said key in dict.
            NSMutableArray *keyArray = [NSMutableArray array];
            [keyArray addObject: newPath];
            [_matchesDictionary setObject: keyArray forKey: hashKey];

     } 

}

Это приведет к {('value1', value2 'и т. Д.):' Somekey '}

Спасибо @Antal и @Firoze за помощь, вы помогли мне разобраться.Просто нужно перестать думать "Питон".Если кто-либо из вас увидит какую-либо проблему или лучшую реализацию, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...