为什么我不能强制解开 $string 以用作 TextField 值?

Tho*_*mas 4 textfield swiftui

这给了我以下错误:无法强制解开非可选类型“Binding<Person?>”的值

我不明白为什么我不能强行解开绑定?

struct Person {
    var name: String
}

struct ContentView: View {

    @State private var person: Person? = Person(name: "Peter")
    
    var body: some View {
        if person != nil {
            TextField("", text: $person!.name)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Moh*_*ani 6

State当您在视图中声明变量时,您将通过在变量名称中Binding添加前导来获取该值。$因此,在您的代码中,您将拥有一个$person绑定到可选Person类型的 a 。$personBinding<Person?>

要将值传递给TextField您,您需要一个Binding<String>. 您不能强制解包,$person因为它不是可选值。这是Binding一个可选类型。要访问结构体name内部的字段Person,您需要 a Binding<Person>。幸运的是,有一种方法可以得到你想要的东西。通过使用这个初始化程序,您将拥有一个Binding<Person>?. 请注意,现在Binding您有一个可选的 ,而不是可选的 a Binding。您应该能够像这样使用这个新绑定:

// Binding($person) returns Binding<Person>? 
TextField("", text: Binding($person)!.name)
Run Code Online (Sandbox Code Playgroud)

更新:正如@Jessy 在评论中提到的,我们可以使用将map返回的值转换BindingTextField

var body: some View {
   Binding($person).map {
     TextField("", text: $0.name)
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 该初始化程序是解决方案的一个很好的部分,但是“!”并不是一个好方法。`if let` 或我对 `map` 所做的更好;更新你的答案,我会删除我的答案,因为你有更完整的信息。 (2认同)