エラー一覧のenumの中に引数を文字列で与えたものがあったせいで、単純に比較ができなかったので、比較条件を追加してみる
ようするにどんな状況?
classの中に、viewを読み込み状況を表すプロパティを使ってて、そのプロパティの型がviewStateなんだけど、ifでviewstate == .loaded みたいなことができない。
なぜなら、failed(viewStateError)のviewStateErrorのcaseに、文字列が含まれていて、caseのみ直接比較していい場合と、String?を比較しないといけない場合があるから。
ようするに、viewStateErrorのせいで、viewStateがEquatableになれないから、ちゃんと比較方法を定義してあげる必要があるわけ
enum viewState{
case loading
case loaded
case nodata
case failed(viewStateError)
}
enum viewStateError:Error{
case ArgumentError
case ArgumentErrorAPI
case ArgumentErrorCoordinate
case DataError
case DataFetchError(String?)
}
比較演算子(==)に、特定条件の時の比較方法を追加する
case DataFetchError(String?)
以外に関しては、そのまま比較ではいいけど、
case DataFetchError(String?)
の時は、引数で比較させたいので、分岐させる。
型が一致しない場合は、falseなので、defaultにfalseを入れておく
enum viewState,Equatable{
case loading
case loaded
case nodata
case failed(viewStateError)
}
enum viewStateError:Error,Equatable{
case ArgumentError
case ArgumentErrorAPI
case DataError
case DataFetchError(String?)
static func ==(a:viewStateError,b:viewStateError)->Bool{
switch (a,b){
case (.ArgumentError,.ArgumentError),
(.ArgumentErrorAPI,.ArgumentErrorAPI),
(.DataError,.DataError):
return true
case (.DataFetchError(let aMsg),.DataFetchError(let bMsg)):
return aMsg == bMsg
default:
return false
}
}
}
Equatableに準拠できたので、比較できるようになった。