使用初始值设定项与计算属性进行解析的优点/缺点

时间:2018-09-06 11:39:03

标签: ios swift parsing properties data-modeling

假设我有一个json数据对象,我想将其解析为我自己的对象。我遇到了两种方法。第一种是使用这样的初始化程序:

class DataModelOne {

   let firstProperty: String?
   let secondProperty: String?

   init(json: [Sting: AnyObject]) {
     self.firstProperty = json["firstProperty"] as? String
     self.secondProperty = json["secondProperty"] as? String
   }
 }

这将这样称呼:

let object = DataModelOne(json: data)

数据是您要解析的JSON。

我遇到的第二种方法是使用计算属性:

class DataModelTwo {

 let json: [String: AnyObject]

 init(json: [String: AnyObject]) {
   self.json = json
 }

 var firstProperty: String? {
   return json["firstProperty"] as? String
 }

 var secondProperty: String? {
   return json["secongProperty"] as? String
 }
}

这将以与上面相同的方式初始化:

let object = DataModelTwo(json: data)

除了使用DataObjectTwo强制转换数据后无法设置属性的事实(因为这些属性是计算属性,因此只能获取)之外,使用这两种方法进行解析的优缺点是什么?

1 个答案:

答案 0 :(得分:1)

我看不出计算出的属性有任何真正的优势。我更喜欢第一种选择,因为:

  1. 这会将您的数据模型与JSON分离。使用第一个选项,您可以实例化一个DataModelOne而没有任何JSON,并手动分配属性。
  2. 这很清楚,因为解析发生在一个地方。
  3. 您不必像使用计算所得的属性那样保留字典。因此,如果字典中包含许多其他可以丢弃的数据,则可以释放一些内存。

我能想到的计算属性的唯一优点是,它延迟了对Dictionary的访问。如果您从未访问过某个属性,则永远不必首先进入字典。但是性能的提高可以忽略不计。

最后,我将初始化器重命名为init(values:)之类的东西。您不是使用JSON进行初始化,而是使用普通的Swift字典。