我有一个视图层次结构,有时 @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
祖先在运行时未提供的缺失内容。
否则,对于缺少环境对象,编译器不会发出警告。但我们可以通过运行时测试来捕获丢失的环境对象。
上述答案概述了一种在运行时验证软件的模式,以识别编译器检查可能不够充分的问题。
我注意到这个答案被否决了。我将不胜感激任何改进它的反馈或建议。
归档时间: |
|
查看次数: |
1926 次 |
最近记录: |