快速构建器模式设置方法

时间:2019-05-17 05:48:06

标签: ios swift builder

我刚刚从Android基本系统转移到ios,正在迅速找到无法找到类似内容的构建器模式get和set方法。仅发现以下

var ptype : String? {
    get{
        return self.ptype
    }set (ptype) {
        self.ptype = ptype
    }
}

2 个答案:

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