国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 系統(tǒng) > iOS > 正文

iOS中創(chuàng)建Model的最佳實(shí)踐記錄

2019-10-21 18:39:31
字體:
供稿:網(wǎng)友

前言

作為一個(gè)優(yōu)秀的程序員,或者想成為優(yōu)秀的程序員,最基本的你得有MVC編程思想,那么你就要對(duì)JSON獲取的數(shù)據(jù)建Model,將service和controller層都分離,從而做到低耦合。現(xiàn)在有很多利用runtime能快速的將json數(shù)據(jù)轉(zhuǎn)為一個(gè)Model。但是我在做項(xiàng)目的時(shí)候,發(fā)現(xiàn)創(chuàng)建Model(特別是屬性特多的)寫屬性代碼很浪費(fèi)時(shí)間,降低了編程效率。后來我自己就寫了個(gè)好玩的能省去時(shí)間創(chuàng)建Model的一個(gè)方法,下面話不多說了,來一起看看詳細(xì)的介紹吧

Immutable Model

我們以UserModle為例,我們可以像這樣創(chuàng)建:

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

用的時(shí)候可以像這樣:

let userModel = UserModel(userId: 1)user.email = "335050309@qq.com"user.name = "roy"user.age = 27user.address = "上海市楊浦區(qū)"

這樣創(chuàng)建一個(gè)User對(duì)象好處是彈性很大,我可以隨意選擇設(shè)定某個(gè)property的值,但是背后同樣帶有很大的缺點(diǎn),就是這個(gè)Model變得異常開放,不安分,這種Model我們一般叫Mutable Model。有的時(shí)候我們需要Mutable Model,但大部分的時(shí)候出于數(shù)據(jù)安全和解耦考慮我們不希望創(chuàng)建的property在外部可以隨意改變,在初始化后不可變的Model叫做Immutable Model,在開發(fā)中我的建議盡量使用Immutable Model。我們通過把property設(shè)置成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

當(dāng)我們把property設(shè)置成readonly后,我們只能在init的時(shí)候賦值,這個(gè)時(shí)候就變成這樣:

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

使用的時(shí)候就變成這樣:

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

這樣創(chuàng)建Model安全可靠,大多數(shù)時(shí)候是有效的,但是也有一些缺點(diǎn):

  • 如果property很多,init方法就有很多形參,然后變得又臭又長。
  • 有的時(shí)候我們只需要Model的某些property,這樣我們可能為各個(gè)不同的需求寫不同的init方法,最終讓UserModel變得很龐大。

Initializer taking dictionary

初始化的時(shí)候注入一個(gè)字典,就是下面的樣子:

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

很顯然這解決上一種第一個(gè)缺點(diǎn),但是還是有一個(gè)不足之處:

  • 如果字典沒有某個(gè)屬性對(duì)應(yīng)的key的時(shí)候會(huì)崩潰,編譯器并不能幫助我們排查這種運(yùn)行時(shí)的崩潰。
  • 不能很好的滿足某些時(shí)候只需要Model的某些property的需求。

Mutable subclass

我們看看Improving Immutable Object Initialization in Objective-C關(guān)于這個(gè)是怎么描述的

We end up unsatisfied and continue our quest for the best way to initialize immutable objects. Cocoa is a vast land, so we can – and should – steal some of the ideas used by Apple in its frameworks. We can create a mutable subclass of Reminder class which redefines all properties as readwrite:

@interface MutableReminder : Reminder <NSCopying, NSMutableCopying>@property (nonatomic, copy, readwrite) NSString *title;@property (nonatomic, strong, readwrite) NSDate *date;@property (nonatomic, assign, readwrite) BOOL showsAlert;@end

Apple uses this approach for example in NSParagraphStyle and NSMutableParagraphStyle. We move between mutable and immutable counterparts with -copy and -mutableCopy. The most common case matches our example: a base class is immutable and its subclass is mutable.

The main disadvantage of this way is that we end up with twice as many classes. What's more, mutable subclasses often exist only as a way to initialize and modify their immutable versions. Many bugs can be caused by using a mutable subclass by accident. For example, a mental burden shows in setting up properties. We have to always check if a mutable subclass exists, and if so use copy modifier instead of strong for the base class.

大致意思是創(chuàng)建一個(gè)可變子類,它將所有屬性重新定義為readwrite。這種方式的主要缺點(diǎn)是我們最終得到兩倍的類。而且,可變子類通常僅作為初始化和修改其不可變版本的方式存在。偶然使用可變子類可能會(huì)導(dǎo)致許多錯(cuò)誤。例如,在設(shè)置屬性時(shí)會(huì)出現(xiàn)心理負(fù)擔(dān)。我們必須始終檢查是否存在可變子類。

還有一點(diǎn)這種方式只能在Objective-C中使用。

