Swift Language
переключатель
Поиск…
параметры
параметр | подробности |
---|---|
Значение для тестирования | Переменная, которая сравнивается с |
замечания
Поставьте случай для каждого возможного значения вашего ввода. Используйте default case
по default case
для покрытия оставшихся значений ввода, которые вы не хотите указывать. Случай по умолчанию должен быть последним.
По умолчанию Переключатели в Swift не будут продолжать проверять другие случаи после согласования случая.
Основное использование
let number = 3
switch number {
case 1:
print("One!")
case 2:
print("Two!")
case 3:
print("Three!")
default:
print("Not One, Two or Three")
}
Операторы switch также работают с типами данных, отличными от целых. Они работают с любым типом данных. Вот пример включения строки:
let string = "Dog"
switch string {
case "Cat", "Dog":
print("Animal is a house pet.")
default:
print("Animal is not a house pet.")
}
Это напечатает следующее:
Animal is a house pet.
Согласование нескольких значений
Один случай в инструкции switch может совпадать по нескольким значениям.
let number = 3
switch number {
case 1, 2:
print("One or Two!")
case 3:
print("Three!")
case 4, 5, 6:
print("Four, Five or Six!")
default:
print("Not One, Two, Three, Four, Five or Six")
}
Соответствие диапазону
Один случай в инструкции switch может соответствовать диапазону значений.
let number = 20
switch number {
case 0:
print("Zero")
case 1..<10:
print("Between One and Ten")
case 10..<20:
print("Between Ten and Twenty")
case 20..<30:
print("Between Twenty and Thirty")
default:
print("Greater than Thirty or less than Zero")
}
Использование оператора where в коммутаторе
Оператор where может использоваться в совпадении с ключом, чтобы добавить дополнительные критерии, необходимые для положительного совпадения. Следующий пример проверяет не только диапазон, но также, если число нечетное или четное:
switch (temperature) {
case 0...49 where temperature % 2 == 0:
print("Cold and even")
case 50...79 where temperature % 2 == 0:
print("Warm and even")
case 80...110 where temperature % 2 == 0:
print("Hot and even")
default:
print("Temperature out of range or odd")
}
Удовлетворите одно из нескольких ограничений, используя переключатель
Вы можете создать кортеж и использовать такой переключатель:
var str: String? = "hi"
var x: Int? = 5
switch (str, x) {
case (.Some,.Some):
print("Both have values")
case (.Some, nil):
print("String has a value")
case (nil, .Some):
print("Int has a value")
case (nil, nil):
print("Neither have values")
}
Частичное совпадение
Оператор Switch использует частичное совпадение.
let coordinates: (x: Int, y: Int, z: Int) = (3, 2, 5)
switch (coordinates) {
case (0, 0, 0): // 1
print("Origin")
case (_, 0, 0): // 2
print("On the x-axis.")
case (0, _, 0): // 3
print("On the y-axis.")
case (0, 0, _): // 4
print("On the z-axis.")
default: // 5
print("Somewhere in space")
}
- Соответствует точно случаю, когда значение (0,0,0). Это источник 3D-пространства.
- Соответствует y = 0, z = 0 и любому значению x. Это означает, что координата находится на оси х.
- Соответствует x = 0, z = 0 и любому значению y. Это означает, что координата находится на оси.
- Соответствует x = 0, y = 0 и любому значению z. Это означает, что координата находится на оси z.
- Соответствует остальной части координат.
Примечание: использование подчеркивания означает, что вы не заботитесь о значении.
Если вы не хотите игнорировать значение, вы можете использовать его в своем операторе switch, например:
let coordinates: (x: Int, y: Int, z: Int) = (3, 2, 5)
switch (coordinates) {
case (0, 0, 0):
print("Origin")
case (let x, 0, 0):
print("On the x-axis at x = \(x)")
case (0, let y, 0):
print("On the y-axis at y = \(y)")
case (0, 0, let z):
print("On the z-axis at z = \(z)")
case (let x, let y, let z):
print("Somewhere in space at x = \(x), y = \(y), z = \(z)")
}
Здесь в примерах оси используется синтаксис let, чтобы вытащить соответствующие значения. Затем код печатает значения с использованием строковой интерполяции для построения строки.
Примечание: в этом операторе switch вам не требуется значение по умолчанию. Это связано с тем, что окончательный случай по существу является значением по умолчанию - он соответствует чему-либо, потому что ограничений на какую-либо часть кортежа нет. Если оператор switch исчерпывает все возможные значения со своими случаями, то по умолчанию не требуется.
Мы также можем использовать синтаксис let-where для соответствия более сложным случаям. Например:
let coordinates: (x: Int, y: Int, z: Int) = (3, 2, 5)
switch (coordinates) {
case (let x, let y, _) where y == x:
print("Along the y = x line.")
case (let x, let y, _) where y == x * x:
print("Along the y = x^2 line.")
default:
break
}
Здесь мы сопоставляем «y равно x» и «y равно x квадрату».
Переключительные провалы
Стоит отметить, что в быстрых, в отличие от других языков, с которыми знакомы люди, в конце каждого случая есть неявный перерыв. Чтобы перейти к следующему случаю (т. fallthrough
несколько случаев), вам нужно использовать инструкцию fallthrough
.
switch(value) {
case 'one':
// do operation one
fallthrough
case 'two':
// do this either independant, or in conjunction with first case
default:
// default operation
}
это полезно для таких вещей, как потоки.
Переключатель и перечисление
Оператор Switch очень хорошо работает с значениями Enum
enum CarModel {
case Standard, Fast, VeryFast
}
let car = CarModel.Standard
switch car {
case .Standard: print("Standard")
case .Fast: print("Fast")
case .VeryFast: print("VeryFast")
}
Поскольку мы предоставили случай для каждого возможного значения автомобиля, мы опускаем случай по
default
.
Переключатель и опции
Некоторые примеры случаев, когда результат является необязательным.
var result: AnyObject? = someMethod()
switch result {
case nil:
print("result is nothing")
case is String:
print("result is a String")
case _ as Double:
print("result is not nil, any value that is a Double")
case let myInt as Int where myInt > 0:
print("\(myInt) value is not nil but an int and greater than 0")
case let a?:
print("\(a) - value is unwrapped")
}
Переключатели и кортежи
Коммутаторы могут включать кортежи:
public typealias mdyTuple = (month: Int, day: Int, year: Int)
let fredsBirthday = (month: 4, day: 3, year: 1973)
switch theMDY
{
//You can match on a literal tuple:
case (fredsBirthday):
message = "\(date) \(prefix) the day Fred was born"
//You can match on some of the terms, and ignore others:
case (3, 15, _):
message = "Beware the Ides of March"
//You can match on parts of a literal tuple, and copy other elements
//into a constant that you use in the body of the case:
case (bobsBirthday.month, bobsBirthday.day, let year) where year > bobsBirthday.year:
message = "\(date) \(prefix) Bob's \(possessiveNumber(year - bobsBirthday.year))" +
"birthday"
//You can copy one or more elements of the tuple into a constant and then
//add a where clause that further qualifies the case:
case (susansBirthday.month, susansBirthday.day, let year)
where year > susansBirthday.year:
message = "\(date) \(prefix) Susan's " +
"\(possessiveNumber(year - susansBirthday.year)) birthday"
//You can match some elements to ranges:.
case (5, 1...15, let year):
message = "\(date) \(prefix) in the first half of May, \(year)"
}
Соответствие по классу - отлично подходит для подготовки к обучению
Вы также можете сделать переключатель оператора switch на основе класса вещи, которую вы включаете.
Пример, где это полезно, - в prepareForSegue
. Я использовал для переключения на основе идентификатора segue, но это хрупкое. если позже вы измените раскадровку и переименуете идентификатор segue, он сломает ваш код. Или, если вы используете segues для нескольких экземпляров того же класса контроллера вида (но разные сценарии раскадровки), вы не можете использовать идентификатор segue для определения класса адресата.
Операции Swift для спасения.
Используйте Swift case let var as Class
синтаксис case let var as Class
, например:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
switch segue.destinationViewController {
case let fooViewController as FooViewController:
fooViewController.delegate = self
case let barViewController as BarViewController:
barViewController.data = data
default:
break
}
}
В Swift 3 ситакс слегка изменился:
override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
switch segue.destinationViewController {
case let fooViewController as FooViewController:
fooViewController.delegate = self
case let barViewController as BarViewController:
barViewController.data = data
default:
break
}
}