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

Магия Pattern matching в Swift

В Swift есть несколько способов работать с ассоциированными значениями enum и if case let - один из самых полезных, но его синтаксис часто путают. Давайте разберемся, как он работает и в каких случаях помогает писать чище.

Что такое case let и зачем он нужен:


Обычный if проверяет булево условие. Но если у вас enum с ассоциированными значениями, просто проверить тип недостаточно - нужно еще достать эти значения. Для этого есть if case let. Это сокращенная форма switch, когда вас интересует только один кейс.

Синтаксис может показаться непривычным: сначала идет if case let, потом шаблон, потом знак равенства и значение, которое вы проверяете.

Связывание значений:


Самый простой случай - извлечь все ассоциированные значения:

if case let Puppy.mastiff(droolRating, weight) = fido {
print("Рейтинг слюнявости: \(droolRating), вес: \(weight)")
}

Это эквивалентно switch, но без лишнего кода.
Можно связывать значения выборочно, используя let перед каждым:

if case Puppy.mastiff(let droolRating, let weight) = fido {
print("Рейтинг слюнявости: \(droolRating), вес: \(weight)")
}

А можно одним именем связать все значения в кортеж:

if case let Puppy.mastiff(characteristics) = fido {
print(characteristics) // (droolRating, weight)
}

Работа с опционалами:


Если значение, которое вы проверяете, опциональное, можно добавить ? после шаблона. Это синтаксический сахар, который избавляет от лишней вложенности:

if case let Puppy.mastiff(droolRating, weight)? = optionalPuppy {
// выполнится, только если optionalPuppy не nil и это кейс mastiff
}

Когда значения не нужны:


Если вас интересует только сам кейс, а значения не нужны, let можно опустить:

if case Puppy.mastiff = fido {
print("Это мастиф, какая разница какой?)
}

Добавление условий:


С помощью запятой можно добавить дополнительные проверки:

if case let Puppy.mastiff(droolRating, _) = fido, droolRating > 8 {
print("Диван пропал")
}

То же работает с guard:

guard case let Puppy.mastiff(droolRating, _) = fido, droolRating < 10 else {
print("В дом не пущу")
}

Перебор коллекций:


for case let позволяет фильтровать элементы во время итерации:

for case let Puppy.mastiff(droolRating, weight) in rescuePups where droolRating > 5 && weight > 15.0 {
print("Забираю этого")
}

Особенно полезно с опциональными значениями внутри ассоциированных. Например, есть enum с кейсом, у которого опциональный параметр, и нужно пройтись только по не nil значениям:

for case let SocialMedia.instagram(linkInBio?)? in pups.map(\.socialMedia) {
print(linkInBio)
}

Два вопросительных знака: первый раскрывает опциональность внутри кейса, второй - опциональность самого значения.

Вывод:


if case let - мощный инструмент для работы с enum, который делает код короче и понятнее, чем вложенные switch. Он особенно полезен, когда нужно обработать один конкретный кейс из нескольких, связать его значения и добавить условия. Освоив этот синтаксис, вы перестанете писать лишние switch для простых проверок.
03.06.2026 26 523