在 SwiftUI 中声明 Binding 属性有什么区别?

Bin*_*ynh 2 binding ios swift swiftui

在 SwiftUI 中声明绑定属性有什么区别

@Binding var foo: String
Run Code Online (Sandbox Code Playgroud)

相对

var foo: Binding<String>
Run Code Online (Sandbox Code Playgroud)

Swe*_*per 8

如果你这样做@Binding var foo: String,那么你同时声明了三件事:

  • foo,这是一个String
  • _foo,这是一个Binding<String>(这是私有的)
  • $foo,这是一个Binding<String>

foo_foo和之间的关系$foo为:

// this is basically how property wrappers are implemented under the hood
private var _foo: Binding<String>
var foo: String {
    get { _foo.wrappedValue }
    set { _foo.wrappedValue = newValue } 
}
var $foo: Binding<String> {
    _foo.projectedValue
}
Run Code Online (Sandbox Code Playgroud)

另请参阅SE 提案以了解更多详细信息


如果你这样做了var foo: Binding<String>,你就会得到foo,这是 a Binding<String>。不存在$foo和之类的东西_foo

由于Binding<String>标记为,因此您仍然可以在其上@dynamicMemberLookup使用's 成员,因此乍一看它可能看起来像是一个,但就类型系统而言它仍然是类型。例如,您不能在通常可以工作的地方使用它:StringfoofooStringBinding<String>String

Text(foo) // error
Run Code Online (Sandbox Code Playgroud)