Sobes.tech
Middle

Ako sa porovnávajú hodnoty v slovníku v jazyku Swift?

sobes.tech AI

Odpoveď od AI

Na porovnanie slovníkov v Swift sa používajú operátory rovnosti == a nerovnosti !=. Porovnávajú sa páry kľúč-hodnota. Pre úspešné porovnanie slovníkov pomocou operátora == je potrebné, aby kľúče aj hodnoty slovníka zodpovedali protokolu Equatable.

Porovnávajú sa nasledujúce aspekty:

  • Počet prvkov: Slovníky musia obsahovať rovnaký počet párov kľúč-hodnota.
  • Kľúče: Sada kľúčov v oboch slovníkoch sa zhoduje.
  • Hodnoty: Hodnoty spojené s rovnakými kľúčmi sú rovnaké.

Príklad porovnania:

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 (odlišné kľúče)
let isEqual1_4 = dict1 == dict4 // false (odlišné hodnoty pre kľúč "b")
let isNotEqual1_3 = dict1 != dict3 // true

Ak kľúče alebo hodnoty slovníka obsahujú typy, ktoré neimplementujú protokol Equatable, pokus o porovnanie pomocou == povedie k chybe pri kompilácii.

Príklad porovnania slovníkov s používateľskými typmi:

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

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

    // Implementácia `Equatable` pre `Product`
    static func == (lhs: Product, rhs: Product) -> Bool {
        return lhs.id == rhs.id && lhs.name == rhs.name
    }
}

// Slovník s `User` (ne `Equatable`) - povedie k chybe pri porovnaní
// let users1: [Int: User] = [1: User(id: 1, name: "Alice")]
// let users2: [Int: User] = [1: User(id: 1, name: "Alice")]
// let isEqualUsers = users1 == users2 // Chyba pri kompilácii

// Slovník s `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

Ak je potrebné porovnať slovníky obsahujúce typy, ktoré nie sú Equatable, je potrebné implementovať vlastnú logiku porovnania, ručne prechádzaním prvkov slovníka.