我刚刚从Android基本系统转移到ios,正在迅速找到无法找到类似内容的构建器模式get和set方法。仅发现以下
var ptype : String? {
get{
return self.ptype
}set (ptype) {
self.ptype = ptype
}
}
答案 0 :(得分:2)
以下提示看起来像您想要的https://github.com/vincent-pradeilles/swift-tips#implementing-the-builder-pattern-with-keypaths。我将在此处复制代码以便快速查看。
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)
答案 1 :(得分:1)
使用了许多用Swift编写的库之后,我很少见到有人在Swift中使用构建器模式。
我认为使用Swift的其他语言功能已经可以实现Builder Pattern的主要优势。您可以完全创建一个构造函数,其中所有参数都是可选的,而您几乎只是在Swift中重新创建了构造器模式:
class Foo {
let a: Int
let b: String
let var 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
}
}
}