首页 > 解决方案 > 我们可以避免像在 Kotlin 中那样进一步减少 Swift 的冗长吗?

问题描述

在 Kotlin 中,我们可以创建一个作用域函数,如下所示。

    inline fun <R> run(block: () -> R): R {
        return block()
    }

我们可以如下使用它来选择要显示的视图。

    run {
        if (choice) viewOne else viewTwo
    }?.show()

在 Swift 中,我们也可以声明如下

    @inline(__always) func run<R>(block: () -> R) -> R {
        return block()
    }

但是,当我们使用它时,它必须非常详细,如下所示。

    run { () -> View? in     // Need to explicitly show `View is return
        if choice {
            return viewOne   // Need to explicitly return
        } else {
            return viewTwo   // Need to explicitly return
        }
    }?.show()

有没有什么地方可以减少我不知道的 Swift 的冗长,让它看起来更简洁?(匹配更接近 Kotlin)

更新

显示整个代码

@inline(__always) func run<R>(block: () -> R) -> R {
    return block()
}

class View {
    func show() {print("A")}
}

let viewOne: View = View()
let viewTwo: View = View()

var choice = true

run { () -> View in
    return choice ? viewOne : viewTwo
}.show()

标签: swiftkotlin

解决方案


问题是编译器无法推断多行闭包的返回类型。但是,您可以使用三元运算符而不是if-else. 这样您就可以摆脱return语句和类型注释。

run { choice ? viewOne : viewTwo }.show()

推荐阅读