首页 > 解决方案 > `@Published var name: ClassType` 在 SwiftUI / 手动触发之外_不起作用?

问题描述

我发现了很多与 SwiftUI 相关的主题,但都没有帮助(例如,为什么在我的 SwiftUI 应用程序中没有更新 ObservedObject 数组?

这不适用于 Swift 中的 Combine (特别是使用 Swift UI):

class SomeTask {
  @Published var progress = Progress(totalUnitCount: 5) // Progress is a Class
  [...]
}
var task = SomeTask()
let cancellable = task.$progress.sink { print($0.fractionCompleted) }
task.progress.completedUnitCount = 2

这与 SwiftUI 无关,因此无需ObservableObject继承 get objectWillChange,但即使我尝试使用它ObservableObjecttask.objectWillChange.send()没有做任何事情,尝试添加extension Progress: ObservableObject {}也无济于事。由于发布者通过 var 发出值,willSet并且因为Progress它本身是类类型,所以没有任何反应。

看起来没有真正体面的方法来手动触发它?

我发现的唯一解决方案是重新分配自己,这很尴尬:

let pr = progress progress = pr

(写作progress = progress是编译时错误)。

只有其他可能起作用的方法可能是使用键值观察/KVO和/或编写新的@PublishedClassType属性包装器?

标签: swiftkey-value-observingcombinereference-type

解决方案


您可以尝试使用CurrentValueSubject<Progress, Never>

class SomeTask: ObservableObject {
    var progress = CurrentValueSubject<Progress, Never>(Progress(totalUnitCount: 5))

    func setProgress(_ value: Int) {
        progress.value.completedUnitCount = value
        progress.send(progress.value)
    }
}
var task = SomeTask()
let cancellable = task.progress.sink { print($0.fractionCompleted) }
task.setProgress(3)
task.setProgress(1)

这样你Progress仍然可以成为一个


推荐阅读