为什么我无法强制解开$string包装以用作文本字段值?



这会导致以下错误:无法强制打开非可选类型"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$personBinding<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)
}
}

相关内容

最新更新