Образцы
Образец представляет структуру единственного значения или составного значения. Например, структура кортежа (1, 2)
список разделенных запятой значений двух элементов. Поскольку образцы представляют структуру значения, а не любого определенного значения, можно соответствовать им множеству значений. Например, образец (x, y)
соответствует кортеж (1, 2)
и любой другой кортеж с двумя элементами. В дополнение к соответствию образца со значением можно извлечь часть или все составное значение и связать каждую часть с постоянным или именем переменной.
В Swift образцы происходят в объявлениях переменной и объявлениях константы (на их левой стороне), в for
-in
операторы, и в switch
операторы (в их метках случая). Несмотря на то, что любой образец может произойти в метках случая a switch
оператор, в других контекстах, только подстановочные образцы, образцы идентификатора и образцы, содержащие те два образца, может произойти.
Можно указать аннотацию типа для подстановочного образца, образца идентификатора и образца кортежа, чтобы ограничить образец соответствовать только значения определенного типа.
Грамматика образца
образец → «подстановочная аннотация типа образца выбирает»
образец → «аннотация типа образца идентификатора выбирает»
образец → обязательный образец значения -
образец → «аннотация типа образца кортежа выбирает»
образец → перечислимый образец случая -
образец → образец преобразования типа -
образец → образец выражения -
Подстановочный образец
Подстановочный образец соответствует и игнорирует любое значение и состоит из подчеркивания (_
). Используйте подстановочный образец, когда Вы не будете заботиться о значениях, соответствующих против. Например, следующий код выполняет итерации через закрытый диапазон 1...3
, игнорирование текущей стоимости диапазона на каждой итерации цикла:
for _ in 1...3 {
// Do something three times.
}
Образец идентификатора
Образец идентификатора соответствует любое значение и связывает соответствующее значение с переменным или постоянным именем. Например, в следующем объявлении константы, someValue
образец идентификатора, соответствующий значение 42
из типа Int
:
let someValue = 42
Когда соответствие успешно выполняется, значение 42
связывается (присвоенный) постоянному имени someValue
.
Когда образец на левой стороне объявления переменной или объявления константы является образцом идентификатора, образец идентификатора является неявно подобразцом связывающего значение образца.
Грамматика образца идентификатора
образец идентификатора → идентификатор -
Связывающий значение образец
Связывающий значение образец связывает соответствующие значения с переменными или постоянными именами. Связывающие значение образцы, связывающие соответствующее значение с именем константы, начинаются с ключевого слова let
; те, которые связывают с именем переменной, начинают с ключевого слова var
.
Образцы идентификаторов в связывающем значение образце связывают новые именованные переменные или константы к их совпадающим значениям. Например, можно анализировать элементы кортежа и связать значение каждого элемента к соответствующему образцу идентификатора.
let point = (3, 2)
switch point {
// Bind x and y to the elements of point.
case let (x, y):
println("The point is at (\(x), \(y)).")
}
// prints "The point is at (3, 2)."
В примере выше, let
распределяет каждому образцу идентификатора в образце кортежа (x, y)
. Из-за этого поведения, switch
случаи case let (x, y):
и case (let x, let y):
соответствуйте те же значения.
Образец кортежа
Образец кортежа является списком разделенных запятой значений нуля или большего количества образцов, включенных в круглые скобки. Образцы кортежа соответствуют значения соответствующих типов «кортеж».
Можно ограничить образец кортежа соответствовать определенные виды типов «кортеж» при помощи аннотаций типа. Например, образец кортежа (x, y): (Int, Int)
в объявлении константы let (x, y): (Int, Int) = (1, 2)
соответствия только типы «кортеж», в которых оба элемента имеют тип Int
. Для ограничения только некоторых элементов образца кортежа обеспечьте аннотации типа непосредственно для тех отдельных элементов. Например, образец кортежа в let (x: String, y)
соответствия любой тип «кортеж» с двумя элементами, пока первый элемент имеет тип String
.
Когда образец кортежа используется в качестве образца в a for
-in
оператор или в объявлении переменной или объявлении константы, это может содержать только подстановочные образцы, образцы идентификатора или другие образцы кортежа, содержащие тех. Например, следующий код не допустим потому что элемент 0
в образце кортежа (x, 0)
характер экспрессии:
let points = [(0, 0), (1, 0), (1, 1), (2, 0), (2, 1)]
// This code isn't valid.
for (x, 0) in points {
/* ... */
}
Круглые скобки вокруг образца кортежа, содержащего единственный элемент, не имеют никакого эффекта. Образец соответствует значения типа того единственного элемента. Например, следующее эквивалентны:
let a = 2 // a: Int = 2
let (a) = 2 // a: Int = 2
let (a): Int = 2 // a: Int = 2
Грамматика образца кортежа
образец кортежа
→ (
«список элемента рисунка кортежа выбирает»)
элемент образца кортежа перечисляет
→
элемент рисунка кортежа -
элемент рисунка кортежа -,
«список элемента рисунка кортежа»
элемент рисунка кортежа → образец -
Образец случая перечисления
Образец случая перечисления соответствует случай существующего типа перечисления. Образцы случая перечисления появляются только в switch
метки случая оператора.
Если случай перечисления, который Вы пытаетесь соответствовать, имеет какие-либо присваиваемые значения, соответствующий образец случая перечисления должен указать образец кортежа, содержащий один элемент для каждого присваиваемого значения. Для примера, использующего a switch
оператор для соответствия случаев перечисления, содержащих присваиваемые значения, посмотрите Присваиваемые значения.
Грамматика образца случая перечисления
перечислимый образец случая
→ «идентификатор типа выбирает».
«перечислимый образец кортежа имени случая выбирает»
Преобразование типа образцов
Существует два образца преобразования типа, is
образец и as
образец. Оба образца преобразования типа появляются только в switch
метки случая оператора. is
и as
образцы имеют следующую форму:
is type
pattern as type
is
если тип того значения во время выполнения совпадает с типом, указанным в правой стороне, образец соответствует значение is
образец — или подкласс того типа. is
образец ведет себя как is
оператор в этом они оба выполняют бросок типа, но отбрасывают возвращенный тип.
as
если тип того значения во время выполнения совпадает с типом, указанным в правой стороне, образец соответствует значение as
образец — или подкласс того типа. Если соответствие успешно выполняется, тип соответствующего значения брошен к образцу, указанному в левой стороне as
образец.
Для примера, использующего a switch
оператор для соответствия значений is
и as
образцы, посмотрите Преобразование типа для Любого и AnyObject.
Грамматика образца преобразования типа
образец преобразования типа → -образец - поскольку-образец -
-образец
→ is
введите -
Характер экспрессии
Характер экспрессии представляет значение выражения. Характер экспрессии появляется только в switch
метки случая оператора.
Выражение, представленное характером экспрессии, по сравнению со значением входного выражения, пользующегося библиотекой стандарта Swift ~=
оператор. Соответствия успешно выполняются если ~=
оператор возвращается true
. По умолчанию, ~=
оператор сравнивает два значения того же типа с помощью ==
оператор. Это может также соответствовать целочисленное значение диапазону целых чисел в Range
объект, поскольку следующий пример показывает:
let point = (1, 2)
switch point {
case (0, 0):
println("(0, 0) is at the origin.")
case (-2...2, -2...2):
println("(\(point.0), \(point.1)) is near the origin.")
default:
println("The point is at (\(point.0), \(point.1)).")
}
// prints "(1, 2) is near the origin."
Можно перегрузиться ~=
оператор для обеспечения пользовательского поведения при сравнении выражения. Например, можно переписать вышеупомянутый пример для сравнения point
выражение со строковые представления точек.
// Overload the ~= operator to match a string with an integer
func ~=(pattern: String, value: Int) -> Bool {
return pattern == "\(value)"
}
switch point {
case ("0", "0"):
println("(0, 0) is at the origin.")
default:
println("The point is at (\(point.0), \(point.1)).")
}
// prints "The point is at (1, 2)."
Грамматика характера экспрессии
характер экспрессии → выражение -