Sobes.tech
Middle

Como são comparados os valores no dicionário na linguagem Swift?

sobes.tech IA

Resposta da IA

Para comparar dicionários em Swift, usam-se os operadores de igualdade == e de desigualdade !=. São comparados pares chave-valor. Para que a comparação com o operador == seja bem-sucedida, tanto as chaves quanto os valores do dicionário devem conformar ao protocolo Equatable.

São comparados os seguintes aspetos:

  • Número de elementos: Os dicionários devem conter o mesmo número de pares chave-valor.
  • Chaves: O conjunto de chaves em ambos os dicionários deve coincidir.
  • Valores: Os valores associados às mesmas chaves devem ser iguais.

Exemplo de comparação:

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 (chaves diferentes)
let isEqual1_4 = dict1 == dict4 // false (valores diferentes para a chave "b")
let isNotEqual1_3 = dict1 != dict3 // true

Se as chaves ou os valores do dicionário contiverem tipos que não implementam o protocolo Equatable, a tentativa de compará-los com == resultará em erro de compilação.

Exemplo de comparação de dicionários com tipos personalizados:

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

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

    // Implementação de Equatable para Product
    static func == (lhs: Product, rhs: Product) -> Bool {
        return lhs.id == rhs.id && lhs.name == rhs.name
    }
}

// Dicionário com User (não Equatable) - resultará em erro de compilação ao comparar
// let users1: [Int: User] = [1: User(id: 1, name: "Alice")]
// let users2: [Int: User] = [1: User(id: 1, name: "Alice")]
// let isEqualUsers = users1 == users2 // Erro de compilação

// Dicionário com 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

Se desejar comparar dicionários contendo tipos que não sejam Equatable, será necessário implementar uma lógica de comparação personalizada, percorrendo manualmente os elementos do dicionário.