Exception 检查后在SwiftUI中将可选绑定设置为nil时出现异常
我有一个带有Exception 检查后在SwiftUI中将可选绑定设置为nil时出现异常,exception,swiftui,optional,Exception,Swiftui,Optional,我有一个带有状态变量的视图,该变量是可选的。我通过首先检查可选变量是否为nil来呈现视图,如果不是,则强制展开它并使用绑定将其传递到子视图中 但是,如果我在一个值和nil之间切换可选变量,应用程序就会崩溃,我会在函数BindingOperations.ForceUnwrapping.get(base:)中得到一条EXC\u BAD\u指令。仅显示“Nil”文本视图,如何获得视图的预期功能 struct ContentView: View { @State var optional: In
状态
变量的视图,该变量是可选的
。我通过首先检查可选变量是否为nil来呈现视图,如果不是,则强制展开它并使用绑定将其传递到子视图中
但是,如果我在一个值和nil
之间切换可选变量,应用程序就会崩溃,我会在函数BindingOperations.ForceUnwrapping.get(base:)
中得到一条EXC\u BAD\u指令。仅显示“Nil”文本
视图,如何获得视图的预期功能
struct ContentView: View {
@State var optional: Int?
var body: some View {
VStack {
if optional == nil {
Text("Nil")
} else {
TestView(optional: Binding($optional)!)
}
Button(action: {
if optional == nil {
optional = 0
} else {
optional = nil
}
}) {
Text("Toggle")
}
}
}
}
struct TestView: View {
@Binding var optional: Int
var body: some View {
VStack {
Text(optional.description)
Button(action: {
optional += 1
}) {
Text("Increment")
}
}
}
}
下面是一个可能的解决方法。使用Xcode 12/iOS 14进行测试
变体-永远不要使用可选状态/绑定和强制展开:)
Variant1:使用绑定包装器(无其他更改)
变量2:按原样传输绑定
struct ContentView: View {
@State var optional: Int?
var body: some View {
VStack {
if optional == nil {
Text("Nil")
} else {
CRTestView(optional: $optional)
}
Button(action: {
if optional == nil {
optional = 0
} else {
optional = nil
}
}) {
Text("Toggle")
}
}
}
}
struct CRTestView: View {
@Binding var optional: Int?
var body: some View {
VStack {
Text(optional?.description ?? "-1")
Button(action: {
optional? += 1
}) {
Text("Increment")
}
}
}
}
这在本例中确实有效,但是,在更大的应用程序中,这意味着必须始终检查可选项,这并不理想。使用nil检查的目的是避免在子视图中使用可选值。谢谢,这很有帮助,但我不会将其标记为答案,因为在执行nil检查后提供默认值似乎是多余的。
struct ContentView: View {
@State var optional: Int?
var body: some View {
VStack {
if optional == nil {
Text("Nil")
} else {
CRTestView(optional: $optional)
}
Button(action: {
if optional == nil {
optional = 0
} else {
optional = nil
}
}) {
Text("Toggle")
}
}
}
}
struct CRTestView: View {
@Binding var optional: Int?
var body: some View {
VStack {
Text(optional?.description ?? "-1")
Button(action: {
optional? += 1
}) {
Text("Increment")
}
}
}
}