Sobes.tech
Middle

Comment comparer les valeurs dans un dictionnaire en Swift?

sobes.tech IA

Réponse de l'IA

Pour comparer des dictionnaires en Swift, on utilise les opérateurs d'égalité == et de non-égalité !=. Les paires clé-valeur sont comparées. Pour que la comparaison avec l'opérateur == réussisse, tant les clés que les valeurs du dictionnaire doivent respecter le protocole Equatable.

Les aspects suivants sont comparés :

  • Nombre d'éléments : Les dictionnaires doivent contenir le même nombre de paires clé-valeur.
  • Clés : L'ensemble des clés doit correspondre dans les deux dictionnaires.
  • Valeurs : Les valeurs associées aux mêmes clés doivent être égales.

Exemple de comparaison :

let dict1: [String: Int] = ["a": 1, "b": 2]
let dict2: [String: Int] = ["a": 1, "b": 2]
let dict3: [String: Int] = ["a": 1, "c": 3]
let dict4: [String: Int] = ["a": 1, "b": 3]

let isEqual1_2 = dict1 == dict2 // true
let isEqual1_3 = dict1 == dict3 // false (clés différentes)
let isEqual1_4 = dict1 == dict4 // false (valeurs différentes pour la clé "b")
let isNotEqual1_3 = dict1 != dict3 // true

Si les clés ou les valeurs du dictionnaire contiennent des types qui n'implémentent pas le protocole Equatable, une tentative de comparaison avec == entraînera une erreur de compilation.

Exemple de comparaison de dictionnaires avec des types personnalisés :

struct User {
    let id: Int
    let name: String
}

struct Product: Equatable {
    let id: Int
    let name: String

    // Implémentation de Equatable pour Product
    static func == (lhs: Product, rhs: Product) -> Bool {
        return lhs.id == rhs.id && lhs.name == rhs.name
    }
}

// Dictionnaire avec User (non Equatable) - entraînera une erreur de compilation lors de la comparaison
// let users1: [Int: User] = [1: User(id: 1, name: "Alice")]
// let users2: [Int: User] = [1: User(id: 1, name: "Alice")]
// let isEqualUsers = users1 == users2 // Erreur de compilation

// Dictionnaire avec Product (Equatable)
let products1: [Int: Product] = [1: Product(id: 1, name: "Apple"), 2: Product(id: 2, name: "Banana")]
let products2: [Int: Product] = [1: Product(id: 1, name: "Apple"), 2: Product(id: 2, name: "Banana")]
let products3: [Int: Product] = [1: Product(id: 1, name: "Apple"), 2: Product(id: 3, name: "Cherry")]

let isEqualProducts1_2 = products1 == products2 // true
let isEqualProducts1_3 = products1 == products3 // false

Si vous souhaitez comparer des dictionnaires contenant des types non Equatable, il est nécessaire d'implémenter une logique de comparaison personnalisée, en parcourant manuellement les éléments du dictionnaire.