Egor Mezhin
Фотография
нажмите — покажем
нажмите — покажем
😏 Ещё один пост на несложную тему от меня, чтобы проще и спокойнее вкатываться в рабочий процесс.
На этот раз про Equatable и Comparable.
Вещи знакомые, но на практике ими часто пользуются по инерции, не всегда задумываясь, чем они отличаются.
🔹 Equatable отвечает ровно на один вопрос:
равны ли два значения между собой.
struct User: Equatable {
let id: Int
let name: String
}
Теперь можно:
• сравнивать user1 == user2
• использовать removeDuplicates()
• помогать SwiftUI понимать, изменилось ли состояние
Где это обычно нужно:
• модели данных
• state в SwiftUI
• тесты
Важно:
Equatable ничего не говорит про порядок. Только одинаковые значения или нет.
🔹 Comparable нужен тогда, когда элементы можно упорядочить.
struct Score: Comparable {
let value: Int
static func < (lhs: Score, rhs: Score) -> Bool {
lhs.value < rhs.value
}
}
После этого можно:
• сортировать массивы
• использовать min() и max()
• работать с диапазонами
scores.sorted()
scores.max()
Важный момент:
если тип Comparable, он автоматически обязан быть Equatable.
Если мы умеем сравнивать порядок, мы обязаны понимать равенство.
🔹 В проектах нередко встречается:
• Comparable, хотя сортировка нигде не используется
• сложная логика сравнения «на будущее»
• протоколы, добавленные просто на всякий случай
На практике это редко даёт пользу и чаще усложняет модель.
🍕 Equatable и Comparable решают разные задачи, и в большинстве случаев достаточно минимально необходимого протокола.
Иногда полезно просто спросить себя:
я хочу проверить равенство или действительно упорядочить данные?
Ответ на этот вопрос часто делает модель и код вокруг неё заметно проще.
#R #Swift #SwiftUI
👏
1 · 284 ·