Protocol 'View' 只能用作通用约束,因为它具有 Self 或关联的类型要求

Posted

技术标签:

【中文标题】Protocol \'View\' 只能用作通用约束,因为它具有 Self 或关联的类型要求【英文标题】:Protocol 'View' can only be used as a generic constraint because it has Self or associated type requirementsProtocol 'View' 只能用作通用约束,因为它具有 Self 或关联的类型要求 【发布时间】:2019-06-17 21:21:30 【问题描述】:

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

我想传入一些符合视图协议的结构,所以它可以在导航按钮目的地中使用,但我似乎无法编译它。我也尝试将目标类型设置为 _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】:

如果destination 中使用的所有视图都没有通用的具体类型,则应使用AnyView 结构来获取类型擦除的具体View 符合对象。

预计到达时间:

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)

【讨论】:

你能再解释一下吗?我的理解是,任何视图都不会有具体的“类型”,因为视图是符合视图的结构而不是类型。我只是想将目的地传递给作为变量的导航按钮,这取决于用户选择的按钮。 我的意思是,如果你有类似struct DetailView: View ... 的东西,并且每个AnimatingCard 都有一个DetailView 的目的地,那么你可以将其用作destination 的类型。在 Swift 中,structclassenum 定义的类型是“具体”类型。 AnyView 类型是 SwiftUI 中一个特殊的 struct,它可以包装任何符合 View 的类型并隐藏不同的底层类型。 好的,谢谢你的澄清。我不明白的是,在将目的地类型更改为“AnyView”后,我将如何解决此错误:“...View.Type”不可转换为“AnyView”

以上是关于Protocol 'View' 只能用作通用约束,因为它具有 Self 或关联的类型要求的主要内容,如果未能解决你的问题,请参考以下文章

“协议......只能用作通用约束,因为它具有 Self 或关联的类型要求”是啥意思?

为啥我会收到错误“协议……只能用作通用约束,因为它具有自身或关联的类型要求”?

协议只能用作通用约束,因为它具有 Self 或 associatedType 要求

在 Swift 中,从技术角度来看,为啥编译器会关心协议是不是只能用作通用约束?

协议一致性检查

如何在 swiftUI 中创建一个普通视图