NSDictionary 与自定义对象

Posted

技术标签:

【中文标题】NSDictionary 与自定义对象【英文标题】:NSDictionary vs. custom object 【发布时间】:2011-11-21 09:48:01 【问题描述】:

问题很简单:当我创建一个新的 API 或服务类时,我应该为正在传递的对象创建一个自定义类,还是应该坚持使用 NSDictionary,它只是将数据保存在一个键中-值样式格式。

显然有利有弊,但你们认为使用其中一个的门槛在哪里?

NSDictionary:

+ 无依赖+ 非常灵活+ 常用+ 内置支持NSCoding- 结构未定义 -> 运行时错误

自定义对象:

+ 结构定义+ 属性样式访问器:myObject.someProperty - 可能导致 rel。嵌套对象的大量类

更新:包含来自jbat100的评论

【问题讨论】:

这取决于您的喜好。例如,我总是有一个业务层逻辑 (BLL),通常会制作自定义对象。 【参考方案1】:

我通常有一组领域模型,它们更适合 iPhone 开发的 MVC 方法。拥有特定对象还可以让您更轻松地实施类型安全,并且从长远来看还可以降低复杂性。如果你有 NSDictionaries 包含 NSArrays 和更多 NSDictionaries 等来表示你的对象图,它很快就会变得难以管理。

【讨论】:

【参考方案2】:

这实际上取决于您期望您的数据模型改变多少。一旦您拥有基于自定义类的数据模型,处理更改可能会很棘手,特别是当您拥有不同版本的模型(在您的应用程序的已发布版本中)的存档(NSCoding 内容)时,您必须非常小心以确保向后兼容性和避免令人讨厌的运行时意外。在这方面,如您所说,基于 NSDictionary 的模型更加灵活。但是,它们不允许自定义类所做的所有自定义检查和行为。此外,自定义类使不熟悉代码的编码人员的数据模型更加明确,根据我的经验,开发人员在处理基于 NSDictionary 的模型时经常会变得草率(尤其是在没有经验的情况下),这可能会很快导致难以理解的混乱,所以如果你失败了路线,做好记录并遵守纪律!

【讨论】:

感谢您提到关于 NSCoding 的观点,我不知道这种情况。我将此添加到赞成和反对的列表中【参考方案3】:

如果您需要只读访问并且不需要方法,您可以执行以下操作:

@interface NSDictionary (MyClassCategory)
-(NSString*) someField;
@end

@implementation NSDictionary (MyClassCategory)
-(NSString*) someField 
    return [self objectForKey:@"someField"];

@end

typedef NSDictionary MyClass;

并使用它:

 MyClass* myClass = ...;
    NSString* value = [myClass someField];

【讨论】:

创建类别而不是创建自定义类有什么意义?

以上是关于NSDictionary 与自定义对象的主要内容,如果未能解决你的问题,请参考以下文章

Quickblox 内容与自定义对象文件

Alamofire.request 不与自定义对象映射

Python设置与自定义对象的差异

字典与自定义对象的相互转换

如果通过 API 创建,Backand 用户对象不与自定义用户对象关联

Flutter ReorderableListView 与自定义对象