首页 > 解决方案 > SwiftUI 和 EmptyViews

问题描述

我有以下代码示例:

struct ContentView: View {
    @State var showText = true

    var body: some View {
        VStack {
            if self.showText {
                Text("Hello")
            }
            //else {
            //      EmptyView()
            //  }
        }
    }
}

当它运行时,我会正常显示文本。但是,如果我将 showText 设置为 false,即使 VStack 不包含任何内容,它仍然可以正常编译和运行——它只是在运行时不显示任何内容。如果我取消注释 else 子句,该示例也会按预期运行。但是,如果我删除 VStack 的所有内容,则该示例将不会编译,因为没有返回任何内容。

所以我的问题是:

当 showText 为 false 时,SwiftUI 是否会在 VStack 中没有任何内容时默默地添加 EmptyView ?

我真的应该添加 else 子句并返回 EmptyView 吗?

这个问题也不完全是学术性的,因为我有一个用例,我希望整个视图或多或少被“丢弃”而不是在层次结构中包含 EmptyViews,尽管我对 SwiftUI 的理解目前非常有限所以可能没关系。

标签: swiftui

解决方案


VStack 是一个函数构建器,因此它希望从闭包中获得一些价值。在 if 的情况下,它调用buildEither函数构建器的版本,以便满足它不为空的条件。请参阅函数构建器提案。您不应该担心的任何方式EmptyView。ASwiftUI.View只是构建实际视图的蓝图(因为苹果称它为堆栈上的廉价值)。它不是内存和图形卡上的真实视图对象,如UIViewor CALayer。渲染系统会将您的 EmptyView 转换为 noop。 SwiftUI.Views一直被创建和丢弃,并且被设计为便宜而不像UIViews,并且系统差异是SwiftUI.View树,并且仅将增量应用于图形内存中的真实视图,类似于 Flutter、React 和 Android Compose 的工作方式。


推荐阅读