是否可以避免在Swift中编写的DSL代码中的闭包参数$ 0?

问题描述 投票:-1回答:1

我见过的所有博客文章都在Swift中定义DSL,使用尾随闭包并使用closure参数$ 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通过“带接收器的扩展功能”避免了这种情况(参见:What does a Kotlin function signature with T.() mean?)。

Swift中有类似的东西吗?还是有计划的?

swift parameters closures dsl
1个回答
0
投票

这是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
    }
© www.soinside.com 2019 - 2024. All rights reserved.