gpt4 book ai didi

objective-c - 使用NSCoding时如何处理字段类型变化

转载 作者:太空狗 更新时间:2023-10-30 03:41:15 25 4
gpt4 key购买 nike

我有以下实现 NSCoding 的类,我已经创建了它的几个实例并将它们保存到文件中。

@interface BiscuitTin ()
@property NSString *biscuitType;
@property int numBiscuits;
@end

@implementation BiscuitTin

- (id)initWithCoder:(NSCoder *)coder {
self = [super init];
if (self) {
self.biscuitType = [coder decodeObjectForKey:@"biscuitType"];
self.numBiscuits = [coder decodeIntForKey:@"numBiscuits"];
}
return self;
}

- (void)encodeWithCoder:(NSCoder *coder) {
[coder encodeObject:self.biscuitType forKey:@"biscuitType"];
[coder encodeInt:self.numBiscuits forKey:@"numBiscuits"];
}

@end

我现在决定,我希望将 numBiscuits 表示为 float(因为可能有部分吃掉的 cookies )。更新属性类型和 encodeWithCoder 工作正常,但是当我尝试从文件加载现有实例时,应用程序崩溃,因为它试图解码 intfloat.

有没有好的方法来处理这个问题?理想情况下,我能够加载现有的 int 值并将其转换为 float,但我不介意只使用默认值而不是崩溃。

我考虑过将适用的 decode 行包装在 try-catch 中,但在我的实际用例中,大约有 50 个左右的属性正在被编码/解码,最好不要必须对每一个改变类型的对象进行显式处理。

最佳答案

当我自己处理这种情况时(我有过几次),我使用版本控制。换句话说,将版本号与其余编码数据一起编码。

即使您从一开始就没有进行版本控制,那也不是什么大问题,您现在可以从版本 1 开始,只处理缺少 version相当于版本 0 的值。

如何?

在您正在编码的对象中存储一个version 字段。最好为此字段使用 intNSInteger

#define CURRENT_VERSION 1
#define MIN_VERSION_WITH_FEATURE_X 1

@implementation BiscuitTin

- (id)initWithCoder:(NSCoder *)coder {
self = [super init];
if (self) {
...
int vers = [coder decodeIntForKey:@"version"];
if (vers >= MIN_VERSION_WITH_FEATURE_X) {
// handle feature X. In your case, decoding a `float`
} else {
// handle prior version.
// In your case, decoding an `int` and converting to `float`
}
}
return self;
}

- (void)encodeWithCoder:(NSCoder *coder) {
...
[coder encodeInt:CURRENT_VERSION forKey:@"version"];
}

@end

每当您添加一个不向后兼容的新功能时,增加 CURRENT_VERSION,添加一个新的 MIN_VERSION_WITH_FEATURE_Y 常量和新的 CURRENT_VERSION整数值,以及 -initWithCoder:if 语句中的另一个分支。

有点乱,但我想这就是向后兼容的代价。 (从好的方面来说,我认为这种技术是相当 self 记录的,因此当您在数月或数年后返回时它很容易使用)。

关于objective-c - 使用NSCoding时如何处理字段类型变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29809392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com