エラー一覧の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に準拠できたので、比較できるようになった。

コメント