В Swift кортежи используются для создания упорядоченных списков значений. В этой статье мы обсудим, как можно использовать кортежи в программировании на Swift.
Что такое кортеж?
Кортеж (tuple) представляет собой упорядоченный, разделенный запятыми список значений, который обрамляется круглыми скобками.
let flight = ("LAX", 747) print("Мы летим на рейсе \(flight.0), номер \(flight.1)"
В приведенном выше примере мы видим кортеж. Вы можете видеть два значения, разделенные запятой, которые заключены в скобки. Тип данного кортежа (String, Int).
В нашем примере мы также использовали особый синтаксис для получения значений кортежа. Мы можем получить значения кортежа с использованием индексов 0, 1, и так далее.
Не путайте кортежи с массивами, словарями или множествами. Они не являются коллекциями, однако они так же объединяют значения.
Значения кортежа могут иметь разные типы, и вы можете изменять их значения при условии, что они объявлены как изменяемые с помощью переменной var.
После инициализации кортежа вы уже не сможете добавлять в него новые элементы. Порядок элементов кортежа также не может измениться.
Приведенные ниже кортже имеют разные типы:
("LAX", 747) // (String, Int) (747, "LAX") // (Int, String)
Несмотря на то, что оба кортежа содержат одинаковые значения с одинаковым типом, их типы различны, поскольку порядок значений различен.
Вы можете сравнивать кортежи друг с другом, если их типы одинаковы и если сами типы соответствуют протоколу Equatable. Другими словами, если вы можете сравнить значения, вы можете сравнить и сами кортежи:
let a = ("AMS", 737) let b = ("LAX", 737) a == b // false let c = ("AMS", "A330-800") c == b // Ошибка компиляции, посколько типы не совпадают
Получение значений кортежа
Вам не обязательно нужно ссылаться на значения кортежа по индексам. Вместо этого вы можете назначить отдельные имена для элементов кортежа.
let flight = (airport: "LAX", airplane: 747, heading: 270) print("Мы летим на самолете \(flight.airplane) по направлению к \(flight.airport) на высоте \(flight.heading)."
Мы используем синтаксис, например, flight.airport, чтобы получить одно из значений flight. Сам кортеж определяется тремя именами и тремя значениями, разделенными двоеточиями и запятыми. Этот синтаксис похож на доступ к свойствам объекта.
Что, если вы получили кортеж и хотите присвоить его отдельные значения различным переменным? Для этого вы можете разложить кортеж на отдельные элементы и присвоить их соответствующим константам или переменным.
let (airport, _, heading) = ("LAX", 747, 270) print(airport) // LAX
Вот что происходит в приведенном выше коде:
- У нас есть кортеж. Он не присваивается отдельной переменной или константе, но вместо этого его значения разлагаются на отдельные элементы и присваиваются отдельным константам.
- Мы назначем константе airport значение “LAX”.
- Подчеркивание _- это значение, которое мы игнорируем.
Предположим, что мы используем функцию, которая возвращает нам код состояния HTTP. Такой код обычно состоит из числа, например 404, и некоторого текста.
func getStatusCode() -> (Int, String) { return (404, "Not Found") } let (code, text) = getStatusCode() print("Возвращено значение \(code) и текст: '\(text)'")
Функция возвращает кортеж типа (Int, String), который содержит два значения.
Мы хотим получить доступ к отдельным значениям, поэтому мы деконструируем кортеж с помощью (code, text). Далее мы можем использовать отдельные константы code и text, чтобы вывести на консоль нужные нам значения.
Кортежи в программировании на Swift
Кортежи весьма полезны в разработке для iOS. Мы уже рассмотрели типичный вариант использования кортежов: возвращение более одного значения из функции. Что еще можно с ними сделать?
Вы можете рассматривать кортежи как крошечные классы, которые вы можете использовать без создания самого класса:
class Flight { var airport:String var airplane:Int } let flight = Flight(airport: "AMS", airplane: 330) print("Мы летим в \(flight.airport)...")
Приведенный выше код сначала определяет класс Flight, а затем инициализирует экземпляр данного класса. Мы можем сделать то же самое с кортежом с гораздо меньшим количеством кода:
let flight = (airport: "AMS", airplane: 330) print("Мы летим в \(flight.airport)...")
Также мы можем использовать псевдоним типа:
typealias Flight = (airport: String, airplane: Int) let flight: Flight = ("HND", 737) print("Мы летим в \(flight.airport)..."
Кортежи можно использовать для доступа к индексам и значениям элементов массива с помощью функции enumerated():
let drivers = ["Magnussen", "Raikkonen", "Hamilton", "Verstappen"] for (index, name) in drivers.enumerated() { print("\(name) индекс: \(index)") } // Magnussen индекс: 0 // Raikkonen индекс: 1 // Hamilton индекс: 2 // Verstappen индекс: 3