Треки
/
Swift
Swift
/
Вправи
/
Спритний помічник Санти
Спритний помічник Санти

Спритний помічник Санти

Навчальна вправа

Вступ

Кортежі обʼєднують кілька значень в одне складене значення. На відміну від масивів, значення в кортежі не обовʼязково мають бути одного типу, а розмір кортежу є фіксованим після створення.

Щоб створити кортеж, ми беремо значення в дужки, розділені комами:

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)")
}

Вказівки

Ми працюємо ельфом у відділі логістики Санта-Клауса, і начальник дав нам пару завдань для оновлення програмного забезпечення системи.

1. Отримати назву іграшки

Система повинна мати змогу отримати назву іграшки з бази даних. База даних складається з кортежів типу (name: String, quantity: Int).

Реалізуйте функцію getName(_:), яка приймає аргумент, що містить кортеж типу (name: String, quantity: Int).

let toy = (name: "Doll", quantity: 10)
getName(toy)
// Returns "Doll"

2. Додати нову іграшку до бази даних

Ринок іграшок дуже динамічний: популярні іграшки змінюються дуже швидко. Тому потрібна функція, яка створює нову іграшку.

Реалізуйте функцію createToy(name:amount:), яка приймає аргументи name, що містить назву іграшки, та amount, що містить кількість іграшки.

createToy(name: "Doll", amount: 10)
// Returns (name: "Doll", amount: 10)

3. Оновити кількість іграшки

Ельфи в майстерні Санти постійно виготовляють нові іграшки, і Санті потрібно відстежувати кількість кожної іграшки. Щоб це робити, система повинна мати змогу оновлювати кількість іграшки в базі даних.

Реалізуйте функцію 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)]

4. Додати ключ категорії до іграшки

Санта хоче мати змогу розподіляти іграшки за категоріями в базі даних. Це потрібно, щоб можна було легко знайти іграшки, коли треба зробити доставку, і щоб можна було сортувати іграшки в базі даних.

Однак, коли систему вперше реалізували, ключ категорії забули. Тепер система повинна мати змогу додати ключ категорії до іграшки в базі даних.

Реалізуйте функцію 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")]
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Swift Exercism

Час розпочати Спритний помічник Санти?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Swift, а також 35 концепцій116 вправ та справжнє наставництво від людей, і все це безкоштовно.