如果咱们需要自定义 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
    }
}