SwiftUI View:两个不同的初始值设定项:无法转换“Text”类型的值;闭包结果类型“Content”
代码:
import SwiftUI
public struct Snackbar<Content>: View where Content: View {
private var content: Content
// Works OK
public init(@ViewBuilder content: () -> Content) {
self.content = content()
}
init(_ text: String) {
self.init {
Text(text) // cannot convert value of type 'Text' to closure result type 'Content'
.font(.subheadline)
.foregroundColor(.white)
.multilineTextAlignment(.leading)
}
}
public var body: some View {
HStack {
VStack(alignment: .leading, spacing: 4) {
content
}
Spacer()
}
.frame(maxWidth: .infinity,
minHeight: 26)
.padding(.fullPadding)
.background(Color.black)
.clipShape(RoundedRectangle(cornerRadius: .defaultCornerRadius))
.shadow(color: Color.black.opacity(0.125), radius: 4, y: 4)
.padding()
}
}
我收到此错误:
无法将“Text”类型的值转换为闭包结果类型“Content”
我想要实现的目标是拥有两个单独的初始值设定项,一个用于 View
类型的内容,另一个是快捷方式对于字符串,它将放置一个带有某种样式的预定义 Text
组件来代替 Content
。
如果 Text
是 some View
并且我认为它应该编译,为什么我会收到此错误。
The code:
import SwiftUI
public struct Snackbar<Content>: View where Content: View {
private var content: Content
// Works OK
public init(@ViewBuilder content: () -> Content) {
self.content = content()
}
init(_ text: String) {
self.init {
Text(text) // cannot convert value of type 'Text' to closure result type 'Content'
.font(.subheadline)
.foregroundColor(.white)
.multilineTextAlignment(.leading)
}
}
public var body: some View {
HStack {
VStack(alignment: .leading, spacing: 4) {
content
}
Spacer()
}
.frame(maxWidth: .infinity,
minHeight: 26)
.padding(.fullPadding)
.background(Color.black)
.clipShape(RoundedRectangle(cornerRadius: .defaultCornerRadius))
.shadow(color: Color.black.opacity(0.125), radius: 4, y: 4)
.padding()
}
}
I'm getting this error:
cannot convert value of type 'Text' to closure result type 'Content'
The goal I'm trying to achieve is to have 2 separate initializers, one for the content of type View
and the other is a shortcut for a string, which will place a predefined Text
component with some styling in place of Content
.
Why am I getting this error if Text
is some View
and I think it should compile.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
对此的通用解决方案是提供一个在语义上等同于
some View
的包装器。AnyView
是内置的并用于此目的。另外,更改您的代码,
以便您不必将
content
的结果包装在另一个闭包中。The general-purpose solution to this is to provide a wrapper that is semantically equivalent to
some View
.AnyView
is built in and serves that purpose.Also, change your code to
so that you don't have to wrap the result of
content
in another closure.您可以指定
内容
的类型。代码:
这里唯一的区别是
init
之后的where
以及强制转换为init
内的类型。为了避免特定类型,您可以将其抽象为单独的视图:
You can specify the type of
Content
.Code:
The only difference here is the
where
after theinit
and the force-cast to the type inside theinit
.To avoid the specific type, you can abstract this into a separate view:
一种方法是使内容可选并使用另一个文本变量并基于 nil 值显示视图。
您还可以使用
AnyView
One way is to make content optional and use another text var and show view based on a nil value.
You can also use
AnyView