В Swift pattern matching с Optional позволяет элегантно и безопасно обрабатывать значения, которые могут быть nil. Помимо прямой проверки через if let и guard let, доступны и другие варианты, такие как case let, if case, guard case, особенно полезные, когда нужно не только извлечь значение, но и наложить дополнительные условия.
Пример стандартного извлечения:
if let value = optionalValue { print("Value is \(value)") }
Пример pattern matching с условием:
if case let .some(value) = optionalValue, value > 10 { print("Value is greater than 10: \(value)") }
Аналогично, с guard:
guard case let .some(value) = optionalValue else { return }
Тонкости:
Чем отличаются конструкции if let value = x as? Int и if case let value? = x при работе с optional в Swift?
Ответ:
if let value = x as? Int используется для optional binding с приведением типа.if case let value? = x — это паттерн-матчинг, который извлекает non-nil значение из optional.Пример:
let x: Int? = 42 if case let value? = x { print("value is \(value)") // Выведет 42 }
Это сработает, когда x не nil, не делая дополнительного приведения типа, в отличие от as?.
История
Разработчик пытался выполнить несколько optional binding в одном выражении с помощью
if let, не зная о pattern matching с кортежами. В результате код стал сложнее из-за вложенных if, хотя корректное решение позволяло бы объединить проверки с помощьюif case let (a?, b?) = (a, b), повысив читаемость и безопасность.
История
Проведен pattern matching вида
if case .some(let value) = optional, value > 10 {...}, но забыто предусмотреть возможность nil, из-за чего в else-ветку попадали не только значения < 10, но и nil.
История
Использовали не ту конструкцию для опциональных enum (например, if case .some(let .myCase(value)) = x), приведя к крэшу при nil значении. Правильный способ — сначала распаковать optional через if let, после чего выполнять pattern matching по enum.