我一直在使用@ViewBuilder,大概是这样的:

@ViewBuilder
var warning: some View {
    if someWarningIsShown {
        Text("WARNING")
    }
}

这很好用,但我想弄清楚当条件不满足时,@ViewBuilder是如何工作的.因为该类型不是可选的,所以我假定返回的是nil以外的值.EmptyView()AnyView(EmptyView())?同样让我震惊的是,Text()没有Return关键字.这怎么可能呢?我猜@ViewBuilder正在以一种非常规的方式运作.有谁能解释一下吗?

推荐答案

这只会返回EmptyView.这基本上等同于写:

@ViewBuilder func warning() -> some View {
    if someWarningIsShown {
        Text("WARNING")
    } else {
        EmptyView()
    }
}

如果要编写允许返回的函数,只需在代码中省略@ViewBuilder并按如下方式返回(请注意,通过该函数的所有路径必须返回值,并且所有路径必须返回相同类型的视图):

func warning() -> some View {
    if someWarningIsShown {
        return Text("WARNING")
    } else {
        return Text("SUCCESS")
    }
}

不能编写不带@ViewBuilder注释的函数,它返回不同的类型.例如,下面的代码将返回一个错误,告诉您该函数声明了一个不透明的返回类型,但没有返回具有相同基础类型的值.这仅适用于带有@ViewBuilder注释的函数:

func warning() -> some View {
    if someWarningIsShown {
        return Text("WARNING")
    } else {
        return EmptyView()
    }
}

根据上面的信息,我们可以确定@ViewBuilder属性正在幕后做一些工作,当一个块不包含它可以处理的语句时,它将返回EmptyView().更深入地挖掘底层代码和the documentation,我们可以看到这是真的:

static func buildBlock() -> EmptyView
// Builds an empty view from a block containing no statements.

Ios相关问答推荐

为什么Reaction-Native-Vision-Camera不能与闪光灯一起使用?

IOS:在UI线程中执行代码的闭包样式的替代

ScrollViewReader Scrollto Not Working

在将Cocoapods更新到1.13.0之后,它抛出错误

为什么AVSpeechSynthesizer复制的信息比我的文本多?

封装 Swift 导入

如何解决错误 HE0004:无法在 Visual Studio 2022 中加载框架ContentDeliveryServices

Swift Combine 防止初始值触发接收器并同时防止重复?

卡在 Apple 的 SwiftUI 教程第 5 章(更新应用数据)

.onAppear() 函数不适用于 NavigationLink

使用 Vim 代替(或与)Xcode 进行 iOS 开发

光标未显示在 UITextView 中

为什么 Safari 在使用 iOS 6 设备进行远程调试时显示No Inspectable Applications?

如何在 iOS 的 xib 中设置十六进制 colored颜色 代码

如何在react 导航中获取当前路由名称?

Xcode 8:函数类型不能有参数标签 destruct 我的构建

在 iOS 上存储身份验证令牌 - NSUserDefaults 与 keys 串?

NSURLSession:如何增加 URL 请求的超时时间?

UITextView 内容插图

如何在 iphone 屏幕中间显示活动指示器?