swift - `@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
,但即使我尝试使用它ObservableObject
并task.objectWillChange.send()
没有做任何事情,尝试添加extension Progress: ObservableObject {}
也无济于事。由于发布者通过 var 发出值,willSet
并且因为Progress
它本身是类类型,所以没有任何反应。
看起来没有真正体面的方法来手动触发它?
我发现的唯一解决方案是重新分配自己,这很尴尬:
let pr = progress
progress = pr
(写作progress = progress
是编译时错误)。
只有其他可能起作用的方法可能是使用键值观察/KVO和/或编写新的@PublishedClassType
属性包装器?
解决方案
您可以尝试使用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
仍然可以成为一个类。
推荐阅读
- javascript - 如何在 Prod 中启动 Webpack 和固定装置
- c++ - 列表到 2D 数组和迭代器 c++
- html - 如何防止固定可滚动列表中的隐藏元素?
- javascript - 模板文字不适用于查询选择器
- django - 指示更改文件的输出路径
- mule - 缺少 Anypoint 平台应用程序名称 (flowVars._clientName)
- php - 如何从 JWK 密钥集中选择有效密钥进行苹果登录令牌验证?
- javascript - 为什么默认参数值不起作用?
- java - 用于以自定义格式提取嵌套函数的 Java 正则表达式
- c++ - 在 std::map 的 range-for 中的结构化绑定声明中按值获取内置类型