Добавить объявление

Оператор ~= в Swift: скрытый помощник pattern matching'а

Вы когда-нибудь задумывались, как на самом деле работает 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. Его перегрузка позволяет создавать выразительный и гибкий код, адаптированный под конкретные задачи.
19.08.2025 9 429