SwiftUI中移除AnyView的switch视图返回函数优化方案咨询
移除SwiftUI中AnyView的最优改造方案
方法1:用@ViewBuilder修饰视图生成函数
SwiftUI的@ViewBuilder可以让函数返回不同类型的视图,无需用AnyView统一类型。给你的showView函数添加该修饰器,同时移除AnyView包裹即可:
struct T01: View{ var body: some View{ VStack{ showView(i: 1) } } @ViewBuilder func showView(i: Int) -> some View{ switch(i){ case 0: viewOne case 1: viewTwo default: EmptyView() } } var viewOne: some View { Text("View One") } var viewTwo: some View { Text("View Two") } }
@ViewBuilder会自动将分支内的不同视图打包成TupleView,编译器能正确推断返回类型,避免AnyView带来的类型擦除性能损耗。
方法2:将视图逻辑内联到Body中
如果分支逻辑简单,直接把switch逻辑写到body的容器视图内,省去额外函数,代码更简洁:
struct T01: View{ var body: some View{ VStack{ switch 1 { case 0: viewOne case 1: viewTwo default: EmptyView() } } } var viewOne: some View { Text("View One") } var viewTwo: some View { Text("View Two") } }
方法3:用枚举封装视图类型(适配复杂复用场景)
如果需要在多处复用视图选择逻辑,可定义遵循View协议的枚举,用case关联对应视图:
enum CustomView: View { case one, two var body: some View { switch self { case .one: Text("View One") case .two: Text("View Two") } } } struct T01: View{ var body: some View{ VStack{ switch 1 { case 0: CustomView.one case 1: CustomView.two default: EmptyView() } } } }
这种方式实现了视图逻辑与实现的解耦,同时保持类型安全,完全规避AnyView的问题。
内容的提问来源于stack exchange,提问作者micah
相关产品推荐
相关产品推荐

