由于它具有自我或关联类型要求,协议“View”只能用作通用约束。

7

我试图将一个目标视图结构传递给另一个视图,但代码无法编译。

我想传递一些符合视图协议的结构体,以便可以在导航按钮目标中使用,但似乎无法编译。我还尝试将destination的类型设置为_View。非常感谢任何建议。

struct AnimatingCard : View {

    var title, subtitle : String
    var color : Color
    var destination : View

    init(title : String, subtitle: String, color: Color, destination : View){
        self.title = title
        self.subtitle = subtitle
        self.color = color
        self.destination = destination


    }

    var body: some View {
        NavigationButton(destination: destination) {
    ...
        }
   }
}
1个回答

12
如果在目标视图中使用的所有视图都没有共同的具体类型,则应使用AnyView结构体来获取一个类型擦除的具体View符合对象。
ETA: AnyView有一个声明为init<V>(_ view: V) where V : View的初始化程序,因此您现在应该在以前创建AnimatingCard的任何地方编写:
AnimatingCard(title: title, subtitle: subtitle, color: color, destination: AnyView(view))

或者,您可以使AnimatingCard的初始化器通用于所有符合View协议的类型,并在初始化器内部执行AnyView转换,如下所示:

init<V>(title : String, subtitle: String, color: Color, destination : V) where V: View {
    self.title = title
    self.subtitle = subtitle
    self.color = color
    self.destination = AnyView(destination)
}

你能再解释一下吗?我的理解是,没有任何视图会有一个具体的“类型”,因为视图是结构体而不是类型,它们符合视图。我只是试图将一个目标传递给一个导航按钮,这个目标是一个变量,它取决于用户选择的按钮。 - Jon Reed
我的意思是,如果你有像 struct DetailView: View { ... } 这样的东西,而且每个 AnimatingCard 都有一个目标是 DetailView,那么你可以将其作为 destination 的类型。在 Swift 中,由 structclassenum 定义的类型都是“具体”类型。AnyView 类型是 SwiftUI 中的一个特殊 struct,它可以包装任何符合 View 协议的类型并隐藏不同的底层类型。 - Jumhyn
好的,谢谢您稍微澄清一下。我不明白的是,当我将目标类型更改为“AnyView”后,如何解决此错误:“...View.Type”无法转换为“AnyView”。 - Jon Reed
@Jumhyn 你是个传奇!感谢你的帮助。 - Ashok Khanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接