可选发布者的默认空值扩展?
Extension for default empty value for optional publisher?
我正在尝试将可选的发布者传递到我的视图 .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()) {...}
}
是否有可能或更好的方法来处理非可选链中的可选发布者?
对于你的具体问题,肯定是可以的。我只是不会这样做。
注意在 Publisher
之前添加 Combine.
。有一种名为 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())
}
我正在尝试将可选的发布者传递到我的视图 .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()) {...}
}
是否有可能或更好的方法来处理非可选链中的可选发布者?
对于你的具体问题,肯定是可以的。我只是不会这样做。
注意在 Publisher
之前添加 Combine.
。有一种名为 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())
}