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.
3
Answers
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
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:
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.