Menu
Coddy logo textTech

Equatable

Fait partie de la section Programmation orientée objet du Journey Swift de Coddy. Leçon 38 sur 57.

Equatable fournit à un type les opérateurs == et !=. Pour les structures et les énumérations dont toutes les propriétés sont Equatable, il suffit de déclarer la conformité, et Swift compare chaque propriété :

struct Card: Equatable {
    let rank: Int
    let suit: String
}

let a = Card(rank: 10, suit: "hearts")
let b = Card(rank: 10, suit: "hearts")
print(a == b)
print(a != Card(rank: 2, suit: "hearts"))

Résultat :

true
true

Pour comparer uniquement certaines propriétés, écrivez vous-même static func ==. Ici, deux utilisateurs sont égaux lorsque leurs identifiants correspondent, quels que soient leurs noms :

struct User: Equatable {
    let id: Int
    var name: String

    static func == (lhs: User, rhs: User) -> Bool {
        lhs.id == rhs.id
    }
}

print(User(id: 1, name: "Ada") == User(id: 1, name: "Ada L."))
print(User(id: 1, name: "Ada") == User(id: 2, name: "Ada"))

Résultat :

true
false

Equatable déverrouille les méthodes standard qui nécessitent une comparaison, telles que contains(_:), firstIndex(of:) et == sur des tableaux entiers :

struct Point: Equatable {
    let x: Int, y: Int
}

let path = [Point(x: 0, y: 0), Point(x: 1, y: 2)]
print(path.contains(Point(x: 1, y: 2)))
print(path.firstIndex(of: Point(x: 1, y: 2))!)
print(path == [Point(x: 0, y: 0), Point(x: 1, y: 2)])

Sortie :

true
1
true

Les classes n’obtiennent pas automatiquement == : elles comparent l’identité avec ===. Une classe qui doit être comparée par valeur doit implémenter elle-même == :

class Color: Equatable {
    let hex: String
    init(hex: String) { self.hex = hex }
    static func == (lhs: Color, rhs: Color) -> Bool { lhs.hex == rhs.hex }
}
challenge icon

Défi

Facile

Product possède sku, name et price. Deux produits sont identiques lorsque leur sku correspond, quels que soient les autres champs. Faites en sorte que Product soit conforme à Equatable avec un == personnalisé, puis complétez mergeCatalog(_:), qui conserve la première occurrence de chaque produit (à l’aide de contains) et renvoie des lignes sku name price suivies de removed: 2.

Le code fourni lit les produits sous forme de lignes sku,name,price et affiche chaque ligne renvoyée.

Votre code doit être placé dans Product.swift et Functions.swift. main.swift contient le code d’entrée/sortie fourni et ne peut pas être modifié.

Essayez vous-même

// Code d'entrée/sortie fourni : le garder tel quel
var input: [String] = []
while let line = readLine() { input.append(line) }
let products = input.map { line -> Product in
    let p = line.split(separator: ",").map(String.init)
    return Product(sku: p[0], name: p[1], price: Int(p[2])!)
}
for line in mergeCatalog(products) { print(line) }
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Playground Swift