swift - 可选发布者的默认空值扩展?
问题描述
我正在尝试将可选发布者传递给我的视图.onReceive
。我不想像这样强制包装它:
let refreshPublisher: AnyPublisher<Void, Never>?
var body: some View {
Group {
...
}
.onReceive(refreshPublisher!) {...}
}
所以我传递了一个空的默认值,如下所示:
var body: some View {
Group {
...
}
.onReceive(refreshPublisher ?? Empty<Void, Never>().eraseToAnyPublisher()) {...}
}
这真的很冗长,想在Optional
发布者上添加一个扩展,如下所示:
extension Optional where Wrapped == Publisher { // Incorrect syntax, doesn't compile
func orEmpty() -> AnyPublisher<Void, Never> { ... }
}
这样,我可以结束或做这样的事情:
var body: some View {
Group {
...
}
.onReceive(refreshPublisher.orEmpty()) {...}
}
在非可选链中处理可选发布者是否有可能或更好的方法?
解决方案
对于您的具体问题,这当然是可能的。我只是不会这样做。
注意Combine.
之前的添加Publisher
。有一种叫做Optional.Publisher
阴影的类型Combine.Publisher
,这就是导致您的错误的原因。
extension Optional where Wrapped: Combine.Publisher {
func orEmpty() -> AnyPublisher<Wrapped.Output, Wrapped.Failure> {
self?.eraseToAnyPublisher() ?? Empty().eraseToAnyPublisher()
}
}
我不会这样做,而是将默认值设为 Empty 并且根本不使用 Optional:
let refreshPublisher: AnyPublisher<Void, Never>
init(refreshPublisher: AnyPublisher<Void, Never> = Empty().eraseToAnyPublisher()) {
self.refreshPublisher = refreshPublisher
}
我也会修改这个,以便调用者可以传递他们想要的任何发布者,而不是强加于AnyPublisher
他们:
let refreshPublisher: AnyPublisher<Void, Never>
init<Refresh>(refreshPublisher: Refresh) where Refresh: Publisher,
Refresh.Output == Void, Refresh.Failure == Never {
self.refreshPublisher = refreshPublisher.eraseToAnyPublisher()
}
init() {
self.init(refreshPublisher: Empty())
}
推荐阅读
- javascript - 是否可以在使用 if 或 v-if 按下按钮后显示文本?
- java - 如何确定按字母顺序排列的列表或数字?
- python - MDDropDownMenu KivyMD的绑定按钮
- python-3.x - python中的随机生成器
- mysql - 将 MS SQL Server 图像数据移动到 MySQL longblob
- reactjs - ReactJS - FileReader readAsArrayBuffer 一个图像文件
- javascript - 将表示为字符串的时间值转换为 JavaScript 中的分钟
- c# - 将 CSV 导入 SQL
- javascript - 如何在 vue 项目中获取 firebase 实时数据库 API 时处理 CORS 错误?
- legend - 图例图像周围的彩色边框