如果咱们需要自定义 init 办法,在 init 中直接赋值 @Binding 会失利。

SwiftUI Tips: 如何在初始化方法init中赋值@Binding

赋值失利的原因是 @Binding 是一个 property wrapper,有 get 和 set 办法。他的 set 办法中存储的值是 Binding,但是还有 get 办法。因而 Binding 并不直接等于 @Binding。

咱们可以经过把变量 @Binding 类型改为 Binding 来体会这两者的区别。

// Binding<T>
struct BindingInit: View {
    var name: Binding<String>
    init(name: Binding<String>) {
        self.name = name
    }
    var body: some View {
        Text(name.wrappedValue)
        TextField("name", text: name)
            .padding()
            .onAppear {
                name.wrappedValue = "New"
            }
    }
}
// @Binding
struct BindingInitNormal: View {
    @Binding var name: String
    var body: some View {
        Text(name)
        TextField("name", text: $name)
            .padding()
            .onAppear {
                name = "New"
            }
    }
}

如果直接运用 Binding 作为属性,在对值的读取和设置都需要显式的经过 wrappedValue 调用。在 View 的操作中就会稍显繁琐。

那么怎么赋值呢?

Property wrapper 默许生成的真实变量名是在名称前加下划线(_)。因而咱们在赋值的时候直接赋值给真实的存储变量就可以了。

struct BindingInitNormal: View {
    @Binding var name: String
    init(name: Binding<String>) {
        self._name = name
    }
}
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。