我见过的所有博客文章都在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中有类似的东西吗?还是有计划的?
这是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
}