Sobes.tech
Middle

Cum sunt comparate valorile din dictionar în limbajul Swift?

sobes.tech AI

Răspuns de la AI

Pentru compararea dicționarelor în Swift, se folosesc operatorii de egalitate == și de inegalitate !=. Se compară perechile cheie-valoare. Pentru ca compararea cu operatorul == să fie de succes, atât cheile, cât și valorile dicționarului trebuie să respecte protocolul Equatable.

Se compară următoarele aspecte:

  • Numărul de elemente: Dicționarele trebuie să conțină același număr de perechi cheie-valoare.
  • Cheile: Setul de chei din ambele dicționare trebuie să coincidă.
  • Valorile: Valorile asociate cu aceleași chei trebuie să fie egale.

Exemplu de comparare:

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 (chei diferite)
let isEqual1_4 = dict1 == dict4 // false (valori diferite pentru cheia "b")
let isNotEqual1_3 = dict1 != dict3 // true

Dacă cheile sau valorile dicționarului conțin tipuri care nu implementează protocolul Equatable, încercarea de a le compara cu == va duce la o eroare de compilare.

Exemplu de comparare a dicționarelor cu tipuri personalizate:

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

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

    // Implementarea `Equatable` pentru `Product`
    static func == (lhs: Product, rhs: Product) -> Bool {
        return lhs.id == rhs.id && lhs.name == rhs.name
    }
}

// Dicționar cu User (nu `Equatable`) - va duce la o eroare de compilare
// let users1: [Int: User] = [1: User(id: 1, name: "Alice")]
// let users2: [Int: User] = [1: User(id: 1, name: "Alice")]
// let isEqualUsers = users1 == users2 // Eroare

// Dicționar cu 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

Dacă doriți să comparați dicționare care conțin tipuri care nu sunt Equatable, trebuie să implementați o logică de comparare personalizată, parcurgând manual elementele dicționarului.