前言
作為一個優秀的程序員,或者想成為優秀的程序員,最基本的你得有MVC編程思想,那么你就要對JSON獲取的數據建Model,將service和controller層都分離,從而做到低耦合。現在有很多利用runtime能快速的將json數據轉為一個Model。但是我在做項目的時候,發現創建Model(特別是屬性特多的)寫屬性代碼很浪費時間,降低了編程效率。后來我自己就寫了個好玩的能省去時間創建Model的一個方法,下面話不多說了,來一起看看詳細的介紹吧
Immutable Model
我們以UserModle為例,我們可以像這樣創建:
public class UserModel: NSObject { public var userId: NSNumber public var name: String? public var email: String? public var age: Int? public var address: String? init(userId: NSNumber) { self.userId = userId super.init() }}用的時候可以像這樣:
let userModel = UserModel(userId: 1)user.email = "335050309@qq.com"user.name = "roy"user.age = 27user.address = "上海市楊浦區"
這樣創建一個User對象好處是彈性很大,我可以隨意選擇設定某個property的值,但是背后同樣帶有很大的缺點,就是這個Model變得異常開放,不安分,這種Model我們一般叫Mutable Model。有的時候我們需要Mutable Model,但大部分的時候出于數據安全和解耦考慮我們不希望創建的property在外部可以隨意改變,在初始化后不可變的Model叫做Immutable Model,在開發中我的建議盡量使用Immutable Model。我們通過把property設置成readonly,在Swift可以用let或者private(set)。也就是這樣:
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? }那么怎么寫初始化方法呢?
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安全可靠,大多數時候是有效的,但是也有一些缺點:
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 }}很顯然這解決上一種第一個缺點,但是還是有一個不足之處:
Mutable subclass
我們看看Improving Immutable Object Initialization in Objective-C關于這個是怎么描述的
We end up unsatisfied and continue our quest for the best way to initialize immutable objects. Cocoa is a vast land, so we can 主站蜘蛛池模板: 乐至县| 永州市| 平舆县| 陈巴尔虎旗| 莒南县| 安远县| 太保市| 金溪县| 博罗县| 姚安县| 瓦房店市| 汉川市| 新丰县| 紫金县| 邵阳县| 从化市| 莱州市| 阿瓦提县| 麦盖提县| 东山县| 贵德县| 昭平县| 黔东| 安岳县| 富宁县| 龙井市| 天祝| 彰武县| 文昌市| 吉木乃县| 开化县| 和平区| 高密市| 崇文区| 峨边| 泰来县| 理塘县| 额尔古纳市| 阿拉尔市| 满洲里市| 义马市|