有没有办法检查 @Environmentobject 是否存在 swiftui

dsy*_*nkd 5 swift swiftui

我有一个视图层次结构,有时 @EnvironmentObject 可能无法解析。有没有办法在访问它的值之前检查这样的 @EnvironmentObject 是否存在?

像下面这样:

struct SampleView: View {
    @EnvironmentObject var someStateObj: SomeStateObjectType
    var body: some View {
        Button("Test") {
            // Line below will not work...
            if someStateObject != nil { /* Do Something */ }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ang -2

用于重构

检查 SwiftUI 中包装的对象是否存在@EnvironmentObject有助于我们重构代码,而无需担心缺少环境对象的运行时后果。

  • 我们可以有信心删除不必要的.environmentObject修饰符。
  • 我们可以将环境对象中必须传递的位置归零。

它并不总是显而易见的,例如当将 ToolBarItems 提取到 ToolBarContent 时在视图层次结构中形成不连续性时。

验证环境对象

我们不能使用 nil 检查,if someStateObject != nil因为@EnvironmentObject属性包装器是非可选的。

但是,我们可以对环境对象的运行时验证的类型进行检查,如下所示:

assert(type(of: someStateObject) == SomeStateObjectType.self)
Run Code Online (Sandbox Code Playgroud)

防止因缺少环境对象而导致崩溃

  • 在声明类型的每个视图中进行断言@EnvironmentObject
  • 每当应用程序运行时,如果环境对象因任何原因丢失,调用断言将导致失败。

例如,如果我们在子视图init.onAppear()修饰符中插入这样的检查,则断言将捕获 @EnvironmentObject祖先在运行时未提供的缺失内容。

否则,对于缺少环境对象,编译器不会发出警告。但我们可以通过运行时测试来捕获丢失的环境对象。

上述答案概述了一种在运行时验证软件的模式,以识别编译器检查可能不够充分的问题。

我注意到这个答案被否决了。我将不胜感激任何改进它的反馈或建议。