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
truePour 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
falseEquatable 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
trueLes 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 }
}Défi
FacileProduct 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) }
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
1Classes et objets
Travailler avec des fichiersDéfinir des classesMéthodes et selfInitialiseursLes classes sont des référencesRécapitulatif - Carte de bibliothèque4Encapsulation
Contrôle d’accèsLecture seule depuis l’extérieurProtection de l’étatInitialiseurs pouvant échouerRécapitulatif - Compte bancaire7Polymorphisme et génériques
PolymorphismeConversion de typeFonctions génériquesTypes génériquesRécapitulatif - Calculateur de formes2Structures et types valeur
StructuresSémantique de valeurMéthodes mutantesStructure ou classeRécapitulatif - article d’inventaire5Héritage
Sous-classesRedéfinition des méthodesInitialiseurs et superfinal et hiérarchiesRécapitulatif - hiérarchie des employés8Protocoles standard
CustomStringConvertibleEquatableComparableHashableRécapitulatif - Tri personnalisé11Projet : Gestion de bibliothèque
Livres et membresEmprunter des livresEntraînez-vous par vous-même : Playground Swift