SwiftUI5 新增加的Observable宏的基本用法。

2,983 阅读1分钟

在SwiftUI5 中推出了@Observable这个宏,用来代替之前 ObservableObject 协议配合@Published 宏来绑定模型属性和视图的功能。

在之前代码中如果想通过模型的属性来绑定视图,写法如下:

class MyModel: ObservableObject {
    @Published var text = "Hello, world!"

    var name = "liaoworking."
}

struct ContentView: View {
    @StateObject var model = MyModel()

    var body: some View {
        Text(model.text)
        Button("Change Model") {
            model.text = "Hello, SwiftUI!"
        }
    }
}

当点击一下 Button, 文字显示就会变成 "Hello, SwiftUI!"

在SwiftUI5推出Observable宏以后,我们可以用新的写法去实现上面的需求。 具体代码如下:

// 改 ObservableObject 协议为@Observable 
@Observable class MyModel {
    // text绑定的view会自动实现监听
    var text = "Hello, world!"
    
    // 不需要监听的属性可以用ObservationIgnored宏来修饰。
    @ObservationIgnored
    var name = "liaoworking."
}

struct ContentView: View {
    // 模型前使用@State去修饰
    @State private var model = MyModel()

    var body: some View {
        Text(model.text)
        Button("Change Model") {
            model.text = "Hello, SwiftUI!"
        }
    }
}

目前该特性只支持XCode15可用, 版本支持为iOS17极以上版本。 具体官方迁移文档如下:

Migrating from the Observable Object protocol to the Observable macro

注: 有点没崩住,在XCode15 Beta3中 在运行 VisionOS 模拟器时 项目时使用@Observable特性直接编译报错,询问苹果工程师的解答是先退回到Beta2。 只能坐等Beta4修复了😂。