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



我看到的所有在 Swift 中定义 DSL 的博客文章都使用尾随闭包并使用闭包参数 $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 通过"带有接收器的扩展函数"避免了这一点(参见:带有 T.(( 的 Kotlin 函数签名是什么意思?(。

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

这是

Swift中的closure(匿名函数(,它有助于将函数设置为变量。

试试这个:

   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
    }

最新更新