2017-01-31 4 views
0

私のアプリは進行状況の情報を表示するステータス領域を上部に持っています(XcodeとiTunesに似ています)。ストリームの値をProgressUpdate値に変換するクロージャを使用して、イベントストリームに副作用を注入することによって、このイベントを更新したいと考えています。私はSignalProducerの拡張機能を使用していますので、私のアプリのシグナルプロデューサーは、アプリケーションのステータスエリアを更新できます(複数のシグナルを一度に許可するためにはもっと複雑ですが、この問題には影響しません)。SignalProducerに副作用を一般的に注入する

私はこれをSignalProducerのon(開始:、started :, ...)に基づいています。エラータイプの制約を許すためには最新のswift 3.1 betaが必要ですが、これは遊び場からまっすぐです。

import ReactiveSwift 

struct Rc2Error: Error { 
} 

struct ProgressUpdate { 
    let message: String 
    let value: Double = -1 
} 

class MacAppStatus { 
    fileprivate func process(event: (Event<ProgressUpdate, Rc2Error>) -> Void) 
    { 
     //update UI based on the event 
    } 
} 


extension SignalProducer where Error == Rc2Error { 
    func updateProgress<Value>(status: MacAppStatus, converter: @escaping (Value) -> ProgressUpdate) -> SignalProducer<Value, Error> 
    { 
     return SignalProducer<Value, Error> { observer, compositeDisposable in 
      self.startWithSignal { signal, disposable in 
       compositeDisposable += disposable 
       compositeDisposable += signal 
        .on(event: { (orignal) in 
         switch original { 
         case .completed: 
          status.process(Event<ProgressUpdate, Rc2Error>.completed) 
         case .interrupted: 
          status.process(Event<ProgressUpdate, Rc2Error>.interrupted) 
         case .failed(let err): 
          status.process(Event<ProgressUpdate, Rc2Error>.failed(err)) 
         case .value(let val): 
          status.process(Event<ProgressUpdate, Rc2Error>.value(converter(val))) 
         } 
        }) 
        .observe(observer) 
      } 
     } 
    } 
} 

`` `

.observe(observer)の最後の行は、エラー生成します。

error: cannot convert value of type 'Observer<Value, Rc2Error>' to expected argument type 'Observer<_, Rc2Error>' 

この変換が失敗した理由を任意のアイデア?これを達成する別の方法の提案?

+1

Typo? '.on(イベント:{(orignal)'の代わりに 'オリジナル' –

+0

とそれ以外のいくつかのタイプミス –

答えて

0

コンパイラからのエラー報告が悪いようです。実際の問題は、process()がイベントをとるクロージャではなく、イベントを取るべきだということでした。空の外部パラメータ名も必要でした。

fileprivate func process(_ event: Event<ProgressUpdate, Rc2Error>) 

に署名を変更し、元の入力ミスマイクTaverneの固定は、固定されたことを指摘しました。

関連する問題