国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS中創建Model的最佳實踐記錄

2020-07-26 02:23:03
字體:
來源:轉載
供稿:網友

前言

作為一個優秀的程序員,或者想成為優秀的程序員,最基本的你得有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安全可靠,大多數時候是有效的,但是也有一些缺點:

  • 如果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 }}

很顯然這解決上一種第一個缺點,但是還是有一個不足之處:

  • 如果字典沒有某個屬性對應的key的時候會崩潰,編譯器并不能幫助我們排查這種運行時的崩潰。
  • 不能很好的滿足某些時候只需要Model的某些property的需求。

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

主站蜘蛛池模板: 五峰| 黄梅县| 岱山县| 东至县| 肃南| 木兰县| 耒阳市| 越西县| 綦江县| 淮北市| 新宾| 鱼台县| 抚宁县| 信丰县| 奎屯市| 青神县| 武功县| 龙泉市| 宁晋县| 岳池县| 高淳县| 浙江省| 伊宁县| 青海省| 台前县| 内乡县| 绥德县| 永泰县| 龙海市| 西盟| 富顺县| 腾冲县| 泌阳县| 绥宁县| 抚宁县| 乌什县| 体育| 巫溪县| 迁安市| 隆德县| 新宁县|