Builder pattern

Builder pattern 模式需要我們使用一個(gè)Builder來創(chuàng)建目標(biāo)對(duì)象,目標(biāo)對(duì)象的property依舊是readonly,但是Builder的對(duì)應(yīng)property卻可以選擇為readwrite。依舊用UserModel為例,我們需要為其進(jìn)行適當(dāng)?shù)母脑欤脑熘螅?/p>

typealias UserModelBuilderBlock = (UserModelBuilder) -> UserModelBuilderpublic 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(userId: NSNumber) {  self.userId = userId    super.init() }  convenience init(userId: NSNumber ,with block: UserModelBuilderBlock){   let userModelBuilder = block(UserModelBuilder.init(userId: userId))  self.init(userId: userModelBuilder.userId)  self.email = userModelBuilder.email  self.name = userModelBuilder.name  self.age = userModelBuilder.age  self.address = userModelBuilder.address }}

之后是對(duì)應(yīng)的Builder

class UserModelBuilder: NSObject {  public let 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 userModle = UserModel(userId: 1) { (builder) -> UserModelBuilder in  builder.email = "335050309@qq.com" builder.name = "roy" builder.age = 27 builder.address = "上海市楊浦區(qū)" return builder}

這種方式雖然我們需要為Model再創(chuàng)建一個(gè)Builder,略顯啰嗦和復(fù)雜,但是當(dāng)property較多,對(duì)Model的需求又比較復(fù)雜的時(shí)候這又確實(shí)是一種值得推薦的方式。

以上全是Swift的代碼實(shí)現(xiàn),下面我再貼上對(duì)應(yīng)的OC代碼

#import <Foundation/Foundation.h>@interface RUserModelBuilder : NSObject@property (nonatomic, strong, readwrite, nonnull) NSNumber *userId;@property (nonatomic, copy, readwrite, nullable) NSString *name;@property (nonatomic, copy, readwrite, nullable) NSString *email;@property (nonatomic, copy, readwrite, nullable) NSNumber *age;@property (nonatomic, copy, readwrite, nullable) NSString *address;@endtypedef RUserModelBuilder *__nonnull(^RUserModelBuilderBlock)(RUserModelBuilder *__nonnull userModelBuilder);@interface RUserModel : NSObject@property (nonatomic, strong, readonly, nonnull) NSNumber *userId;@property (nonatomic, copy, readonly, nullable) NSString *name;@property (nonatomic, copy, readonly, nullable) NSString *email;@property (nonatomic, copy, readonly, nullable) NSNumber *age;@property (nonatomic, copy, readonly, nullable) NSString *address;+ (nonnull instancetype)buildWithBlock:(nonnull RUserModelBuilderBlock)builderBlock;@end
#import "RUserModel.h"@implementation RUserModelBuilder@end@interface RUserModel ()@property (nonatomic, strong, readwrite, nonnull) NSNumber *userId;@property (nonatomic, copy, readwrite, nullable) NSString *name;@property (nonatomic, copy, readwrite, nullable) NSString *email;@property (nonatomic, copy, readwrite, nullable) NSNumber *age;@property (nonatomic, copy, readwrite, nullable) NSString *address;@end@implementation RUserModel#pragma mark - NSCopying+ (nonnull instancetype)buildWithBlock:(nonnull RUserModelBuilderBlock)builderBlock { RUserModelBuilder *userModelBuilder = builderBlock([[RUserModelBuilder alloc] init]); RUserModel *userModel = [[RUserModel alloc] init]; userModel.userId = userModelBuilder.userId; userModel.name = userModelBuilder.name; userModel.email = userModelBuilder.email; userModel.age = userModelBuilder.age; userModel.address = userModelBuilder.address; return userModel;}@end

demo地址:ImmutableModel

參考文章:

Improving Immutable Object Initialization in Objective-C

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到IOS開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
欧美性猛交xxxx免费看蜜桃 | 国产啊啊啊视频在线观看| 天天干天天摸| 18加网站在线| 国产无套粉嫩白浆在线2022年| 粉嫩av一区| 国产一级黄色电影| 97一区二区三区| 日本h片在线观看| 国产写真视频在线观看| 国产福利小视频在线| av中文字幕在线看| 国产免费高清| 国产高清一级片| 羞羞视频在线观看免费| 黄色免费av| 国产精品第八页| 日本视频一二三区中文字幕| 人人澡人人爽| 丁香视频五月| 中文乱码字幕高清在线观看| 92国产在线视频| 日本高清不卡中文字幕| 国产精品人人爱一区二区白浆| 亚洲an天堂an在线观看| 国产天堂在线| 人xxxx性xxxxx欧美| 国产一区二区三区美女秒播| 中文日本在线观看| 国产色在线观看| 超碰在线网址| 日本一二区视频| 在线看黄网站| 国产色在线播放| 午夜视频免费在线观看| 亚洲国产日韩在线人成电影| 国产一卡2卡3卡四卡网站| www免费在线观看视频| 国产精品被窝福利一区| 天天操人人干| 成年人在线观看| 欧美精品se| 九九热视频在线| 久久国产精品久久久久久小说| 国产激情视频一区二区三区| 国产日韩精品在线看| 五月婷婷在线观看| 大香伊人中文字幕精品| 亚洲最新永久在线观看| 精灵使的剑舞无删减版在线观看| 国产一级片麻豆| 国产精品视频一区麻豆| 国产污污在线观看| 国产黄色片大全| 国产精品久久久久久久久鸭| 国产福利av网站| 在线播放av网站| 免费在线高清av| 国产九色在线| 国产超碰在线| 亚洲jjzzjjzz在线观看| 久久av少妇| 国产网站在线播放| 97视频在线观看网站| 一色桃子av在线| 免费99热在线观看| 国产精品被窝福利一区| 91中文字幕网| 久久久久久91精品色婷婷| 国产精品一区二区资源| 国产桃色电影在线播放| 亚洲尤物在线视频| 丁香花在线电影小说观看| 国产亚洲依依| www.三级.com| 国产黄在线看| 黄网址在线播放免费| 中文字幕不卡| 永久免费在线观看| 中文字幕一区二区三区免费视频 | 四虎国产精品永久| 国产女人在线观看| 一本大道五月香蕉| 国产粉嫩一区二区三区在线观看| www.狠狠色.com| 精品国产免费第一区二区| 国产免费麻豆视频| 欧美性猛交xxxxbbbb| 96久久久久久| 国产高清av| 国产区av在线| 最新黄网在线观看| 天天艹天天操| av在线免费观看网| 亚洲精品国自产拍在线观看| 国产欧美在线观看视频| 天天操人人干| 国产在线超碰| 国产伦精品一区二区三区高清版禁| 天天操夜夜添| 欧美性猛交p30| 亚洲国产成人综合| av人人综合网| jizz亚洲大全| 欧美艹逼视频| 国产中文字幕在线视频| 欧洲亚洲精品视频| www.操操| 国产美女被草| 中文字幕一区二区三区免费视频| 黄网站在线观看高清免费| 激情四房婷婷| 五月天天在线| 69久久久久| 四虎免费播放| 91sp网站在线观看入口| 国产视频中文字幕| 伊人影院在线视频| 日本黄色免费网址| 国产精品外围在线观看| 国产羞羞视频在线观看| 2021av天天| 亚色视频在线观看| 激情四房婷婷| 精品三级久久久久久久电影聊斋| 亚洲一道本在线| 黄网址在线播放免费| 国产精品久久久久久福利| 亚洲网站一区| 国产天堂素人系列在线视频| 在线视频观看国产| 天天av综合网| eeuss影院www在线观看| 最近中文字幕大全中文字幕免费 | 91www在线观看| av在线播放国产| 国产在线看片| 亚洲精品天堂在线观看| √天堂中文在线| 久久五月精品| 亚洲电影先锋| 99热免费在线| 国产三区在线观看| 国产又色又爽又黄刺激在线视频| 精品电影在线| 日本中文字幕在线看| 色综合久久五月天| 18激情网站| 中文字幕麻豆| 国产麻豆视频免费观看| av大片在线播放| 国产黄色在线| 国产精品久久一区二区三区不卡| 免费一区二区在线观看| 国产精品合集一区二区| 国产精品一区在线看| 六月天色婷婷| 国产在线免费观看| 九九99精品| 久久亚洲国产成人亚| 午夜影院在线免费观看| 在线黄色av| 亚洲欧美综合乱码精品成人网| 最好看更新中文字幕| 久热中文字幕精品视频在线| www.三区| 九九热视频精品在线观看| 久久精品最新免费国产成人| 人xxxx性xxxxx欧美| 四虎中文字幕| 欧美日韩综合高清一区二区| 四虎www视频| 黄色网址在线免费播放| 欧美aaa一级片| 天天av天天爱| 国产盗摄一区二区| 国产9色视频| 青青国产在线| 国产免费网址| 国产成人夜间影院在线观看| 99在线播放| 成人精品福利| 国产成人精品自线拍| 日韩在线天堂| 国产老肥熟xxxx在线观看| 国产三级在线看| 午夜影院在线免费观看| 狠狠干在线视频| 国产激情自拍| 美女永久在线网站| 精品视频一二三| 国产中文字幕在线视频| 国产高清在线看| 欧美专区日韩| 国产成人亚洲综合小说区| 青青青国产视频| 国产高清大尺度一区二区不卡| 日本韩国精品一区二区| 国产黄色免费在线观看| 免费黄网站在线观看|