SwiftUI Binding的两种用法
SwiftUI Binding的两种用法

SwiftUI Binding的两种用法

在使用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 传递绑定。

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注