Ios 无法将[type]类型的值转换为预期的参数类型';一些观点';
我得到了以下结构:Ios 无法将[type]类型的值转换为预期的参数类型';一些观点';,ios,swift,swiftui,Ios,Swift,Swiftui,我得到了以下结构: struct A : View { var backgroundView: some View = Color.white var body = some View { VStack { Text("abc") } .background(backgroundView) } } 只要我没有指定自己的backgroundView,这在预览中可以正常工作: struct A_P
struct A : View {
var backgroundView: some View = Color.white
var body = some View {
VStack {
Text("abc")
}
.background(backgroundView)
}
}
只要我没有指定自己的backgroundView
,这在预览中可以正常工作:
struct A_Previews: PreviewProvider {
static var previews: some View {
A()
}
}
但当我将背景视图指定为例如LinearGradient时:
struct A_Previews: PreviewProvider {
static var previews: some View {
A(backgroundView: LinearGradient(
gradient: Gradient(colors: [.yellow, .white]),
startPoint: .bottom,
endPoint: .top))
}
}
我得到以下错误:
无法将“LinearGradient”类型的值转换为预期的参数类型“some View”
为什么默认实现工作,为什么自定义声明不工作?如何设置可以同时接受颜色和线性渐变类型的参数?您应该使用泛型<代码>视图包含对
Self
的引用,这就是为什么不能按您想要的方式使用它
试试这样:
struct A<BackgroundView : View> : View {
var backgroundView: BackgroundView
var body : some View {
VStack {
Text("abc")
}
.background(backgroundView)
}
}
struct A_Previews: PreviewProvider {
static var previews: some View {
A(backgroundView: LinearGradient(
gradient: Gradient(colors: [.yellow, .white]),
startPoint: .bottom,
endPoint: .top))
}
}
你应该使用泛型<代码>视图包含对
Self
的引用,这就是为什么不能按您想要的方式使用它
试试这样:
struct A<BackgroundView : View> : View {
var backgroundView: BackgroundView
var body : some View {
VStack {
Text("abc")
}
.background(backgroundView)
}
}
struct A_Previews: PreviewProvider {
static var previews: some View {
A(backgroundView: LinearGradient(
gradient: Gradient(colors: [.yellow, .white]),
startPoint: .bottom,
endPoint: .top))
}
}
我将通过以下方式进行测试(在Xcode 11.2上测试):
//声明>>>
结构A:视图,其中背景:视图{
背景视图:背景
var body:一些观点{
VStack{
VStack{
文本(“abc”)
}
.背景(背景视图)
}
}
}
扩展名A,其中背景==颜色{
静态变量'default`:A{
A(背景视图:彩色。白色)
}
}
//测试>>>
结构TestSomeViewUsage:View{
var body:一些观点{
VStack{
违约
分隔器()
A(背景视图:LinearGradient(
渐变:渐变(颜色:[黄色,.白色]),
起始点:。底部,
端点:。顶部)
}
}
}
结构TestSomeViewUsage\u预览:PreviewProvider{
静态var预览:一些视图{
TestSomeViewUsage()
}
}
我将通过以下方式进行测试(在Xcode 11.2上测试):
//声明>>>
结构A:视图,其中背景:视图{
背景视图:背景
var body:一些观点{
VStack{
VStack{
文本(“abc”)
}
.背景(背景视图)
}
}
}
扩展名A,其中背景==颜色{
静态变量'default`:A{
A(背景视图:彩色。白色)
}
}
//测试>>>
结构TestSomeViewUsage:View{
var body:一些观点{
VStack{
违约
分隔器()
A(背景视图:LinearGradient(
渐变:渐变(颜色:[黄色,.白色]),
起始点:。底部,
端点:。顶部)
}
}
}
结构TestSomeViewUsage\u预览:PreviewProvider{
静态var预览:一些视图{
TestSomeViewUsage()
}
}
最好的解决方法是使用AnyView
并将值包装在其中:基于本文:
然后:
struct A_Previews: PreviewProvider {
static var previews: some View {
A(backgroundView: AnyView(LinearGradient(
gradient: Gradient(colors: [.yellow, .white]),
startPoint: .bottom,
endPoint: .top)))
}
}
最好的解决方法是使用
AnyView
并将值包装在其中:基于本文:
然后:
struct A_Previews: PreviewProvider {
static var previews: some View {
A(backgroundView: AnyView(LinearGradient(
gradient: Gradient(colors: [.yellow, .white]),
startPoint: .bottom,
endPoint: .top)))
}
}
这是不好的,因为如果我有5个具有默认值的可选参数,那么我需要创建32行
let defaultA=…
,以涵盖修改或保留默认值时的所有情况。更不用说5泛型类型参数了。我最大的问题是Color
-类型值可以作为.background()
方法的参数提供,LinearGradient
-类型值也可以作为参数提供,但是我无法指定既接受这两种类型,又是.background()的有效变量类型的变量类型
method。我希望这是一个非常灵活的框架,在这个框架中,用户可以根据自己的意愿定制任意多的东西。这确实是一个棘手的问题,因为对于通用性(SwiftUI的设计方式),定制“默认”并不是那么明显。。。如果我有解决办法,我会让你知道。。。但也许您需要重新考虑您的模型,以符合SwiftUI的理念。我的最终解决方案是将它们包装在AnyView
中。这两种方法都是属性的有效值。这不好,因为如果我有5个具有默认值的可选参数,那么我需要创建32行let defaultA=…
,以覆盖所有情况,当它们被修改或保留为默认值时。更不用说5泛型类型参数了。我最大的问题是Color
-类型值可以作为.background()
方法的参数提供,LinearGradient
-类型值也可以作为参数提供,但是我无法指定既接受这两种类型,又是.background()的有效变量类型的变量类型
method。我希望这是一个非常灵活的框架,在这个框架中,用户可以根据自己的意愿定制任意多的东西。这确实是一个棘手的问题,因为对于通用性(SwiftUI的设计方式),定制“默认”并不是那么明显。。。如果我有解决办法,我会让你知道。。。但也许您需要重新考虑您的模型,以符合SwiftUI的理念。我的最终解决方案是将它们包装在AnyView
中。这样,两者都是属性的有效值。
struct A_Previews: PreviewProvider {
static var previews: some View {
A(backgroundView: AnyView(LinearGradient(
gradient: Gradient(colors: [.yellow, .white]),
startPoint: .bottom,
endPoint: .top)))
}
}