Διαδρομές
/
Swift
Swift
/
Ασκήσεις
/
Έμπειρος μιξολόγος
Έμπειρος μιξολόγος

Έμπειρος μιξολόγος

Άσκηση εκμάθησης

Εισαγωγή

switch

Μια εντολή 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

Οδηγίες

Είσαι ένας έμπειρος mixologist και φτιάχνεις νόστιμα ποτά για τον κόσμο να τα απολαμβάνει στις βραδινές του εξόδους. Σκέφτηκες όμως ότι θα μπορούσες να κάνεις τη ζωή σου πιο εύκολη γράφοντας λίγο κώδικα που θα σε βοηθάει στη δουλειά σου.

1. Υπολόγισε πόσο χρόνο χρειάζεται για να φτιάξεις μια παραγγελία

Τα διάφορα ποτά θέλουν διαφορετικό χρόνο για να ετοιμαστούν:

  • Τα "beer", "soda" και "water" θέλουν 0,5 λεπτά το καθένα.
  • Τα "shot" θέλουν 1,0 λεπτά, τα "mixed drink" θέλουν 1,5 λεπτά,
  • Τα "fancy drink" θέλουν 2,5 λεπτά,
  • Τα "frozen drink" θέλουν 3,0 λεπτά.

Υλοποίησε τη συνάρτηση timeToPrepare(drinks:), η οποία δέχεται το όρισμα drinks, έναν πίνακα από συμβολοσειρές που αντιπροσωπεύουν τα ποτά που πρέπει να ετοιμαστούν. Η συνάρτηση πρέπει να επιστρέφει τον συνολικό χρόνο που θα χρειαστεί για να ετοιμαστούν όλα τα ποτά του πίνακα.

timeToPrepare(drinks: ["beer", "frozen drink", "shot"])
// returns 4.5

2. Ανανέωσε το απόθεμά σου σε φέτες λάιμ

Ένα από τα πρώτα πράγματα που πρέπει να κάνεις όταν ξεκινάς τη βάρδιά σου είναι να σιγουρευτείς ότι το μικρό δοχείο σου με τις φέτες λάιμ είναι γεμάτο για τη βάρδια που έχεις μπροστά σου. Θα έχεις λάιμ διαφορετικών μεγεθών, που δίνουν διαφορετικό αριθμό φετών: από ένα λάιμ "small" παίρνεις 6 φέτες, από ένα λάιμ "medium" 8 φέτες και από ένα λάιμ "large" 10 φέτες.

Όσο χρειάζεσαι ακόμα φέτες και σου απομένουν λάιμ για κόψιμο, πάρε το πρώτο λάιμ από τον πίνακα και αφαίρεσε τον αντίστοιχο αριθμό φετών από όσες χρειάζεσαι. Συνέχισε μέχρι να μη χρειάζεσαι άλλες φέτες ή μέχρι να τελειώσουν τα λάιμ.

Υλοποίησε τη συνάρτηση makeWedges(needed:limes:), η οποία δέχεται τα ορίσματα needed, που περιέχει τον αριθμό των φετών που πρέπει να κόψεις, και limes, που περιέχει έναν πίνακα από συμβολοσειρές με τα μεγέθη των λάιμ που έχεις διαθέσιμα για κόψιμο. Η συνάρτηση πρέπει να επιστρέφει τον αριθμό των λάιμ που έκοψες.

makeWedges(needed: 25, limes: ["small", "small", "large", "medium", "small"])
// returns 4

3. Τελείωσε τη βάρδιά σου

Συγχαρητήρια! Η μεγάλη σου μέρα στη δουλειά φτάνει σχεδόν στο τέλος της και σε λίγο θα πας σπίτι για να δουλέψεις τη νέα σου εφαρμογή. Έχεις όμως ακόμα μια σειρά από παραγγελίες ποτών να ετοιμάσεις πριν παραδώσεις τις παραγγελίες στην επόμενη βάρδια και φύγεις.

Όσο σου απομένει χρόνος στη βάρδια σου, ετοίμασε την πρώτη παραγγελία του πίνακα και μετά αφαίρεσέ την από τον πίνακα. Έπειτα μπορείς να αφαιρέσεις τον χρόνο που χρειάστηκε για να ετοιμαστεί αυτή η παραγγελία, σύμφωνα με τη συνάρτηση 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"]]

4. Παρακολούθησε συγκεκριμένες παραγγελίες

Για να σιγουρευτείς ότι η μπύρα και η σόδα μένουν φρέσκες, πρέπει να παρακολουθείς τις παραγγελίες τους μαζί με τις ώρες που δόθηκαν αυτές οι παραγγελίες.

Υλοποίησε τη συνάρτηση orderTracker(orders: [(drink: String, time: String)]) -> (beer: (first: String, last: String, total: Int)?, soda: (first: String, last: String, total: Int)?) η οποία, όταν της δίνεται μια λίστα με παραγγελίες και ώρες, επιστρέφει ένα ζεύγος προαιρετικών πλειάδων που περιέχουν τις ώρες της πρώτης και της τελευταίας παραγγελίας μπύρας και σόδας, μαζί με τον συνολικό αριθμό παραγγελιών για την καθεμία, και nil αν δεν έγινε καμία παραγγελία από αυτά τα ποτά. Δεν χρειάζεται να παρακολουθείς κανένα άλλο ποτό.

Υλοποίησε τη συνάρτηση orderTracker(orders:), η οποία δέχεται έναν πίνακα από πλειάδες, όπου κάθε πλειάδα περιέχει το ποτό που παραγγέλθηκε και την ώρα που δόθηκε η παραγγελία. Η συνάρτηση πρέπει να επιστρέφει μια πλειάδα που περιέχει την ώρα της πρώτης και της τελευταίας παραγγελίας μπύρας, τον συνολικό αριθμό παραγγελιών μπύρας, την ώρα της πρώτης και της τελευταίας παραγγελίας σόδας και τον συνολικό αριθμό παραγγελιών σόδας. Πρέπει να επιστρέφεται ως πλειάδα με τη μορφή: (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))
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Swift Exercism

Έτοιμος να ξεκινήσεις την άσκηση Έμπειρος μιξολόγος;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Swift με 35 έννοιες116 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.