Глубокая изменчивая копия NSDictionary в NSMutableDictionary - PullRequest
2 голосов
/ 25 февраля 2012

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

NSDictionary *defaultRows;
NSMutableDictionary *rows;

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
defaultRows = [[[NSDictionary alloc] initWithContentsOfFile: plistPath] objectForKey:@"rows"];

Вот так я пытаюсь создать копию оригинального словаря (согласно рекомендация Apple) :

rows = [NSMutableDictionary dictionaryWithDictionary: defaultRows];

Когда я пытаюсь изменить содержимое строк словаря с помощью:

[[[rows objectForKey:self.company.coaTypeCode] objectForKey:statementType] removeObjectsAtIndexes:rowsToDelete];

Я получаю ошибку времени выполнения *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object'.

Я прочитал статью здесь , но интересно, есть ли более элегантный метод для реализации глубокой копии?

Ответы [ 2 ]

8 голосов
/ 25 февраля 2012

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

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
NSData *rowsData = [NSData dataWithContentsOfFile:plistPath];

NSMutableDictionary *rows = [NSPropertyListSerialization propertyListWithData:rowsData
    options:NSPropertyListMutableContainers format:NULL error:NULL];
1 голос
/ 25 февраля 2012

Рассматривали ли вы использовать

NSMutableDictionary *rows = [[[NSMutableDictionary alloc] initWithContentsOfFile:plistPath] objectForKey:@"rows"];
...