SwiftUI中如何判断ViewBuilder添加的视图是否为EmptyView?
判断ViewBuilder添加的视图是否为EmptyView
直接用===比较aView和EmptyView()是行不通的,原因很简单:EmptyView是值类型,每次调用EmptyView()都会生成全新的实例,而===是用来判断引用类型是否指向同一个对象的操作符,值类型用它比较永远会返回false。
下面提供两种可行的判断方案:
方案1:给View添加类型检查扩展
通过扩展让所有View都能直接判断自身是否为EmptyView:
extension View { var isEmptyView: Bool { self is EmptyView } }
然后修改你的结构体实现:
struct ViewAsVariable<TestView: View>: View { let aView: TestView var body: some View { if aView.isEmptyView { Text("view is empty") } else { aView } } init(destinationView: TestView) { self.aView = destinationView } }
注意:这个方法只能判断最外层视图是否为EmptyView,如果是嵌套视图(比如VStack { EmptyView() }),会返回false,因为外层是VStack而非EmptyView。
方案2:通过泛型重载初始化器
如果想在初始化阶段就精准处理EmptyView,可以重载初始化方法:
struct ViewAsVariable<TestView: View>: View { private let content: AnyView var body: some View { content } // 处理普通视图 init(destinationView: TestView) { if destinationView is EmptyView { self.content = AnyView(Text("view is empty")) } else { self.content = AnyView(destinationView) } } // 专门针对EmptyView的初始化,类型约束更精准 init() where TestView == EmptyView { self.content = AnyView(Text("view is empty")) } }
这种方式不管是直接传入EmptyView(),还是通过ViewBuilder生成的EmptyView,都能正确识别并替换成目标文本。
内容的提问来源于stack exchange,提问作者reza23
相关产品推荐
相关产品推荐

