Конструкція switch дозволяє порівнювати значення з кількома можливими значеннями, які можуть збігтися.
Вона дає змогу писати лаконічніший код, ніж із кількома конструкціями else-if.
Конструкція switch починається з ключового слова switch, за яким іде значення для порівняння.
Далі варіанти описують за допомогою ключового слова case, за яким указують значення для порівняння.
Ключове слово default використовують, щоб задати типовий варіант, коли жоден з варіантів не збігається.
Як і конструкції else-if, конструкції switch виконують лише блок коду, повʼязаний із першим варіантом, що збігся.
switch value {
case 1:
print("One")
case 2:
print("Two")
default:
print("Other")
}
Розгляньмо такий приклад:
if str == "apple" {
print("Let's bake an apple crumble")
} else if str == "lemon" {
print("Let's bake a lemon meringue pie!")
} else if str == "peach" {
print("Let's bake a peach pie!")
} else {
print("Let's buy ice cream.")
}
Натомість це можна записати так:
switch str {
case "apple":
print("Let's bake an apple crumble")
case "lemon":
print("Let's bake a lemon meringue pie!")
case "peach":
print("Let's bake a peach pie!")
default:
print("Let's buy ice cream.")
}
while
Цикл while - це інструкція керування потоком, яка дозволяє виконувати код, поки певна умова істинна.
Swift надає два різновиди циклів while: цикл while і цикл repeat-while.
Умова циклу while перевіряється перед виконанням тіла циклу; якщо умова хибна, тіло циклу не виконається взагалі.
Цикли while у Swift мають таку структуру:
while <#condition#> {
<#code#>
}
Тут цикл виконуватиметься, доки count більше за 0, і надрукує числа 2, 1 та «Liftoff!».
var count = 2
while count > 0 {
print("\(count)…")
count -= 1
}
print("Liftoff!")
// prints:
// 2…
// 1…
// Liftoff!
Цикл repeat-while схожий на цикл while, але умова перевіряється після виконання тіла циклу.
Це означає, що тіло циклу виконується принаймні один раз, навіть якщо умова хибна.
Цикли repeat-while у Swift мають таку структуру:
repeat {
<#code#>
} while <#condition#>
Тут цикл виконається лише один раз, оскільки умова хибна.
Оскільки це цикл repeat-while, тіло циклу виконається один раз, перш ніж перевірять умову.
var count = 2
repeat {
print("\(count)…")
} while count < 0
print("Liftoff!")
У Swift є набір інструкцій, які змінюють звичний потік керування циклами.
Їх називають інструкціями передачі керування.
Ми вже бачили return; у цьому концепті ми познайомимося з іншими, серед яких continue, break і мітки.
У цьому концепті ми не розглядаємо fallthrough, але про нього можна прочитати в книзі про Swift.
Іноді потрібно достроково перейти до наступної ітерації циклу, не виконавши решту інструкцій поточної ітерації.
Для цього використовують ключове слово continue.
Коли виконується continue, цикл переходить до наступної перевірки, щоб визначити, чи можна виконати наступну ітерацію: тобто до умови while в циклах while і repeat-while або до перевірки, чи є в послідовності ще один елемент, у циклах for-in.
count = 1
while count < 6 {
count += 1
if count == 4 { continue }
print(count)
}
// prints:
// 2
// 3
// 5
Break використовують, щоб достроково перервати цикл.
Коли виконується break, цикл негайно завершується, і програма продовжує з першої інструкції після циклу.
for fruit in ["banana", "grapes", "apple", "strawberry", "kiwi", "lemon"] {
if !fruit.count.isMultiple(of: 2) { break }
print(fruit)
}
// prints:
// banana
// grapes
Коли цикли вкладені, іноді потрібно використати break або continue, щоб вийти із зовнішніх циклів, які містять цикл, де використано ці break або continue, чи перезапустити їх.
У таких випадках можна скористатися мітками, щоб указати цикл, з якого треба вийти або який треба перезапустити.
Цикл можна позначити міткою, поставивши імʼя та двокрапку перед while, repeat або for, які починають цикл.
Щоб побачити, як працюють мітки, розгляньмо такий цикл.
outerLoop: for fruit in ["banana", "grapes", "apple", "strawberry", "kiwi", "lemon"] {
print("\n--- \(fruit) ---")
for letter in fruit {
guard letter != "n" else { break outerLoop }
print(letter)
}
}
// prints:
// --- banana ---
// b
// a
Уявімо, що ми досвідчені міксологи, які готують смачні напої, щоб люди могли насолоджуватися ними під час вечірок. Але ми зрозуміли, що можемо полегшити собі життя, написавши трохи коду, який допоможе нам у роботі.
Різні напої потребують різного часу на приготування:
"beer", "soda" і "water" - по 0,5 хвилини."shot" - 1,0 хвилини, "mixed drink" - 1,5 хвилини."fancy drink" - 2,5 хвилини."frozen drink" - 3,0 хвилини.Реалізуйте функцію timeToPrepare(drinks:), яка приймає аргумент drinks - масив рядків тексту (англ. string), що представляє напої, які потрібно приготувати.
Функція повинна повернути загальний час, потрібний для приготування всіх напоїв у масиві.
timeToPrepare(drinks: ["beer", "frozen drink", "shot"])
// returns 4.5
Одна з перших речей, які потрібно зробити на початку зміни, - переконатися, що невеличка скринька з часточками лайма повна на всю майбутню зміну. Лайми бувають різних розмірів, і з них виходить різна кількість часточок: з лайма "small" виходить 6 часточок, з лайма "medium" - 8, а з лайма "large" - 10.
Поки нам ще потрібні часточки, а лайми ще не закінчилися, беремо перший лайм з масиву і віднімаємо відповідну кількість часточок від потрібної кількості. Продовжуємо, доки не отримаємо всі потрібні часточки або доки не закінчаться лайми.
Реалізуйте функцію makeWedges(needed:limes:), яка приймає аргументи needed (кількість часточок, які потрібно нарізати) і limes (масив рядків тексту з розмірами лаймів, які є в наявності для нарізання).
Функція повинна повернути кількість нарізаних лаймів.
makeWedges(needed: 25, limes: ["small", "small", "large", "medium", "small"])
// returns 4
Вітаємо! Довгий робочий день майже завершився, і скоро ми підемо додому працювати над своїм новим застосунком. Але в нас ще залишилася низка замовлень на напої, які треба приготувати, перш ніж передати замовлення наступній зміні й піти.
Поки в зміні ще залишається час, готуємо перше замовлення з масиву, а тоді видаляємо це замовлення з масиву.
Потім віднімаємо від часу, що залишився в зміні, час, витрачений на приготування цього замовлення, згідно з нашою функцією timeToPrepare(drinks:).
Реалізуйте функцію finishShift(minutesLeft:remainingOrders:), яка приймає кількість хвилин, що залишилися в зміні (гарантовано більша за 0), і непорожній масив замовлень напоїв.
Функція повинна повернути масив замовлень, до яких ми не встигли взятися до кінця зміни.
finishShift(minutesLeft: 5, remainingOrders: [["beer", "frozen drink", "shot"], ["fancy drink", "soda"], ["beer", "beer", "water"], ["mixed drink", "frozen drink"]])
// returns [["beer", "beer", "water"], ["mixed drink", "frozen drink"]]
Щоб beer і soda залишалися свіжими, потрібно відстежувати їхні замовлення разом із часом, коли ці замовлення зробили.
Реалізуйте функцію orderTracker(orders: [(drink: String, time: String)]) -> (beer: (first: String, last: String, total: Int)?, soda: (first: String, last: String, total: Int)?) яка, отримавши список замовлень і часів, повертає пару опціональних кортежів із часом першого й останнього замовлення beer і soda, а також загальною кількістю замовлень кожного з них, і nil, якщо замовлень цих напоїв не було. Інші напої відстежувати не потрібно.
Реалізуйте функцію orderTracker(orders:), яка приймає масив кортежів, де кожен кортеж містить замовлений напій і час, коли зробили замовлення.
Функція повинна повернути кортеж, що містить час першого й останнього замовлення beer, загальну кількість замовлень beer, час першого й останнього замовлення soda та загальну кількість замовлень soda.
Повернути його потрібно у вигляді кортежу такого формату: (beer: (first: String, last: String, total: Int)?, soda: (first: String, last: String, total: Int)?).
let orders = [
(drink: "beer", time: "10:01"), (drink: "frozen drink", time: "10:02"),
(drink: "shot", time: "10:05"), (drink: "fancy drink", time: "10:06"),
(drink: "soda", time: "10:09"), (drink: "beer", time: "10:15"), (drink: "beer", time: "10:22"),
(drink: "water", time: "10:26"), (drink: "mixed drink", time: "10:28"),
(drink: "frozen drink", time: "10:33"),
]
orderTracker(orders: orders)
// returns (beer: (first "10:01", last "10:22", total 3), soda: (first "10:09", last "10:09", total 1))
Зареєструйтеся на Exercism, щоб вивчати й опановувати Swift, а також 35 концепцій116 вправ та справжнє наставництво від людей, і все це безкоштовно.