ПрограммированиеMiddle iOS Developer

Как работает pattern matching с использованием tuples (кортежей) в Swift и какие тонкости следует учитывать при сравнении кортежей?

Проходите собеседования с ИИ помощником Hintsage

Ответ

Pattern matching для кортежей в Swift позволяет удобно сравнивать и распаковывать значения. В switch можно разбирать кортежи прямо в паттерне:

let point = (x: 0, y: 2) switch point { case (0, 0): print("В начале координат") case (0, let y): print("x = 0, y = \(y)") case let (x, y) where x == y: print("x равен y") default: print("Другая точка") }

Тонкости:

  • Количество и порядок элементов обязаны совпадать с кортежем.
  • Possible binding и guard выражения работают как с обычными переменными.
  • Возможен exhaustiveness check только для tuple из значений, для которых определён полный диапазон.

Вопрос с подвохом

Можно ли в switch-case использовать сравнение кортежа типа (String, Int) с case-паттерном из разных типов, например case (let a, let b):?

Часто отвечают, что можно, но важно — типы переменных в паттерне должны строго соответствовать типу кортежа.

let pair = ("abc", 5) switch pair { case (let text, let number): print("Строка: \(text), число: \(number)") // Ok case (let x, let y) where x == y: print("Error") // Error: Binary operator '==' cannot be applied to operands of type 'String' and 'Int' default: break }

Если types не совпадают, компилятор выдаст ошибку на этапе компиляции.

Примеры реальных ошибок из-за незнания тонкостей темы


История

В одном проекте пытались использовать switch-case для разбора ответа сервера как tuple, не учитывая возможные значения nil. Это приводило к тому, что ни один case не подходил, и срабатывал default, хотя предусматривалась другая логика.


История

Несовпадение типов: в функции обработчик кортежа получал (Int, String), а попытались распаковать как (String, Int). Результат — краш на этапе компиляции и потерянное время на поиск причины.


История

Использовали guard для распаковки кортежа результата без учёта варианта с отрицательными значениями, хотя обработка предусматривалась только для положительных чисел. В итоге часть валидных кейсов игнорировалась, что оказалось проблемой в бизнес-логике.