当前位置: 首页 > 知识库问答 >
问题:

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

勾炜
2023-03-14

我看到的所有在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中有类似的东西吗?还是有计划?

共有1个答案

司寇星海
2023-03-14

这是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
    }
 类似资料:
  • 问题内容: 我想知道是否可以在Swift中编写内联汇编。 我知道在Objective-C中,您可以使用如下代码: 但是在Swift中似乎无法使用 。 有谁知道如何使用,如果可能的话。我没有找到任何关于它的信息,所以我认为这是一个很好的问题。 问题答案: 要扩展Robert Levy所说的内容,您可以只使用Swift / Obj-C互操作功能,并编写一个可以处理ASM内容的Obj- C类,然后可以从

  • 问题内容: 鉴于: 有什么方法可以使参数(和)的类型也保持不变? 更改类型会出现以下错误: @escaping属性仅适用于函数类型 删除该属性后,代码将编译并运行,但由于闭包使函数的作用范围变大,因此似乎并不正确。 问题答案: 有一个SR-2552报告无法识别功能类型别名。这就是错误的原因。您可以通过扩展函数签名中的函数类型来解决: 编辑1 : 我实际上是在xcode 8 beta版本下,但尚未解

  • 鉴于: 有什么方法可以使类型的参数(和)并且还保留? 更改类型会产生以下错误: @escaping属性仅适用于函数类型 删除属性,代码将编译并运行,但似乎不正确,因为闭包正在转义函数的范围。

  • 想改进这个问题吗 通过编辑此帖子,添加详细信息并澄清问题。 这是我的if语句。我只想写得更短。因为我认为这些是无效的。顺便说一句,每个if语句都是独立的。

  • 我有一个很大的结构,我知道从剖析,是昂贵的复制。我正在使用关键字传递这个结构的实例,效果很好。 现在我想把它作为一个参数传递给一个迭代器方法,而迭代器方法本身将值传递给其他迭代器方法--但是不允许使用,这意味着每次将值传递给一个方法时都会复制该值。 这里的上下文是一个包含视频游戏保存状态的结构,迭代器方法是一个“加载”方法,它在Unity game engine(使用迭代器实现协同)中将保存数据的

  • 我的构建服务器安装了Open JDK 8,我的正式服安装了oracle JRE 8。是否有可能在开放的JDK中编译代码并在Oracle JRE 8中部署工件?