簡體   English   中英

Swift 組合錯誤:'Publisher' 上的方法 requires.Failure'(又名'WeatherError')和'Never' 是等效的

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM