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 } }










