Основы Swift / 7.1. Инструкция switch


Видео


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

В своей простейшей форме инструкция switch сравнивает значение с одним или несколькими значениями одного типа.

Каждая инструкция switch состоит из нескольких возможных кейсов, каждый из которых начинается с ключевого слова case. В дополнение к сравнению с конкретными значениями Swift предоставляет несколько путей для каждого кейса определить более сложные шаблоны сравнения.Эти опции будут описаны далее в этой главе.

Так же, как и тело инструкции if, каждый case есть отдельная ветвь кода. Инструкция switch определяет, какой ветви следует быть выбранной. Эта процедура известна как переключение на значении, что было определено.

Каждая инструкция switch должна быть исчерпывающей. Это значит, что всякое возможное значение типа должно быть сравнимо с кейсами/ инструкции switch. Если нет необходимости предоставить кейс для каждого возможного значения, Вы можете определить кейс по-умолчанию для покрытия всех остальных значений, явно не заданных. Это значение по-умолчанию задаётся ключевым словом default и должно всегда идти в конце.
@{7.1\1}
let someCharacter: Character = "z"
switch someCharacter {
case "a":
    print("The first letter of the alphabet")
case "z":
    print("The last letter of the alphabet")
default:
    print("Some other character")
}
// Выведет "The last letter of the alphabet"
Этот пример использует инструкцию switch для определения одного символа нижнего регистра с названием someCharacter. Первый кейс инструкции switch совпадает с первой буквой английского алфавита - a - а второй кейс совпадает с последней буквой - z. Так как switch должен иметь кейс для всякого возможного символа, а не только для букв алфавита, то инструкция switch использует кейс default для проверки всех значений между a и z. Этот подход гарантирует, что инструкция switch будет исчерпывающей.
Неявное полное прохождение
В отличие от инструкций switch в C и Objective-C инструкции switch в Swift не проваливаются внизу каждого кейса в другие кейсы. Вместо этого вся инструкция switch завершает своё выполнение, как только завершится первый подходящий кейс switch без явного использования инструкции break. Это делает инструкцию switch более безопасной и простой для использования нежели её аналог в C и позволяет избежать выполнения более одного кейса switch по ошибке.

Тело каждого кейса должно содержать хотя бы одну выполнимую инструкцию. Некорректно писать такой код, так как первый кейс пуст:
@{7.1\2}
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a":
case "A":
    print("The letter A")
default:
    print("Not the letter A")
}
// Это выдаст ошибку времени компиляции
Скажи нет пустым кейсам
В отличие от инструкции switch в C эта инструкция switch не сравнивает и "a", и "A". Вместо этого она выдаст ошибку времени компиляции о том, что case "a" не содержит ни одной исполнимой инструкции. Этот подход позволяет избежать ошибочных полных проходов из одного кейса в другой и делает код более безопасным и понятным.

Чтобы сделать switch с одним кейсом, который сравнивает и "a", и "A", объедините два значения в один составной кейс, разделив значения запятыми.
@{7.1\3}
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a", "A":
    print("The letter A")
default:
    print("Not the letter A")
}
// Выведет "The letter A"
Вхождение в интервал
Значения в кейсах switch могут быть проверены на их вхождение в интервал. Этот пример демонстрирует числовые интервалы для предоставления обозначения чисел любой размерности на естественном языке:
@{7.1\4}
let approximateCount = 62
let countedThinges = "moons orbiting Saturn"
let naturalCount: String
switch approximateCount {
case 0:
    naturalCount = "no"
case 1..<5:
    naturalCount = "a few"
case 5..<12:
    naturalCount = "several"
case 12..<100:
    naturalCount = "dozens of"
case 100..<1000:
    naturalCount = "hundreds of"
default:
    naturalCount = "many"
}
print("There are \(naturalCount) \(countedThings)")
// Выводит "There are dozens of moons orbiting Saturn"
В примере approximateCount вычисляется в switch-инструкции. Каждый case сравнивает это значение с числом или интервалом. Так как значение approximateCount попадает между 12 и 100, то naturalCount присваивается значение "dozens of", а управление передаётся в инструкцию switch.
Кортежи
Вы можете использовать кортежи для проверки нескольких значений в одном switch. Каждый элемент кортежа может быть сравнён с разными значениями или интервалами значений. Используйте символ нижнего подчёркивания (_) (wildcard) для сравнения с любым возможным значением.

Пример ниже использует точку (x, y), заданную простым кортежем типа (Int, Int) и определяет её положение на графике.
Рисунок 7.1.1
@{7.1\5}
let somePoint = (1, 1)
switch somePoint {
case (0, 0):
    print("\(somePoint) is at the origin")
case (_, 0):
    print("\(somePoint) is on the x-axis")
case (0, _):
    print("\(somePoint) is on the y-axis")
case (-2...2, -2...2):
    print("\(somePoint) is inside the box")
default:
    print("\(somePoint) is outside the box")
}
// Выводит "(1, 1) is inside the box"
Инструкция switch определяет, находится ли точка в центре координат (0, 0), на красной x-оси, на оранжевой y-оси, внутри голубого квадрата 4x4, отцентрированного по началу координат, или вне квадрата.

В отличии от C Swift позволяет нескольким switch-кейсам пересекаться по условиям проверки. Фактически точка (0, 0) может попадать во все четыре кейса в этом примере. Однако, если несколько совпадений возможно, будет всегда использовано первое. Точка (0, 0) совпадёт сперва с case (0, 0), так что все остальные кейсы будут проигнорированы.