Equatable
Часть раздела Объектно-ориентированное программирование путешествия по Swift на Coddy. Урок 38 из 57.
Equatable предоставляет типу операторы == и !=. Для структур и перечислений, все свойства которых имеют тип Equatable, достаточно объявить соответствие этому протоколу, и Swift сравнит каждое свойство:
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"))Вывод:
true
trueЧтобы сравнивать только некоторые свойства, напишите static func == самостоятельно. Здесь два пользователя считаются равными, когда их идентификаторы совпадают, независимо от их имён:
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"))Вывод:
true
falseEquatable открывает доступ к стандартным методам, которым требуется сравнение, таким как contains(_:), firstIndex(of:) и == для целых массивов:
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)])Вывод:
true
1
trueКлассы не получают == автоматически: они сравнивают идентичность с помощью ===. Класс, который должен сравниваться по значению, должен сам реализовать ==:
class Color: Equatable {
let hex: String
init(hex: String) { self.hex = hex }
static func == (lhs: Color, rhs: Color) -> Bool { lhs.hex == rhs.hex }
}Задание
ЛегкоProduct содержит sku, name и price. Два продукта считаются одинаковыми, если их sku совпадают, независимо от значений остальных полей. Сделайте так, чтобы Product соответствовал Equatable, реализовав пользовательский ==, затем завершите mergeCatalog(_:): функция должна сохранять первое вхождение каждого продукта (используя contains) и возвращать строки sku name price, за которыми следует removed: 2.
Предоставленный код считывает продукты в виде строк sku,name,price и выводит каждую возвращённую строку.
Ваш код должен находиться в Product.swift и Functions.swift. В main.swift содержится предоставленный код ввода/вывода, и его нельзя редактировать.
Попробуйте сами
// Предоставленный код ввода/вывода: оставьте его как есть
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) }
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовМетоды и selfИнициализаторыКлассы — это ссылкиПовторение — читательский билет4Инкапсуляция
Контроль доступаТолько чтение извнеЗащита состоянияИнициализаторы с возможностью сбояПовторение — банковский счёт7Полиморфизм и обобщения
ПолиморфизмПриведение типовОбобщённые функцииОбобщённые типыПовторение — калькулятор фигур10Паттерны проектирования. Часть 2
Паттерн делегированияПаттерн декораторПаттерн строительПаттерн состояния2Структуры и типы-значения
СтруктурыСемантика значенийИзменяющие методыСтруктура или классПовторение — элемент инвентаря5Наследование
ПодклассыПереопределение методовИнициализаторы и superfinal и иерархииПовторение — иерархия сотрудников8Стандартные протоколы
CustomStringConvertibleEquatableComparableHashableПовторение — пользовательская сортировка11Проект: Управление библиотекой
Книги и читателиВыдача книгПотренируйтесь самостоятельно: Песочница Swift