Более старая версия приложения имеет NSCoding
-совместимый класс (назовем его OldItem
), записанный в Objective C. Этот класс имеет около 20 свойств с разными типами:
@property (nonatomic) NSInteger x;
// ...
- (id)initWithCoder:(NSCoder *)coder {
if (self = [super init]) {
_x = [coder decodeIntegerForKey:@"x"];
// all 20 fields are decoded in the similar way
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)coder {
[self.x encodeWithCoder:coder];
// all 20 fields encoded in the similar way
}
Он используется в другом классе (давайте назовем его Controller
) как массив:
@property (nonatomic, strong, nonnull) NSMutableArray<OldItem *> *items;
Controller
также кэширует элементы на диск следующим образом:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.items];
[data writeToFile:@"myfile.txt" options:NSDataWritingFileProtectionComplete error:nil];
Теперь мне нужно перенести OldItem
на Swift, а Controller
изменяет только тип обрабатываемого элемента:
@property (nonatomic, strong, nonnull) NSMutableArray<NewItem *> *items;
Вопрос: как перенести старые данные, сохраненные в myfile.txt
в предыдущей версии приложения, в новую версию?
- В идеале новый класс имеет другое имя, например
NewItem
, но я готов сохранить старое имя, если оно значительно упростит миграцию. - Неважно, будет ли новая версия сохранять данные в тот же файл или однократно читать старый файл и перемещать данные в новый файл.
- В этом вопросе игнорируйте любые различия между
OldItem
и NewItem
. Считайте их прямым портом. - Очевидно, что
NewItem
все равно должен соответствовать NSCoding
, и чтение / запись NewItem
в файл не является проблемой.