Метод набора шаблонов Builder в Swift - PullRequest
1 голос
/ 17 мая 2019

Я только что перешел с Android base на ios, искал метод сборки и установки шаблонов в swift и не смог найти ничего подобного.Найдены только следующие

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

1 Ответ

1 голос
/ 17 мая 2019

После использования стольких библиотек, написанных на Swift, я редко видел, чтобы люди использовали шаблон Builder в Swift.

Я думаю, что основные преимущества Pattern Builder Pattern уже могут быть достигнуты с помощью других языковых функций Swift.Вы можете полностью создать конструктор, в котором все параметры являются необязательными, и вы почти просто воссоздали шаблон построителя в 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
        }
    }
}
...