Вы можете заставить это работать, используя методы, определенные в протоколе NSKeyValueCoding
, чтобы преобразовать экземпляры вашего пользовательского класса в экземпляры NSDictionary
перед их записью.Вы можете сделать аналогичное преобразование после чтения файла plist обратно, чтобы воссоздать объекты.
Вот пример, который преобразует массив экземпляров пользовательского класса Book
в массив словарей, используя dictionaryWithValuesForKeys:
метод, объявленный в NSKeyValueCoding
(и реализованный NSObject
, поэтому все объекты наследуют это поведение):
+ (NSArray *)dictionariesFromBooks:(NSArray *)books
{
NSMutableArray *bookDicts = [NSMutableArray arrayWithCapacity:[books count]];
for (Book *currBook in books)
{
NSDictionary *currDict = [currBook dictionaryWithValuesForKeys:[Book keys]];
[bookDicts addObject:currDict];
}
return bookDicts;
}
Аналогично, вот метод, который заполняет экземпляры Book
с использованием метода NSKeyValueCoding
setValuesForKeysWithDictionary:
+ (NSArray *)booksFromDictionaries:(NSArray *)bookDicts
{
NSMutableArray *books = [NSMutableArray arrayWithCapacity:[bookDicts count]];
for (NSDictionary *currDict in bookDicts)
{
Book *currBook = [[Book alloc] init];
[currBook setValuesForKeysWithDictionary:currDict];
[books addObject:currBook];
[currBook release];
}
return books;
}
Немного поработав, это можно сделать каскадно для вложенных пользовательских объектов.Например, если Book
содержал вложенный экземпляр Author
, вы можете переопределить NSKeyValueCoding
методы, такие как setValue:forKey:
и dictionaryWithValuesForKeys:
, чтобы преобразовать экземпляр на лету.