Sobes.tech
Middle

Hogyan hasonlítjuk össze a szótár értékeit a Swift nyelvben?

sobes.tech MI

Válasz az MI-től

A Swiftben lévő szótárak összehasonlításához az == és != egyenlőség- és nem egyenlőség operátorokat használják. Párban összehasonlítják a kulcs-érték párokat. Az == operátorral való sikeres összehasonlításhoz a szótár kulcsainak és értékeinek is meg kell felelniük az Equatable protokollnak.

Az alábbi szempontokat hasonlítják össze:

  • Elem szám: A szótáraknak ugyanannyi kulcs-érték párt kell tartalmazniuk.
  • Kulcsok: Mindkét szótár kulcsainak halmaza egyezzen.
  • Értékek: Azonos kulcsokhoz tartozó értékeknek egyezniük kell.

Példa összehasonlítás:

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 (különböző kulcsok)
let isEqual1_4 = dict1 == dict4 // false (különböző értékek a "b" kulcshoz)
let isNotEqual1_3 = dict1 != dict3 // true

Ha a szótár kulcsai vagy értékei olyan típusokat tartalmaznak, amelyek nem valósítják meg az Equatable protokollt, akkor az == használatával való összehasonlítás fordítási hibát eredményez.

Egyéni típusokat tartalmazó szótárak összehasonlításának példája:

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

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

    // Az `Equatable` megvalósítása a `Product`-hez
    static func == (lhs: Product, rhs: Product) -> Bool {
        return lhs.id == rhs.id && lhs.name == rhs.name
    }
}

// Szótár User típusokkal (nem `Equatable`) - fordítási hibát okoz
// let users1: [Int: User] = [1: User(id: 1, name: "Alice")]
// let users2: [Int: User] = [1: User(id: 1, name: "Alice")]
// let isEqualUsers = users1 == users2 // Fordítási hiba

// Szótár Product típusokkal (`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

Ha olyan típusokat tartalmazó szótárakat szeretne összehasonlítani, amelyek nem Equatable-ek, akkor saját összehasonlító logikát kell írnia, ami manuálisan végigiterál a szótár elemein.