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

在 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 , 所以它可能看起来像 fooString乍一看,但它仍然是 Binding<String> 类型就类型系统而言。例如,你不能在有 String 的地方使用它。通常会工作:

Text(foo) // error

https://stackoverflow.com/questions/71757500/

相关文章:

c# - System.IO.Directory.Exists 在 LINQ 语句中失败,但在 fo

java - 如何使用 Collectors.collectionAndThen 和 Collect

haskell - 在 Haskell 中日志记录功能的不同实现之间切换的有效方法?

python - `__ge__` 在 dict.values() 上使用时失败

authentication - 是 CQRS 中的登录/注册命令或查询

python - 将列表附加到现有数据框

java - 如何在 Java 中创建包含运算符的变量?

c - 在格式控制字符串中使用消息

c++ - 临时初始化和引用初始化

go - 函数参数的求值顺序是什么?