switch
определяет значение и сравнивает его с некоторыми возможными шаблонами совпадения. Она выполняет определённый блок кода, основываясь на первом успешно пройденном шаблоне. Инструкция switch
предоставляет альтернативу инструкции if
для ответа на несколько возможных состояний.
switch
сравнивает значение с одним или несколькими значениями одного типа.
switch
состоит из нескольких возможных кейсов, каждый из которых начинается с ключевого слова case
. В дополнение к сравнению с конкретными значениями Swift предоставляет несколько путей для каждого кейса определить более сложные шаблоны сравнения.Эти опции будут описаны далее в этой главе.
if
, каждый case есть отдельная ветвь кода. Инструкция switch
определяет, какой ветви следует быть выбранной. Эта процедура известна как переключение на значении, что было определено.
switch
должна быть исчерпывающей. Это значит, что всякое возможное значение типа должно быть сравнимо с кейсами/ инструкции switch
. Если нет необходимости предоставить кейс для каждого возможного значения, Вы можете определить кейс по-умолчанию для покрытия всех остальных значений, явно не заданных. Это значение по-умолчанию задаётся ключевым словом default
и должно всегда идти в конце.
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
по ошибке.
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", объедините два значения в один составной кейс, разделив значения запятыми.
let anotherCharacter: Character = "a"
switch anotherCharacter {
case "a", "A":
print("The letter A")
default:
print("Not the letter A")
}
// Выведет "The letter A"
switch
могут быть проверены на их вхождение в интервал. Этот пример демонстрирует числовые интервалы для предоставления обозначения чисел любой размерности на естественном языке:
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) для сравнения с любым возможным значением.
(Int, Int)
и определяет её положение на графике.
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, отцентрированного по началу координат, или вне квадрата.