В
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 для простых проверок.