前言
作為一個優秀的程序員,或者想成為優秀的程序員,最基本的你得有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 主站蜘蛛池模板: 五峰| 黄梅县| 岱山县| 东至县| 肃南| 木兰县| 耒阳市| 越西县| 綦江县| 淮北市| 新宾| 鱼台县| 抚宁县| 信丰县| 奎屯市| 青神县| 武功县| 龙泉市| 宁晋县| 岳池县| 高淳县| 浙江省| 伊宁县| 青海省| 台前县| 内乡县| 绥德县| 永泰县| 龙海市| 西盟| 富顺县| 腾冲县| 泌阳县| 绥宁县| 抚宁县| 乌什县| 体育| 巫溪县| 迁安市| 隆德县| 新宁县|