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 中,struct
、class
和 enum
定义的类型是“具体”类型。 AnyView
类型是 SwiftUI 中一个特殊的 struct
,它可以包装任何符合 View
的类型并隐藏不同的底层类型。
好的,谢谢你的澄清。我不明白的是,在将目的地类型更改为“AnyView”后,我将如何解决此错误:“...View.Type”不可转换为“AnyView”以上是关于Protocol 'View' 只能用作通用约束,因为它具有 Self 或关联的类型要求的主要内容,如果未能解决你的问题,请参考以下文章
“协议......只能用作通用约束,因为它具有 Self 或关联的类型要求”是啥意思?
为啥我会收到错误“协议……只能用作通用约束,因为它具有自身或关联的类型要求”?
协议只能用作通用约束,因为它具有 Self 或 associatedType 要求