Кортежи (tuple) в Swift

Домашняя работа к главе 6

Возможно, вы никогда не встречались в программировании с таким понятием, как кортежи, тем не менее, это одно из очень полезных функциональных средств, доступных в Swift. Кортежи, к примеру, могут использоваться для работы с координатами. Согласитесь, куда удобнее орудовать конструкцией (x, y, z), записанной в одну переменную, чем создавать по отдельной переменной для каждой оси координат.

Кортежи (Tuples) — очень важный и порой просто незаменимый элемент Swift, которого очень не хватает в некоторых других языках. Уделите должное внимание его изучению и тренировке работы с ним.

Задание 1

Какие из приведенных переменных являются кортежем?

var tupleOne = (200)
var tupleTwo = (200, 201)
var tupleThree: (Int, Int) = (1, 100)
Правильный ответ

  • tupleOne — переменная типа Int
  • tupleTwo и tupleThree — кортежи, они группируют несколько значений в одно

Задание 2

Определите тип данных для каждого кортежа.

var tupleOne = (1, 2, 3.14)
var tupleTwo = (5, 16.0, 4.11)
var tupleThree = (9, "Age")
var tupleFour = (tupleThree.1, "9")
var tupleFive = ("Century", 21)
Правильный ответ

  • tupleOne — тип (Int, Int, Double)
  • tupleTwo — тип (Int, Double, Double)
  • tupleThree — тип (Int, String)
  • tupleFour — тип (String, String)
  • tupleFive — тип (String, Int)

Задание 3

Какие из кортежей из задания 2 могут быть проинициализированы друг другу (т.е. значение одного присвоено другому)?

Правильный ответ

Никакие, т.к. у всех из них различный тип данных.

Задание 4

Что будет выведено на консоль?

var tupleAddress = ("Vologda", "Russia", "Earth")
tupleAddress.3 = "Mars"
var (city, country, planet) = tupleAddress
print(planet)
Правильный ответ

На консоль будет выведена ошибка, т.к. третий элемент кортежа имеет индекс 2, а в коде выше идет попытка обращения к несуществующему четвертому элементу с индексом 3.

Задание 5

Что будет выведено на консоль?

var tupleAboutMe = ("Mike", 37)
var (name, age) = tupleAboutMe
tupleAboutMe.0 = "Eridar"
print(name)
Правильный ответ

На консоль будет выведено Mike.

Значение в переменной не изменится при его изменении в кортеже, от куда оно было получено. Это связано с тем, что кортеж оперирует значимыми типами (value type), которые передаются не по ссылке, а непосредственно самим значением.

Задание 6

  1. Объявите константу и запишите в нее свое имя.
  2. Объявите переменную типа UInt8 и запишите в нее свой возраст.
  3. Объявите кортеж и явно определите его тип данных, как (name: String, age: Int).
  4. В первый элемент кортежа запишите значение константы с именем.
  5. Во второй элемент кортежа запишите значение из переменной с вашим возрастом.

Правильный ответ

let name = "Alex"
var age:UInt8 = 16
var tuple: (name: String, age: Int)
tuple.name = name
tuple.age = Int(age)


Доступ закрыт

Дополнительные 5 заданий доступны только подписчикам

Оформить доступ


9 Comments

  1. Андрей Доманов:

    Подскажите, задание 6, есть ли разница между моим выполнением и эталонным, как я понимаю в любом случае значения были записаны, хоть и на этапе создания кортежа:

    import Foundation

    let name = «Andrey»
    var age:UInt8 = 32

    var about:(name:String, age:Int) = (name, Int(age))

    В общем вопрос, есть ли разница и засчитывается подобное?

  2. Мishabux:

    В 11 задании вместо буферного кортежа сделал обмен в одну строку таким образом:
    (tuple, tuple2) = (tuple2, tuple)
    Код работает… Выходит можно создавать кортеж в кортеже?

  3. mr.lyubimov:

    Так же про 11ое задание:
    //мой кортеж
    var exp11 = (myMovi:»Show»,myCount:7)
    //пишем в константы
    let (a,b) = (exp11.0,exp11.1)
    //выводим в консоль
    print(«\(a) \(b)»)
    //задаем тип Man
    typealias Man = (String,Int)
    //задаем кортеж другого человека
    var exp11A: Man = (hisMovi:»HisShow»,hisNum:14)
    //обмен
    (exp11,exp11A) = (exp11A,exp11)
    /* после обмена именование параметров второго кортежа Exp11A удалилось, но значения
    но значения поменялись местами */

    это верно?

    • iliageine:

      mr.lyubimov:Нифига не правильно))) К сожалению я сделал как и Вы… и оборжался потом над собой, типа какой я прогер  классный, запомнил про смену переменных без буфера АХАХАХАХ В задании не просто так подсказка про буфер была, а так же штука в том чтобы элементы первого и второго картежа друг от друга минусовать. А в Вашем и моем случае мы минусуем не те данные что указаны в задании… Смешно и круто получилось! И точно запоминается такое!

  4. trismegistius:

    Вопрос либо к заданию, либо к формулировке в книге.
    «Кортеж — это объект, который группирует значения различных типов в пределах одного составного значения .».
    Но tupleTwo и tupleThree группируют один тип данных- Int. Пускай их и по два в каждом.
    То есть формулировка дб :
    » группируют несколько значений в одно, обычно группирует различные типы»

  5. bearlovessun:

    var tupl3: (String, Int) = (movie: «Unforgiven», number: 38)
    let (con1, con2) = tupl3
    print(con1, con2)

    typealias Man = (String, Int)
    var tupl4: Man = (movie: «Thing», number: 2)

    var tupl5 = tupl3
    tupl3 = tupl4; tupl4 = tupl5
    print(tupl3, tupl4)

    var tuple6 = (tupl3.number, tupl4.number, tupl3.number — tupl4.number)

    На последнюю строчку Xcode ругается: Value of tuple type ‘(String, Int)’ has no member ‘number’
    Не могу понять, почему…

Добавить комментарий