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”的结果)
为什么它不能将符合的类型,甚至是不透明的类型,转换成同一协议的不透明类型?我不怀疑有更好的方法来做这件事,但我只是在试验,并想知道为什么这不起作用。
发布于 2022-07-24 05:19:56
如果您确实需要返回一个闭包(即,实际上是一个构建器),那么最简单的(实际上也是一个)变体就是声明已知的具体类型(我们知道返回的是什么),即
func lbl(_ text: String) -> () -> NavLinkLabel { // << here !!
return {
NavLinkLabel(text: text)
}
}否则,只需直接返回NavLinkLabel(text: text),因为some支持在v5.6中是有限的。它只是
“某些”类型仅用于声明的属性和下标类型以及函数的返回类型
意思是直接返回类型,而不是返回返回的闭包-它超出了范围。
发布于 2022-07-24 02:12:56
您得到了一个错误,因为您将返回的View包装在一个closure{}中。另外,您的返回应该是-> some View,而不是-> () -> some View。
试一试:
func lbl(_ text: String) -> some View {
return DetailView(viewModel: vm) //this is my actual view and it worked
}https://stackoverflow.com/questions/73095159
复制相似问题