Kurzusok
/
Swift
Swift
/
Feladatok
/
Szakértő mixológus
Szakértő mixológus

Szakértő mixológus

Tanulófeladat

Bevezetés

Switch

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

While-ciklusok

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

Vezérlésátadás

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.

Continue

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

Break

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

Címkék

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

Utasítások

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.

1. Határozd meg, mennyi ideig tart egy rendelés elkészítése

A különböző italok elkészítése eltérő ideig tart:

  • A "beer", a "soda" és a "water" egyenként 0,5 percet vesz igénybe.
  • A "shot" 1,0 percet, a "mixed drink" 1,5 percet,
  • A "fancy drink" 2,5 percet,
  • A "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

2. Töltsd fel a limecikk-készletedet

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

3. Fejezd be a műszakod

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"]]

4. Kövess nyomon bizonyos rendeléseket

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))
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Swift Exercism

Készen állsz elkezdeni a(z) Szakértő mixológus feladatot?

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.