Вы когда-нибудь задумывались, как на самом деле работает switch-case в
Swift? Под капотом он использует малоизвестный, но мощный оператор
~=, который отвечает за сравнение значений.
Что делает оператор данный оператор:
Это бинарный оператор, который возвращает
true, если значения совпадают. По умолчанию он просто сравнивает два значения, но его можно перегружать для кастомной логики.
Пример с диапазонами:
let range = 1..<10
print(5 ~= range) // true потому что 5 входит в диапазон
print(15 ~= range) // false
Кастомная реализация для своих типов:
Давайте создадим свой тип и реализуем для него
pattern matching:
protocol Matchable {
var matchKey: String { get }
}
struct User: Matchable {
let email: String
var matchKey: String { email }
}
// Перегружаем оператор ~=
func ~=(pattern: String, value: Matchable) -> Bool {
return value.matchKey == pattern
}
let user = User(email: "test@test.com")
switch user {
case "test@test.com": // Теперь работает благодаря нашему оператору
print("Привет, тестировщик!")
default:
print("Неизвестный пользователь")
}
// Выведет: Привет, тестировщик!
Где это может пригодиться:
- Для сравнения сложных структур.
- При работе с кастомными типами в switch-case.
- Для создания выразительных условий в if-else.
Вывод:
Оператор
~= мощный инструмент для кастомного сравнения значений, который особенно полезен при работе с собственными типами в конструкциях
switch и
if. Его перегрузка позволяет создавать выразительный и гибкий код, адаптированный под конкретные задачи.