Поиск…


Вступление

Тип кортежа представляет собой список типов, разделенных запятыми, заключенных в круглые скобки.

Этот список типов также может иметь имя элементов и использовать эти имена для обозначения значений отдельных элементов.

Имя элемента состоит из идентификатора, за которым сразу следует двоеточие (:).

Общего пользования -

Мы можем использовать тип кортежа в качестве возвращаемого типа функции, чтобы функция возвращала один кортеж, содержащий несколько значений

замечания

Кортежи считаются типами значений. Более подробную информацию о кортежах можно найти в документации: 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
    }


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow