SwiftUI 常用 Property Wrappers 之 ObservedObject

🧠🔋

从字面的意思上我们可以了解,这个 Property Wrapper 是使 SwiftUl View 观察一个外部的 Object,当Object 变化的时候 Swiftul 得到通知可以更新 View 等。

仍然是双向绑定的思想,其实还是 reactive 等框架的思想。

ObservableObject Protocol

想创建一个可以 ObservedObject 的 Object 需要是一个 class 类,且遵守 ObservableObject Protocol

class Employee: ObservableObject {
    var age: Int = 24
}

@Published

当一个 ObservedObject 的变量更新的时候,如果想自动更新 View 需要里面的变量有 @Published 关键字。

class Employee: ObservableObject {
    @Published var age: Int = 24
}

当age 变化的时候,包含 ObservedObject 的 View 会更新内容。

class Employee: ObservableObject {
    @Published var age: Int = 24
}
struct ObservedObjectView: View {
    @ObservedObject var employee = Employee()
    var body: some View {
        VStack {
            Text("Age: \(employee.age)")
            Button {
                employee.age += 1
            } label: {
                Text("增加年龄")
            }
        }
    }
}

objectwillChange

在很多时候,当我们没有 ObservedObject 或者不是 @Published 的时候,我们想更新 View 可以使用objectwillChange。

class Employee: ObservableObject {
    var age: Int = 24
}
struct ObservedObjectView: View {
    @ObservedObject var employee = Employee()
    var body: some View {
        VStack {
            Text("Age: \(employee.age)")
            Button {
                employee.objectWillChange.send()
                employee.age += 1
            } label: {
                Text("增加年龄")
            }
        }
    }
}

注意❤️ Binding 可以是 Optional 的值,但是 ObservedObject 不可以。