web-dev-qa-db-fra.com

Comment rendre un Swift énumération avec les valeurs associées équitable

J'ai une énumération de valeurs associées que je voudrais rendre équivalente à des fins de test, mais je ne sais pas comment ce modèle fonctionnerait avec un cas d'énumération avec plus d'un argument.

Par exemple, résumée ci-dessous, je connais la syntaxe permettant de rendre le titre équitable. Comment cela fonctionnerait-il pour les options, qui contiennent plusieurs valeurs de différents types?

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
    }
}

Je sais Swift 4.1 peut synthétiser la conformité pour Equatable pour nous, mais pour le moment je ne suis pas en mesure de mettre à jour cette version.

11
Mississippi

Un moyen pratique consiste à utiliser cela tuples peut être comparé à ==. Vous souhaitez également inclure le code de compatibilité dans une vérification de version Swift, afin que la synthèse automatique soit utilisée une fois le projet mis à jour vers Swift 4.1:

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

Vous pouvez ajouter quelque chose comme ci-dessous, vérifiez ce lien pour plus d'informations. La déclaration de retour des options dépend de vos besoins.

#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