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/