iOS中创建Model的最佳实践记录

2020-01-21 07:23:18于丽

Initializer mapping arguments to properties

当我们把property设置成readonly后,我们只能在init的时候赋值,这个时候就变成这样:


public class User: NSObject {
 
 public var userId: NSNumber
 public var name: String?
 public var email: String?
 public var age: Int?
 public var address: String?
 
 init(userId: NSNumber, name: String?, email: String, age: Int, address: String) {
  
  self.userId = userId
  
  super.init()
  
  self.name = name
  self.email = email
  self.age = age
  self.address = address
 }
}

使用的时候就变成这样:


let user = User.init(userId: 1, name: "335050309@qq.com", email: "roy", age: 27, address: "上海市杨浦区")

这样创建Model安全可靠,大多数时候是有效的,但是也有一些缺点:

  • 如果property很多,init方法就有很多形参,然后变得又臭又长。
  • 有的时候我们只需要Model的某些property,这样我们可能为各个不同的需求写不同的init方法,最终让UserModel变得很庞大。

    Initializer taking dictionary

    初始化的时候注入一个字典,就是下面的样子:

    
    public class UserModel: NSObject {
     
     public let userId: NSNumber
     public private(set) var name: String?
     public private(set) var email: String?
     public private(set) var age: Int?
     public private(set) var address: String?
     
     init(dic: NSDictionary) {
      
      self.userId = (dic["userId"] as? NSNumber)!
      
      super.init()
      
      self.name = dic["name"] as? String
      self.email = dic["email"] as? String
      self.age = dic["age"] as? Int
      self.address = dic["address"] as? String
     }
    }