首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能返回一个闭包,返回一个声明为"-> () -> some“的Swift函数的视图?

为什么我不能返回一个闭包,返回一个声明为"-> () -> some“的Swift函数的视图?
EN

Stack Overflow用户
提问于 2022-07-24 01:12:48
回答 2查看 149关注 0票数 1
代码语言:javascript
复制
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
    }
}

这使我在标记行上出现了一个错误:

无法将“NavLinkLabel”类型的值转换为闭包结果类型“some”

尽管NavLinkLabel符合视图协议,但这仍然是事实。

如果我用NavLinkLabel(text: text).body替换冒犯行,我会得到以下内容:

无法将“某些视图”类型(“NavLinkLabel.body”类型)的值转换为闭包结果类型“some”(“lbl”的结果)

为什么它不能将符合的类型,甚至是不透明的类型,转换成同一协议的不透明类型?我不怀疑有更好的方法来做这件事,但我只是在试验,并想知道为什么这不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-24 05:19:56

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

代码语言:javascript
复制
func lbl(_ text: String) -> () -> NavLinkLabel {     // << here !!
    return {
        NavLinkLabel(text: text)
    }
}

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

“某些”类型仅用于声明的属性和下标类型以及函数的返回类型

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

票数 1
EN

Stack Overflow用户

发布于 2022-07-24 02:12:56

您得到了一个错误,因为您将返回的View包装在一个closure{}中。另外,您的返回应该是-> some View,而不是-> () -> some View

试一试:

代码语言:javascript
复制
func lbl(_ text: String) -> some View {
    return DetailView(viewModel: vm) //this is my actual view and it worked
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73095159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档