A switch utasítás lehetővé teszi, hogy egy értéket több lehetséges egyező értékkel hasonlíts össze.
Segítségével tömörebb kódot írhatsz, mint több else-if utasítás használatával.
A switch utasítás a switch kulcsszóval kezdődik, amelyet az összehasonlítandó érték követ.
Ezután az eseteket a case kulcsszóval definiálhatod, amelyet az az érték követ, amellyel össze szeretnéd hasonlítani.
A default kulcsszóval adhatod meg az alapértelmezett esetet, amikor egyik eset sem egyezik.
Az else-if utasításokhoz hasonlóan a switch utasítások is csak az első egyező esethez tartozó kódblokkot hajtják végre.
switch value {
case 1:
print("One")
case 2:
print("Two")
default:
print("Other")
}
Nézzük a következő példát:
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.")
}
Ehelyett így is írható:
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.")
}
A while-ciklus egy vezérlési utasítás, amely lehetővé teszi, hogy a kód addig fusson, amíg egy adott feltétel igaz. A Swift kétféle while-ciklust kínál: a while és a repeat-while ciklust. A while-ciklus feltételét a ciklusmag végrehajtása előtt értékeli ki; ha a feltétel hamis, a ciklusmag egyáltalán nem fut le. A while-ciklusok felépítése Swiftben a következő:
while <#condition#> {
<#code#>
}
Itt a ciklus addig fut, amíg a count nagyobb, mint 0, és ennek eredményeként kiírja a 2-es és 1-es számot, valamint a „Liftoff!” szöveget.
var count = 2
while count > 0 {
print("\(count)…")
count -= 1
}
print("Liftoff!")
// prints:
// 2…
// 1…
// Liftoff!
A repeat-while ciklus hasonló a while-ciklushoz, de a feltétel a ciklusmag végrehajtása után értékelődik ki. Ez azt jelenti, hogy a ciklusmag mindig legalább egyszer lefut, még akkor is, ha a feltétel hamis. A repeat-while ciklusok felépítése Swiftben a következő:
repeat {
<#code#>
} while <#condition#>
Itt a ciklus csak egyszer fut le, mivel a feltétel hamis. Mivel repeat-while ciklusról van szó, a ciklusmag egyszer lefut, mielőtt a feltétel kiértékelődik.
var count = 2
repeat {
print("\(count)…")
} while count < 0
print("Liftoff!")
A Swift rendelkezik olyan utasításokkal, amelyekkel megváltoztatható a ciklusok normál vezérlési folyama.
Ezeket vezérlésátadó utasításoknak nevezzük.
A return-t már láttad; ez a fogalom további vezérlésátadó utasításokat mutat be, köztük a continue-t, a break-et és a címkéket.
A fallthrough-ról ebben a fogalomban nem lesz szó, de a Swift könyvben olvashatsz róla.
Néha szükség van arra, hogy egy ciklusban idő előtt a következő iterációra ugorjunk, anélkül hogy befejeznénk a ciklus aktuális iterációjának többi utasítását.
Erre a continue kulcsszó használható.
Amikor a continue végrehajtódik, a ciklus a következő ellenőrzéshez ugrik, hogy lássa, lefuttatható-e a ciklus következő iterációja, azaz a while a while és repeat-while ciklusokban, vagy annak ellenőrzése, hogy van-e még elem a sorozatban a for-in ciklusokban.
count = 1
while count < 6 {
count += 1
if count == 4 { continue }
print(count)
}
// prints:
// 2
// 3
// 5
A break arra szolgál, hogy idő előtt kilépjünk egy ciklusból.
Amikor a break végrehajtódik, a ciklus azonnal kilép, és a program a ciklus utáni első utasítással folytatódik.
for fruit in ["banana", "grapes", "apple", "strawberry", "kiwi", "lemon"] {
if !fruit.count.isMultiple(of: 2) { break }
print(fruit)
}
// prints:
// banana
// grapes
Amikor a ciklusok egymásba vannak ágyazva, előfordul, hogy a break vagy a continue segítségével a külső ciklusokból szeretnénk kilépni vagy azokat újraindítani, amelyek tartalmazzák azt a ciklust, amelyben a break vagy a continue szerepel.
Az ilyen esetekben címkékkel adhatod meg, hogy melyik ciklusból lépj ki vagy melyiket indítsd újra.
Egy ciklus címkézhető úgy, hogy a ciklust indító while, repeat vagy for elé egy nevet és egy kettőspontot írsz.
Hogy lásd, milyen hatása van a címkék ilyen használatának, nézd meg a következő ciklust.
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
Profi mixológus vagy: finom italokat készítesz, hogy az emberek jól érezzék magukat, amikor elmennek szórakozni. De rájöttél, hogy megkönnyítheted az életed, ha írsz egy kis kódot, ami segít a munkádban.
A különböző italok elkészítése eltérő ideig tart:
"beer", a "soda" és a "water" egyenként 0,5 percet vesz igénybe."shot" 1,0 percet, a "mixed drink" 1,5 percet,"fancy drink" 2,5 percet,"frozen drink" 3,0 percet vesz igénybe.Valósítsd meg a timeToPrepare(drinks:) függvényt, amely a drinks argumentumot kapja, ami egy stringekből álló tömb, és azokat az italokat tartalmazza, amelyeket el kell készíteni.
A függvény adja vissza a tömbben lévő összes ital elkészítéséhez szükséges teljes időt.
timeToPrepare(drinks: ["beer", "frozen drink", "shot"])
// returns 4.5
Amikor elkezded a műszakot, az egyik első teendőd, hogy gondoskodj róla: a limecikkekkel teli kis tartályod tele legyen a következő műszakra. A lime-ok különböző méretűek, és különböző mennyiségű cikket adnak: egy "small" lime-ból 6 cikket, egy "medium" lime-ból 8 cikket, egy "large" lime-ból pedig 10 cikket kapsz.
Amíg még szükséged van cikkekre, és van még felvágásra váró lime, vedd ki az első lime-ot a tömbből, és vond le a szükséges mennyiségből a megfelelő számú cikket. Addig folytasd, amíg már nem kell több cikk, vagy el nem fogynak a lime-ok.
Valósítsd meg a makeWedges(needed:limes:) függvényt, amely a needed argumentumot kapja, ami a felvágandó cikkek számát tartalmazza, valamint a limes argumentumot, ami egy stringekből álló tömb, és a felvágásra rendelkezésre álló lime-ok méreteit tartalmazza.
A függvény adja vissza, hány lime-ot vágtál fel.
makeWedges(needed: 25, limes: ["small", "small", "large", "medium", "small"])
// returns 4
Gratulálok! A hosszú munkanapod lassan véget ér, és hamarosan hazamész, hogy az új alkalmazásodon dolgozz. De még egy sor italrendelést el kell készítened, mielőtt átadhatod a rendeléseket a következő műszaknak, és elmehetsz.
Amíg még van idő a műszakodból, készítsd el a tömb első rendelését, majd töröld azt a rendelést a tömbből.
Ezután vond le a műszakból hátralévő időből az adott rendelés elkészítéséhez szükséges időt, a timeToPrepare(drinks:) függvényed szerint.
Valósítsd meg a finishShift(minutesLeft:remainingOrders:) függvényt, amely megkapja a műszakból hátralévő percek számát (amiről garantált, hogy nagyobb 0-nál), valamint egy nem üres, italrendeléseket tartalmazó tömböt.
A függvény adja vissza azoknak a rendeléseknek a tömbjét, amelyeket a műszak végéig már nem tudtál elkészíteni.
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"]]
Ahhoz, hogy a sör és a szóda friss maradjon, nyomon kell követned a rendeléseiket, valamint azoknak a rendeléseknek a leadási időpontját.
Valósítsd meg a orderTracker(orders: [(drink: String, time: String)]) -> (beer: (first: String, last: String, total: Int)?, soda: (first: String, last: String, total: Int)?) függvényt, amely egy rendelésekből és időpontokból álló lista alapján visszaad egy opcionális tuple-ökből álló párt, benne a sör és a szóda első és utolsó rendelésének időpontjával, valamint az egyes italokból leadott rendelések teljes számával, illetve nil-t, ha ezekből az italokból nem érkezett rendelés. Más italokat nem kell nyomon követned.
Valósítsd meg a orderTracker(orders:) függvényt, amely egy tuple-ökből álló tömböt kap, ahol minden tuple a rendelt italt és a rendelés leadásának időpontját tartalmazza.
A függvény adjon vissza egy tuple-t, amely tartalmazza az első és utolsó sörrendelés idejét, a sörrendelések teljes számát, az első és utolsó szódarendelés idejét és a szódarendelések teljes számát.
Az eredményt a következő formátumú tuple-ként kell visszaadni: (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))
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Swift nyelvet 35 fogalom116 feladat segítségével, valódi emberi mentorálással, mindez ingyen.