这会导致以下错误:无法强制打开非可选类型"Binding<人>
我不明白为什么我不能强行打开捆绑?
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)
}
}
}
当您在视图中声明一个State
变量时,您将通过在变量名称中添加一个前导$
来获得该值的Binding
。因此,在您的代码中,将有一个绑定到可选Person
类型的$person
。$person
是Binding<Person?>
要将值传递给TextField
,您需要一个Binding<String>
。不能强制打开$person
,因为它不是可选值。它是一个可选类型的Binding
。要访问Person
结构中的name
字段,您需要一个Binding<Person>
。幸运的是,有一种方法可以得到你想要的。通过使用这个初始值设定项,您将获得一个Binding<Person>?
。请注意,现在您有了一个可选的Binding
,而不是一个Binding
到一个可选。你应该能够像这样使用这个新的绑定:
// Binding($person) returns Binding<Person>?
TextField("", text: Binding($person)!.name)
更新:正如@Jessy在评论中提到的,我们可以使用map
将返回的Binding
转换为TextField
,而不是强制展开可选绑定
var body: some View {
Binding($person).map {
TextField("", text: $0.name)
}
}