Можно ли избежать параметра замыкания $ 0 в коде DSL, написанном на Swift? - PullRequest
0 голосов
/ 24 апреля 2019

Все сообщения в блоге, которые я видел, которые определяют DSL в Swift, используют конечные замыкания и используют параметр замыкания $ 0.Это делает код многословным и, я думаю, уродливым.(Например: https://mecid.github.io/2019/01/30/creating-dsl-in-swift)

Есть ли способ избежать такого кода везде?
$ 0 везде.

let rootView = stack {
    $0.spacing = 16
    $0.axis = .vertical
    $0.isLayoutMarginsRelativeArrangement = true

    $0.label {
        $0.textAlignment = .center
        $0.textColor = .white
        $0.text = "Hello"
    }
}

Kotlin избегает этого с помощью "функций расширения с приемником"(см .: Что означает сигнатура функции Kotlin с T. ()? ).

Есть ли что-то похожее в Swift? Или это планируется?

1 Ответ

0 голосов
/ 24 апреля 2019

Это closure (анонимная функция) в Swift, это помогает установить функции в качестве переменных.

Попробуйте:

   let rootView = stack(apply: newFunction(_:))

....

 func newFunction(_ obj : UIStackView) {
        obj.spacing = 16
        obj.axis = .vertical
        obj.isLayoutMarginsRelativeArrangement = true
 }

Для функции:

public func stack(apply closure: (UIStackView) -> Void) -> UIStackView {
        let stack = UIStackView()
        closure(stack)
        return stack
    }
...