Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法将[type]类型的值转换为预期的参数类型';一些观点';_Ios_Swift_Swiftui - Fatal编程技术网

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)))
    }
}