iOS中创建Model的最佳实践记录

2020-01-21 07:23:18于丽

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.

大致意思是创建一个可变子类,它将所有属性重新定义为readwrite。这种方式的主要缺点是我们最终得到两倍的类。而且,可变子类通常仅作为初始化和修改其不可变版本的方式存在。偶然使用可变子类可能会导致许多错误。例如,在设置属性时会出现心理负担。我们必须始终检查是否存在可变子类。

还有一点这种方式只能在Objective-C中使用。

Builder pattern

Builder pattern 模式需要我们使用一个Builder来创建目标对象,目标对象的property依旧是readonly,但是Builder的对应property却可以选择为readwrite。依旧用UserModel为例,我们需要为其进行适当的改造,改造之后:


typealias UserModelBuilderBlock = (UserModelBuilder) -> UserModelBuilder

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

之后是对应的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()
 }
}