gpt4 book ai didi

cocoa - 从 NSDictionary 迁移到 Object 的最佳方法

转载 作者:行者123 更新时间:2023-12-03 17:48:19 26 4
gpt4 key购买 nike

我有一个符合 NSCoding 的对象(并且已存档到磁盘)。该对象 (myMetrics) 的一个属性是 NSDictionary。在该软件的新版本中,我需要向该字典添加一个键,但我需要在应用程序的其余部分使用主对象之前执行此操作,因为它是必需的键。

我的想法是做类似的事情:

-(id)initWithCoder:(NSCoder *)coder
{
if (self = [super init])
{
self.myMetrics = [coder decodeObjectForKey:@"myMetrics"];
... other properties go here ....
}

.... add the new key to myMetrics with default value if it is missing in myMetrics ...

return (self);
}

我真正想做的是将 myMetrics 从字典转换为它自己的类。我不确定如何处理已经存在的存档对象。我的想法是:

  1. 为 NewMetrics 类添加一个名为 newMetrics 的新属性。
  2. 在 initWithCoder 中,如果找到 myMetrics 属性,则将其数据移至 newMetrics 属性
  3. encodeWithCoder 中仅处理 newMetrics,并且不会重新编码旧字典。

通过这种方式,软件始终使用 NewMetrics 对象,但 initWithCoder 能够处理旧样式的 myMetrics。

有什么好的方法可以在保持相同的属性名称的同时做到这一点吗?

@property (atomic, retain) NSDictionary* myMetrics; //  dictionary of parameters

becomes

@property (atomic, retain) NewMetrics* myMetrics; // parameters

rather than

@property (atomic, retain) NewMetrics* newMetrics; // parameters

有更好的方法吗?

最佳答案

是的,您可以将 myMetrics 从字典转换为其自己的类,而无需重命名属性,同时仍处理现有的存档对象。新的属性声明将是:

@property (atomic, retain) NewMetrics* myMetrics; // parameters

initWithCoder: 函数类似于:

-(id)initWithCoder:(NSCoder *)coder
{
if (self = [super init])
{
// decode saved NewMetrics object
self.myMetrics = [coder decodeObjectForKey:@"newMyMetrics"];
if (!self.myMetrics) {
// fall back to legacy saved metrics NSDictionary
NSDictionary *legacyMetrics = [coder decodeObjectForKey:@"myMetrics"];
if (legacyMetrics) {
self.myMetrics = [[NewMetrics alloc] initWithDictionary:legacyMetrics];
} else {
// handle having no saved metrics
}
}

... other properties go here ....
}

return self;
}

您必须开始在新 key 下对 myMetrics 属性进行编码,例如@"myNewMetrics",并提供一种将旧式指标字典转换为新 NewMetrics 类实例的方法,例如initWithDictionary:如上所示。

关于cocoa - 从 NSDictionary 迁移到 Object 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40668054/

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