Posts with tag swift

@StateObject passing rules

2025-07-04
langsswift

This is bad and ViewB reinits at unexpected time (can run directly)import SwiftUI class Manager: ObservableObject { @Published var cnt: Int = 0 } class Manager2: ObservableObject { @ObservedObject var m: Manager; init(m: Manager) { self.m = m } func f() { self.m.cnt += 1 } } struct ViewB: View { @ObservedObject var m: Manager @ObservedObject var m2: Manager2 init(m: Manager) { print("init") self.m = m self.m2 = .init(m: m) } var body: some View { Button(action: { print("Clicked") self.m2.f() print("After Clicked") }) { Text("Click me") .font(.system(size: 40)) } } } struct ContentView: View { @ObservedObject var m = Manager(); var body: some View { ViewB(m: self.m) } } #Preview { ContentView() }To fix it (can run directly)import SwiftUI class Manager: ObservableObject { @Published var cnt: Int = 0 } class Manager2: ObservableObject { var m = Manager(); init() { } func f() { self.m.cnt += 1 } } struct ViewB: View { @ObservedObject var m2: Manager2 @ObservedObject var m: Manager var printer = DeallocPrinter() var body: some View { Button(action: { print("***\nClicked") self.m2.f() print(self.m.cnt) print("After Clicked") }) { Text("\(self.m.cnt)") .font(.system(size: 40)) } } } class DeallocPrinter { deinit { print("deallocated") } } struct ContentView: View { @StateObject private var m2: Manager2 init() { self._m2 = StateObject(wrappedValue: Manager2()) } var body: some View { ViewB(m2: self.m2, m: self.m2.m) } } #Preview { ContentView()

@ObservedObject or @StateObject

2025-07-02
ai-then-melangsswift

@ObservedObject or @StateObject在 SwiftUI 中,@ObservedObject 和 @StateObject 均可传播 @Published 更新.ViewA has @ObservedObject manager. 则 manager 可在 ViewA.init() 中使用 self.manager = .init() 初始化.@StateObject 则不行,它是一个属性包装器,Swift 编译器会将其转换为两个属性:一个带下划线的存储属性 _myStateObject (实际类型是 StateObject<MyModel> )一个计算属性 myStateObject (实际类型是 MyModel )| 场景 | 使用 | SwiftUI 是否负责生命周期 | 是否能被观察更新 | | ------------ | ----------------- | ---------------- | -------- | | 当前 View 创建对象 | @StateObject | ✅ 是 | ✅ 是 | | 外部传入的对象 | @ObservedObject | ❌ 否 | ✅ 是 | | 值类型,或不需触发更新 | 不用 | ❌ 否 | ❌ 否

No more posts to load.