![](/img/trans.png)
[英]Method to generate error (failure) for a SwiftUI Combine publisher
[英]Swift combine error: method on 'Publisher' requires .Failure' (aka 'WeatherError') and 'Never' be equivalent
我現在正在學習 Swift Combine,找到了非常簡單的視頻教程,但是由於某種原因,當我嘗試在 PassthroughSubject<Int, WeatherError>() 中使用我的枚舉時出現錯誤
檢查此代碼:
import Combine
enum WeatherError: Error {
case thingsJustHappen
}
let weatherPublisher = PassthroughSubject<Int, WeatherError>()
let subscriber = weatherPublisher
.filter {$0 > 10}
.sink { value in
print("\(value)")
}
weatherPublisher.send(10)
weatherPublisher.send(30)
“.filter”被突出顯示,錯誤是:
Referencing instance method 'sink(receiveValue:)' on 'Publisher'
requires the types 'Publishers.Filter<PassthroughSubject<Int, WeatherError>>.Failure'
(aka 'WeatherError') and 'Never' be equivalent
令人驚訝的是,這段代碼在視頻教程中有效。 我怎樣才能使我的 WeatherError 和 Never 相等???
您需要同時提供處理程序、完成處理程序和值處理程序:
let subscriber = weatherPublisher
.filter { $0 > 10 }
.sink(receiveCompletion: { _ in }, receiveValue: { value in
print("\(value)")
})
這是必需的,因為單參數sink
僅適用於永遠不會失敗的發布者:
extension Publisher where Self.Failure == Never {
/// ... many lines of documentation omitted
public func sink(receiveValue: @escaping ((Self.Output) -> Void)) -> AnyCancellable
}
如果您將類型更改為Never ,它將起作用:
let weatherPublisher = PassthroughSubject<Int, Never>()
或者創建一個新的 Published 變量:
@Published var weather = 0
let weatherPublisher = PassthroughSubject<Int, WeatherError>()
let weatherSubscriber = weather
.filter { $0 > 10 }
.sink { print($0) }
let subscriber = weatherPublisher
.sink { [weak self] value in
self?.weather = value
}
在 Xcode 13 & iOS 15.4 中,此代碼需要括號才能編譯。
extension Publisher where Self.Failure == Never {
// because the publisher can NEVER FAIL - by design!
public func sink(receiveValue: @escaping ((Self.Output) -> Void)) -> AnyCancellable { }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.