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