Ios 使用NSDictionary创建模型对象
这是我一直在玩的东西,我还没有下定决心 查询数据库时,使用响应中的数据创建自定义模型对象是非常常见的。让我们以“书”为例 我收到了描述多个Ios 使用NSDictionary创建模型对象,ios,objective-c,json,Ios,Objective C,Json,这是我一直在玩的东西,我还没有下定决心 查询数据库时,使用响应中的数据创建自定义模型对象是非常常见的。让我们以“书”为例 我收到了描述多个Book对象的JSON。我将JSON解析为NSDictionarys的NSArray。我现在有几个选择: 使Book上的所有属性都可变(我讨厌这个选项)。然后,您可以使用NSDictionarys的NSArray,创建一个BookManager类,并将字典中的数据映射到正确的属性 向接受重要细节的Book对象添加一个初始化器 例如: - (instance
Book
对象的JSON
。我将JSON
解析为NSDictionary
s的NSArray
。我现在有几个选择:
- 使
上的所有属性都可变(我讨厌这个选项)。然后,您可以使用Book
s的NSDictionary
,创建一个NSArray
类,并将字典中的数据映射到正确的属性BookManager
- 向接受重要细节的
对象添加一个初始化器Book
- (instancetype)initWithTitle:(NSString *)title author:(NSString *)author publishDate:(NSDate *)publishDate;
前面提到的BookManager
类可以像以前一样使用NSDictionary
s,但是使用这个初始化器创建Book
对象。这很好,因为您可以将书籍
上所有面向公众的属性设置为只读。然而,这是非常有限的,如果(通常情况下)模型上有很多属性,这是不可行的
- 向
Book
添加一个初始值设定项,该初始值设定项接受自身的NSDictionary
表示。在某种程度上,我不喜欢这种方法,因为我觉得模型的责任不是从字典中创建自己。我更喜欢管理类将字典映射到模型的想法。但是,我确实喜欢这样一个事实,即它意味着所有属性都可以是只读的
毫无疑问,在我看来,我错过了其他选择,如果您知道,请指出。这个问题的目的是最终确定实现这个场景的最佳方法。我认为您可以使用JSONModel来实现这一点
看到这个了吗
我经常对重要参数使用init方法,但是是的,当参数数量达到两位数和/或几个参数可能为零时,它会变得非常笨拙。我在iOS SDK中见过的最长的这种方法是CLLocation
- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate
altitude:(CLLocationDistance)altitude
horizontalAccuracy:(CLLocationAccuracy)hAccuracy
verticalAccuracy:(CLLocationAccuracy)vAccuracy
course:(CLLocationDirection)course
speed:(CLLocationSpeed)speed
timestamp:(NSDate *)timestamp
关于最后一个选项,将initWithDictionary:
方法添加到Book
可以扩展为还包括用于从NSDictionary
创建Book
实例的类级方法
+ (instancetype)bookWithDictionary:(NSDictionary *)dictionary
以及从书籍
实例获取字典表示的一种方便方法
- (NSDictionary *)dictionaryRepresentation
如果您在iOS文档中搜索“withDictionary”和“dictionaryRepresentation”,您将看到一些使用此功能的地方。在其他SDK中,您有时会看到名为someObjectFromDictionary:
的方法,这基本上是让模型本身将字典键映射到它们各自的属性。对于一般情况,我更喜欢接受字典的init方法。这个方案非常灵活,当您有一个超类或带有子对象的内部字典时,它会自然地“级联”,如果您愿意,您可以使用一个利用KVC进行一些初始化的公共核心。(提示,使用可变字典并在“使用”键时删除键。然后,剩下的任何键都可以被“公共核心”使用。)查看Mantle-可能更简单、更通用此模式的不幸部分是,您将为函数参数保留的所有详细信息移动到一组字符串中。在字典中用模棱两可的类型将其复合,你会回到你开始的地方,但比以前更不安全。