Ios swift中的Builder模式集方法

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的其他语言特性

我刚从安卓base换到ios,在swift中寻找构建器模式get和set方法,但找不到类似的方法。仅发现以下内容

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)。但我甚至不想麻烦,除非有很多值,只要使用多个赋值语句就行了