Ios swift中的Builder模式集方法
我刚从安卓base换到ios,在swift中寻找构建器模式get和set方法,但找不到类似的方法。仅发现以下内容Ios swift中的Builder模式集方法,ios,swift,builder,Ios,Swift,Builder,我刚从安卓base换到ios,在swift中寻找构建器模式get和set方法,但找不到类似的方法。仅发现以下内容 var ptype : String? { get{ return self.ptype }set (ptype) { self.ptype = ptype } } 在使用了这么多用Swift编写的库之后,我很少看到有人在Swift中使用builder模式 我认为Builder模式的主要优势已经可以通过Swift的其他语言特性
var ptype : String? {
get{
return self.ptype
}set (ptype) {
self.ptype = ptype
}
}
在使用了这么多用Swift编写的库之后,我很少看到有人在Swift中使用builder模式 我认为Builder模式的主要优势已经可以通过Swift的其他语言特性来实现。您完全可以创建一个构造函数,其中所有参数都是可选的,您几乎只需在Swift中重新创建生成器模式:
class Foo {
let a: Int
let b: String
let c: Bool
init(a: Int = 0, b: String = "", c: Bool = false) {
self.a = a
self.b = b
self.c = c
}
}
您可以像这样创建Foo
:
// You can omit any of the arguments, just like the builder pattern
Foo(
a: 123
b: "Hello World"
c: true
)
我认为在Java中,这是一个更干净的版本:
new FooBuilder()
.setA(123)
.setB("Hello World")
.setC(true)
.build()
但如果您坚持,下面是一些真正详细的Swift,它实现了Builder模式:
class Foo {
private(set) var a: Int = 0
private(set) var b: String = ""
private(set) var c: Bool = false
init(a: Int = 0, b: String = "", c: Bool = false) {
self.a = a
self.b = b
self.c = c
}
class Builder {
private var innerFoo = Foo()
@discardableResult
func withA(_ a: Int) -> Builder {
innerFoo.a = a
return self
}
@discardableResult
func withB(_ b: String) -> Builder {
innerFoo.b = b
return self
}
@discardableResult
func withC(_ c: Bool) -> Builder {
innerFoo.c = c
return self
}
func build() -> Foo {
return innerFoo
}
}
}
下面的提示看起来像是您想要的。我会在这里复制代码以便快速查找
protocol With {}
extension With where Self: AnyObject {
@discardableResult
func with<T>(_ property: ReferenceWritableKeyPath<Self, T>, setTo value: T) -> Self {
self[keyPath: property] = value
return self
}
}
extension UIView: With {}
let view = UIView()
let label = UILabel()
.with(\.textColor, setTo: .red)
.with(\.text, setTo: "Foo")
.with(\.textAlignment, setTo: .right)
.with(\.layer.cornerRadius, setTo: 5)
view.addSubview(label)
与{}的协议
带有where Self:AnyObject的扩展{
@可丢弃结果
具有(u属性:ReferenceWritableKeyPath,设置为值:T)->Self的func{
self[keyPath:property]=值
回归自我
}
}
扩展UIView:带有{}
let view=UIView()
let label=UILabel()
.with(\.textColor,设置为:。红色)
.with(\.text,设置为“Foo”)
.with(\.textAlignment,设置为:。右)
.带(\.layer.cornerRadius,设置为:5)
view.addSubview(标签)
不要使用该代码。它将导致无限递归。整个过程应该是var pType:String?
。这就是您想要的。您对构建器模式的含义是什么?您共享的代码仅用于分配属性。Set应返回object itselfProperty assignments,而不会返回值。您必须将setter实现为函数(而不是属性setter)。但我甚至不想麻烦,除非有很多值,只要使用多个赋值语句就行了