在 SwiftUI 中声明绑定(bind)属性有什么区别,即
@Binding var foo: String
对比
var foo: Binding<String>
最佳答案
如果你这样做 @Binding var foo: String
, 然后你可以同时声明三件事:
foo
,这是一个 String
,_foo
,这是一个 Binding<String>
(这是私有(private)的)$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
}
另见 the SE proposal for more details .
如果你这样做 var foo: Binding<String>
, 你只得到 foo
,这是一个 Binding<String>
.没有 $foo
这样的东西和 _foo
.
自 Binding<String>
标有 @dynamicMemberLookup
, 你仍然可以使用 String
的成员在此 foo
, 所以它可能看起来像 foo
是 String
乍一看,但它仍然是 Binding<String>
类型就类型系统而言。例如,你不能在有 String
的地方使用它。通常会工作:
Text(foo) // error
https://stackoverflow.com/questions/71757500/