Кортежі обʼєднують кілька значень в одне складене значення. На відміну від масивів, значення в кортежі не обовʼязково мають бути одного типу, а розмір кортежу є фіксованим після створення.
Щоб створити кортеж, ми беремо значення в дужки, розділені комами:
let order = ("biscuits", 2.99, 3)
Ми також можемо явно вказати анотації типів:
let order: (String, Double, Int) = ("biscuits", 2.99, 3)
Щоб видобути окремі елементи з неіменованого кортежу, ми можемо використати синтаксис індексів з відліком від нуля (.0, .1 тощо):
let item = order.0 // "biscuits"
let quantity = order.2 // 3
Ми можемо дати імена окремим елементам кортежу, коли визначаємо кортеж:
let order = (item: "biscuits", price: 2.99, quantity: 3)
Іменування елементів робить код більш читабельним і дозволяє нам отримувати доступ до елементів за допомогою точкової нотації з їхніми мітками:
let item = order.item // "biscuits"
let quantity = order.quantity // 3
Ми також можемо включити назви елементів в анотацію типу:
let order: (item: String, price: Double, quantity: Int) = (item: "biscuits", price: 2.99, quantity: 3)
Якщо кортеж оголошено як змінну (var), ми можемо оновити його елементи:
var order = ("biscuits", 2.99, 3)
order.0 = "cookies"
order.1 = 1.99
order.2 = 5
print(order)
// Prints ("cookies", 1.99, 5)
Хоча функції в Swift можуть повертати лише одне значення, повернення кортежу дозволяє спакувати кілька значень і повернути кілька значень з функції:
func divide(_ dividend: Int, by divisor: Int) -> (quotient: Int, remainder: Int) {
let quotient = dividend / divisor
let remainder = dividend % divisor
return (quotient, remainder)
}
let result = divide(14, by: 4)
print("Quotient: \(result.quotient), Remainder: \(result.remainder)")
// Prints "Quotient: 3, Remainder: 2"
Ми можемо розкласти (розпакувати) значення кортежу на окремі константи або змінні:
let order = ("biscuits", 2.99, 3)
let (item, price, quantity) = order
print(item) // Prints "biscuits"
Декомпозиція кортежів також працює безпосередньо в циклах for-in:
let orders = [("biscuits", 2.99, 3), ("cookies", 1.99, 5)]
for (item, price, quantity) in orders {
print("Item: \(item), Price: \(price), Quantity: \(quantity)")
}
Ми працюємо ельфом у відділі логістики Санта-Клауса, і начальник дав нам пару завдань для оновлення програмного забезпечення системи.
Система повинна мати змогу отримати назву іграшки з бази даних.
База даних складається з кортежів типу (name: String, quantity: Int).
Реалізуйте функцію getName(_:), яка приймає аргумент, що містить кортеж типу (name: String, quantity: Int).
let toy = (name: "Doll", quantity: 10)
getName(toy)
// Returns "Doll"
Ринок іграшок дуже динамічний: популярні іграшки змінюються дуже швидко. Тому потрібна функція, яка створює нову іграшку.
Реалізуйте функцію createToy(name:amount:), яка приймає аргументи name, що містить назву іграшки, та amount, що містить кількість іграшки.
createToy(name: "Doll", amount: 10)
// Returns (name: "Doll", amount: 10)
Ельфи в майстерні Санти постійно виготовляють нові іграшки, і Санті потрібно відстежувати кількість кожної іграшки. Щоб це робити, система повинна мати змогу оновлювати кількість іграшки в базі даних.
Реалізуйте функцію updateQuantity(_:toy:Amount:), яка приймає такі аргументи:
toys, що містить масив кортежів типу (name: String, quantity: Int).toy, що містить назву іграшки, яку потрібно оновити.amount, що містить нову кількість іграшки.Можна припустити, що іграшка вже є в базі даних, і це не потрібно перевіряти.
let toys = [(name: "Doll", quantity: 10), (name: "Car", quantity: 5), (name: "Train", quantity: 3)]
updateQuantity(toys, toy: "Doll", amount: 15)
// Returns [(name: "Doll", quantity: 15), (name: "Car", quantity: 5), (name: "Train", quantity: 3)]
Санта хоче мати змогу розподіляти іграшки за категоріями в базі даних. Це потрібно, щоб можна було легко знайти іграшки, коли треба зробити доставку, і щоб можна було сортувати іграшки в базі даних.
Однак, коли систему вперше реалізували, ключ категорії забули. Тепер система повинна мати змогу додати ключ категорії до іграшки в базі даних.
Реалізуйте функцію addCategory(_:category:), яка приймає такі аргументи:
toys, що містить масив кортежів типу (name: String, quantity: Int).category, що містить ключ категорії, який потрібно додати до іграшок.Можна припустити, що іграшка вже є в базі даних, і це не потрібно перевіряти. Також можна припустити, що іграшка ще не має ключа категорії.
let toys = [(name: "Car", quantity: 5), (name: "Train", quantity: 3)]
addCategory(toys, category: "Vehicle")
// Returns [(name: "Car", quantity: 5, category: "Vehicle"), (name: "Train", quantity: 3, category: "Vehicle")]
Зареєструйтеся на Exercism, щоб вивчати й опановувати Swift, а також 35 концепцій116 вправ та справжнє наставництво від людей, і все це безкоштовно.