在使用Swift绑定Binding传递参数的时候,发现存在错误:
class changeColor {
@Binding var selectedColor: Binding<NSColor> // Binding变量
init(color: Binding<NSColor>) {
self.selectedColor = color // 报错行
}
@objc func colorChanged(_ sender: NSColorWell) {
selectedColor.wrappedValue = sender.color
}
}
Xcode提示:
'self' used in property access 'selectedColor' before all stored properties are initialized
Return from initializer without initializing all stored properties
经过查询了解到我的Binding用法存在错误。
Binding写法
1、普通变量,类型是 Binding<NSColor>。
var selectedColor: Binding<NSColor>
用在 Coordinator 等普通类或 struct 中。
例如,本次的代码中:
class changeColor {
var selectedColor: Binding<NSColor>
2、属性包装器,用于 SwiftUI View 的成员变量。
@Binding var selectedColor: NSColor
用在 SwiftUI View 的 struct 中。
例如,普通的视图需要绑定外部的参数:
struct ContentView: View {
@Binding var name: String
使用场景
1、普通类或非View结构体中(如 Coordinator)
Coordinator 是一个普通的类,不能使用属性包装器 @Binding,所以必须直接写成:
class Coordinator: NSObject {
var selectedColor: Binding<NSColor> // 正确
init(selectedColor: Binding<NSColor>) {
self.selectedColor = selectedColor
}
}
否则可能会报错:Property wrapper can only be applied to a property。
2、SwiftUI的View中,使用 @Binding 修饰属性,表示它是从外部传入的绑定状态:
struct ColorWellRepresentable: NSViewRepresentable {
@Binding var selectedColor: NSColor // 正确
// SwiftUI 会自动将 Binding<NSColor> 赋值给这个属性
}
注意:
@Binding 是一种语法糖。
编译器会自动生成一个 _selectedColor: Binding<NSColor> 的变量。
可以通过 $selectedColor 把这个 binding 传给别的组件。
总结
1、var xxx: Binding<T>,用于普通类 / 非 View 的 struct,不能自动解包,需要用 .wrappedValue 获取值,用 .projectedValue 获取 Binding。
2、@Binding var xxx: T,在SwiftUI View中使用,是语法糖,直接 xxx 访问值,$xxx 传递绑定。