SwiftUI:观察已发布对象的内部变化

Alb*_*tUI 6 swiftui

SwiftUI、Swift 5.2、Xcode 11.4

我试图观察单身人士的变化,但我并不总是刷新我的 SwiftUI 视图:

final class Patient: ObservableObject {
      static var shared: Patient
      @Published var medicalData: MedicalData

      init { ... }

      final class MedicalData { 
            var allergies: String
            var ...

            init { ... }
      }
}
Run Code Online (Sandbox Code Playgroud)

所以,在我的 SwiftUI 视图中:

struct ContentView: View {
       @ObservedObject var patient: Patient = Patient.shared
       var body: some view { ... }
}
Run Code Online (Sandbox Code Playgroud)

如果任何对象替换了医疗数据,发布者将正确通知我的 SwiftUI:

patient.medicalData = NEW_MEDICAL_DATA --> OK! View refreshed
Run Code Online (Sandbox Code Playgroud)

但是,如果任何对象更改了当前医疗数据中的值,则不会刷新 SwiftUI 视图:

patient.medicalData.allergies = "Alcanfor" --> NOT PUBLISHED
Run Code Online (Sandbox Code Playgroud)

有谁知道如何做到这一点?先感谢您。

Alb*_*tUI 11

找到了一种优雅的方法来执行此操作(请参阅didSet):

final class Patient: ObservableObject {
      static var shared: Patient
      @Published var medicalData = MedicalData() { 
           didSet {
                  subscription = medicalData.objectWillChange.sink { [weak self] _ in
                        self?.objectWillChange.send()
                  }
           }
      }
      var subscription: AnyCancellable?

      init { ... }
}
Run Code Online (Sandbox Code Playgroud)

如果该属性已初始化,则可以开箱即用。如果没有,只需在“init()”处didSet初始化属性后编写代码即可。medicalData

当然,MedicalData必须符合ObservableObject协议。