swift - 为什么我不能返回一个从声明为 "-> () -> some View"的 Swift 函数返回 View 的闭包?

标签 swift swiftui closures opaque-types

struct NavLinkLabel: View {
    var text: String
    var body: some View {
        HStack {
            Text(text)
            Spacer()
            Image(systemName: "chevron.right")
        }
        .padding()
        .border(.bar)
    }
}

func lbl(_ text: String) -> () -> some View {
    return {
        NavLinkLabel(text: text) //ERROR
    }
}

这在标记行上给了我一个错误:

Cannot convert value of type 'NavLinkLabel' to closure result type 'some View'

尽管 NavLinkLabel 符合 View 协议(protocol),但还是如此。

如果我用 NavLinkLabel(text: text).body 替换有问题的行,我会得到:

Cannot convert value of type 'some View' (type of 'NavLinkLabel.body') to closure result type 'some View' (result of 'lbl')

为什么它不能将一致类型,甚至不透明类型转换为相同协议(protocol)的不透明类型?无论如何,我不怀疑有更好的方法来做到这一点,但我只是在尝试并想知道为什么这不起作用。

最佳答案

如果您确实需要返回一个闭包(即实际上是一个构建器),那么最简单(实际上是唯一)的变体就是声明已知的具体类型(因为我们知道返回的内容),即

func lbl(_ text: String) -> () -> NavLinkLabel {     // << here !!
    return {
        NavLinkLabel(text: text)
    }
}

否则直接返回 NavLinkLabel(text: text) ,因为 swift 中的 some 支持有限(v5.6 时)。只是

'some' types are only implemented for the declared type of properties and subscripts and the return type of functions

表示直接返回类型,而不是返回闭包的返回 - 它超出了范围。

关于swift - 为什么我不能返回一个从声明为 "-> () -> some View"的 Swift 函数返回 View 的闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73095159/

相关文章:

Swift 将问题与 UILabel 订阅结合起来

javascript - 是否有一个 GruntJS 任务可以从源代码模板构建 JS 闭包?

python - lambda 函数闭包捕获什么?

ios - 获取 UITableView 错误 "unable to dequeue a cell with identifier cell"

ios - 如何从其他 Swift 文件调用数据库根目录?

ios - ECC Curve25519 钥匙串(keychain)

swift - 如何在 Swift 5.5 中将 async/await 与 SwiftUI 一起使用?

iOS SwiftUi : NavigationView inside a ZStack

swift - SwiftUI 中的填充、偏移或位置

rust - 是否有可能在不使用 Box 的情况下返回一个返回闭包的 Rust 闭包?