如何在SwiftUI视图中显示遵循Viewable协议的视图(不使用AnyView)
解决SwiftUI中Viewable协议视图显示问题
错误原因
你遇到的Type 'any View' cannot conform to 'View'错误,本质是因为any Viewable是带类型擦除的existential类型,它的body属性会被擦除为any View,而SwiftUI的body要求返回some View——也就是一个具体的、确定的视图类型,any View无法满足这个编译要求。
非AnyView解决方案
不用AnyView的话,我们可以通过将SampleView定义为泛型结构,绑定具体的Viewable实现类型,从而保留body的具体类型信息:
public struct SampleView<V: Viewable>: View { var object: V? public var body: some View { // 用EmptyView作为可选值的默认视图,避免强制解包风险 object?.body ?? EmptyView() } }
使用时需要传入具体的Viewable实现类型,比如假设你有一个MyViewable: Viewable的实现,就可以这样创建SampleView:
SampleView(object: MyViewable())
原理说明
泛型约束V: Viewable让SampleView的body返回的是V.Content类型——这是一个具体的、符合View协议的类型,完全满足SwiftUI对body返回some View的要求,同时避免了AnyView带来的类型擦除性能开销。
内容的提问来源于stack exchange,提问作者Astro
相关产品推荐
相关产品推荐

