web-dev-qa-db-ja.com

Swift列挙型を関連付けられた値と等価にする方法

テスト目的で赤道化したい関連する値の列挙がありますが、このパターンが複数の引数を持つ列挙ケースでどのように機能するかわかりません。

たとえば、以下に要約すると、見出しを赤道化するための構文を知っています。これは、異なるタイプの複数の値を含むオプションに対してどのように機能しますか?

enum ViewModel {
    case heading(String)
    case options(id: String, title: String, enabled: Bool)
}

func ==(lhs: ViewModel, rhs: ViewModel) -> Bool {
    switch (lhs, rhs) {
    case (let .heading(lhsString), let .heading(rhsString)):
        return lhsString == rhsString
    case options...
    default:
        return false
    }
}

Swift 4.1はEquatableの適合性を合成することができますが、現時点ではこのバージョンに更新することはできません。

11
Mississippi

便利な方法は、タプル==と比較できることを使用することです。また、多くの場合、プロジェクトをSwift 4.1に更新すると、自動合成が使用されるように、互換性コードをSwiftバージョンチェックで囲みます。

enum ViewModel: Equatable {
    case heading(String)
    case options(id: String, title: String, enabled: Bool)

    #if Swift(>=4.1)
    #else
    static func ==(lhs: ViewModel, rhs: ViewModel) -> Bool {
        switch (lhs, rhs) {
        case (let .heading(lhsString), let .heading(rhsString)):
            return lhsString == rhsString
        case (let .options(lhsId, lhsTitle, lhsEnabled), let .options(rhsId, rhsTitle, rhsEnabled)):
            return (lhsId, lhsTitle, lhsEnabled) == (rhsId, rhsTitle, rhsEnabled)
        default:
            return false
        }
    }
    #endif
}
17
Martin R

以下のようなものを追加できます。詳細については、 this link を確認してください。オプションのreturnステートメントは、ニーズによって異なります。

#if Swift(>=4.1)
#else
func ==(lhs: ViewModel, rhs: ViewModel) -> Bool {
    switch (lhs, rhs) {
    case (let .heading(lhsString), let .heading(rhsString)):
        return lhsString == rhsString

    case (let .options(id1, title1, enabled1),let .options(id2, title2, enabled2)):
        return id1 == id2 && title1 == title2 && enabled1 == enabled2
    default:
        return false
    }
}
#endif
4
ymutlu