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")
            }
        }
    }
}