Middle
Jak porównywane są wartości w słowniku w języku Swift?
sobes.tech AI
Odpowiedź od AI
Aby porównać słowniki w Swift, używa się operatorów równości == i nierówności !=. Porównywane są pary klucz-wartość. Aby porównanie z operatorem == zakończyło się sukcesem, zarówno klucze, jak i wartości słownika muszą spełniać protokół Equatable.
Porównuje się następujące aspekty:
- Liczba elementów: słowniki muszą zawierać taką samą liczbę par klucz-wartość.
- Klucze: zestaw kluczy w obu słownikach musi się zgadzać.
- Wartości: wartości powiązane z tymi samymi kluczami muszą być równe.
Przykład porównania:
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 (różne klucze)
let isEqual1_4 = dict1 == dict4 // false (różne wartości dla klucza "b")
let isNotEqual1_3 = dict1 != dict3 // true
Jeśli klucze lub wartości słownika zawierają typy, które nie implementują protokołu Equatable, próba porównania ich za pomocą == spowoduje błąd kompilacji.
Przykład porównania słowników z typami niestandardowymi:
struct User {
let id: Int
let name: String
}
struct Product: Equatable {
let id: Int
let name: String
// Implementacja `Equatable` dla `Product`
static func == (lhs: Product, rhs: Product) -> Bool {
return lhs.id == rhs.id && lhs.name == rhs.name
}
}
// Słownik z User (nie `Equatable`) - spowoduje błąd kompilacji
// let users1: [Int: User] = [1: User(id: 1, name: "Alice")]
// let users2: [Int: User] = [1: User(id: 1, name: "Alice")]
// let isEqualUsers = users1 == users2 // Błąd kompilacji
// Słownik z 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
Jeśli chcesz porównać słowniki zawierające typy, które nie są Equatable, musisz zaimplementować własną logikę porównania, ręcznie przechodząc przez elementy słownika.