gpt4 book ai didi

swift - 可选发布者的默认空值扩展?

转载 作者:行者123 更新时间:2023-12-05 00:56:25 25 4
gpt4 key购买 nike

我正在尝试将可选发布者传递给我的 View 的 .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())
}

关于swift - 可选发布者的默认空值扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62372908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com