Swift Language
Кортеж
Поиск…
Вступление
Тип кортежа представляет собой список типов, разделенных запятыми, заключенных в круглые скобки.
Этот список типов также может иметь имя элементов и использовать эти имена для обозначения значений отдельных элементов.
Имя элемента состоит из идентификатора, за которым сразу следует двоеточие (:).
Общего пользования -
Мы можем использовать тип кортежа в качестве возвращаемого типа функции, чтобы функция возвращала один кортеж, содержащий несколько значений
замечания
Кортежи считаются типами значений. Более подробную информацию о кортежах можно найти в документации: developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html
Что такое кортежи?
Кортежи группируют несколько значений в одно составное значение. Значения внутри кортежа могут быть любого типа и не должны быть одного типа друг с другом.
Кортежи создаются путем группировки любых значений:
let tuple = ("one", 2, "three")
// Values are read using index numbers starting at zero
print(tuple.0) // one
print(tuple.1) // 2
print(tuple.2) // three
Также можно указать индивидуальные значения, когда определяется кортеж:
let namedTuple = (first: 1, middle: "dos", last: 3)
// Values can be read with the named property
print(namedTuple.first) // 1
print(namedTuple.middle) // dos
// And still with the index number
print(namedTuple.2) // 3
Их также можно назвать при использовании в качестве переменной и даже иметь возможность иметь необязательные значения внутри:
var numbers: (optionalFirst: Int?, middle: String, last: Int)?
//Later On
numbers = (nil, "dos", 3)
print(numbers.optionalFirst)// nil
print(numbers.middle)//"dos"
print(numbers.last)//3
Разложение на отдельные переменные
Кортежи можно разложить на отдельные переменные со следующим синтаксисом:
let myTuple = (name: "Some Name", age: 26)
let (first, second) = myTuple
print(first) // "Some Name"
print(second) // 26
Этот синтаксис можно использовать независимо от того, имеет ли кортеж неназванные свойства:
let unnamedTuple = ("uno", "dos")
let (one, two) = unnamedTuple
print(one) // "uno"
print(two) // "dos"
Специфические свойства можно игнорировать с помощью подчеркивания ( _
):
let longTuple = ("ichi", "ni", "san")
let (_, _, third) = longTuple
print(third) // "san"
Кортежи как возвращаемое значение функций
Функции могут возвращать кортежи:
func tupleReturner() -> (Int, String) {
return (3, "Hello")
}
let myTuple = tupleReturner()
print(myTuple.0) // 3
print(myTuple.1) // "Hello"
Если вы назначаете имена параметров, их можно использовать из возвращаемого значения:
func tupleReturner() -> (anInteger: Int, aString: String) {
return (3, "Hello")
}
let myTuple = tupleReturner()
print(myTuple.anInteger) // 3
print(myTuple.aString) // "Hello"
Использование typealias для обозначения типа вашего кортежа
Иногда вы можете использовать один и тот же тип кортежа в нескольких местах всего кода. Это может быстро запутаться, особенно если ваш кортеж сложный:
// Define a circle tuple by its center point and radius
let unitCircle: (center: (x: CGFloat, y: CGFloat), radius: CGFloat) = ((0.0, 0.0), 1.0)
func doubleRadius(ofCircle circle: (center: (x: CGFloat, y: CGFloat), radius: CGFloat)) -> (center: (x: CGFloat, y: CGFloat), radius: CGFloat) {
return (circle.center, circle.radius * 2.0)
}
Если вы используете определенный тип кортежа в нескольких местах, вы можете использовать ключевое слово typealias
чтобы назвать тип вашего кортежа.
// Define a circle tuple by its center point and radius
typealias Circle = (center: (x: CGFloat, y: CGFloat), radius: CGFloat)
let unitCircle: Circle = ((0.0, 0.0), 1)
func doubleRadius(ofCircle circle: Circle) -> Circle {
// Aliased tuples also have access to value labels in the original tuple type.
return (circle.center, circle.radius * 2.0)
}
Однако, если вы слишком часто это делаете, вам следует рассмотреть возможность использования struct
.
Обмен значениями
Кортежи полезны для обмена значениями между 2 (или более) переменными без использования временных переменных.
Пример с 2 переменными
Учитывая 2 переменные
var a = "Marty McFly"
var b = "Emmett Brown"
мы можем легко менять значения
(a, b) = (b, a)
Результат:
print(a) // "Emmett Brown"
print(b) // "Marty McFly"
Пример с 4 переменными
var a = 0
var b = 1
var c = 2
var d = 3
(a, b, c, d) = (d, c, b, a)
print(a, b, c, d) // 3, 2, 1, 0
Кортежи как случай в коммутаторе
Использовать кортежи в переключателе
let switchTuple = (firstCase: true, secondCase: false)
switch switchTuple {
case (true, false):
// do something
case (true, true):
// do something
case (false, true):
// do something
case (false, false):
// do something
}
Или в сочетании с Enum Например, с классами размера:
let switchTuple = (UIUserInterfaceSizeClass.Compact, UIUserInterfaceSizeClass.Regular)
switch switchTuple {
case (.Regular, .Compact):
//statement
case (.Regular, .Regular):
//statement
case (.Compact, .Regular):
//statement
case (.Compact, .Compact):
//statement
}