Διαδρομές
/
Swift
Swift
/
Ασκήσεις
/
Μυστικός πράκτορας Double-Null0111
Μυστικός πράκτορας Double-Null0111

Μυστικός πράκτορας Double-Null0111

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

Εισαγωγή

Τύποι συναρτήσεων

Αν αφαιρέσεις όλα τα ονόματα και τις ετικέτες από την υπογραφή μιας συνάρτησης Swift, αυτό που μένει είναι ο τύπος της συνάρτησης.

func shoppingList(item: String, quantity: Int) -> String {
  "You need to buy \(quantity) \(item)."
}
// shoppingList: (String, Int) -> String

func repeater(_ phrase: String, times: Int) -> String {
  var result = ""
  for _ in 1...times {
    result += phrase
  }
  return result
}
// repeater: (String, Int) -> String

func printString(line: String) {
  print(line)
}
// printString: (String) -> ()

Πρόσεξε ότι οι τύποι των δύο πρώτων συναρτήσεων είναι ίδιοι, (String, Int) -> String, παρόλο που οι δύο υπογραφές είναι διαφορετικές και οι δύο συναρτήσεις λειτουργούν πολύ διαφορετικά. Και οι δύο παίρνουν ως είσοδο μια String και ένα Int και επιστρέφουν μια String. Και, όπως φαίνεται από τον τύπο της τρίτης συνάρτησης, παρόλο που το σώμα της συνάρτησης δεν φαίνεται να επιστρέφει τίποτα, στην πραγματικότητα επιστρέφει σιωπηρά (), τη μοναδική τιμή του τύπου Void.

Αυτοί οι τύποι συναρτήσεων μπορούν να χρησιμοποιηθούν με τον ίδιο τρόπο όπως οποιοσδήποτε άλλος τύπος στη Swift, για παράδειγμα, μπορούν να χρησιμοποιηθούν στη δήλωση μεταβλητών ή σταθερών. Και επειδή οι συναρτήσεις είναι τιμές στη Swift, συναρτήσεις που υπάρχουν ήδη μπορούν να ανατεθούν σε αυτές τις σταθερές/μεταβλητές:

var stringAndIntToString: (String, Int) -> String

stringAndIntToString = shoppingList
stringAndIntToString("carrots", 3)
// => "You need to buy 3 carrots."

Όπως συμβαίνει με τις άλλες μεταβλητές/σταθερές, η τιμή που αναθέτεις σε αυτήν πρέπει να είναι του σωστού τύπου:

stringAndIntToString = printShoppingList
// Error: Cannot assign value of type '(String) -> ()' to type '(String, Int) -> String'

Τύποι συναρτήσεων ως τύποι παραμέτρων

Εφόσον οι τύποι συναρτήσεων μπορούν να χρησιμοποιηθούν όπου μπορεί να χρησιμοποιηθεί οποιοσδήποτε άλλος τύπος, έπεται ότι μπορούν να χρησιμοποιηθούν ως τύποι παραμέτρων, να περαστούν σε άλλες συναρτήσεις και να κληθούν μέσα από αυτές.

func apply3(to str: String, function f: (String, Int) -> String) -> String {
  f(str,3)
}
// apply3: ([String], (String, Int) -> String) -> [String]

apply3(to: "eggs", function: shoppingList)
// => "You need to buy 3 eggs."

apply3(to: "eggs", function: repeater)
// => "eggseggseggs"

Τύποι συναρτήσεων ως τύποι επιστροφής

Παρομοίως, οι τύποι συναρτήσεων μπορούν να χρησιμοποιηθούν ως τύποι επιστροφής για συναρτήσεις. Με άλλα λόγια, μπορείς να γράψεις συναρτήσεις που δημιουργούν και επιστρέφουν άλλες συναρτήσεις. Όταν δημιουργείς αυτές τις συναρτήσεις, η συνάρτηση που επιστρέφεται μπορεί να χρησιμοποιήσει τις άλλες παραμέτρους που περνιούνται στη συνάρτηση ή τις τοπικές μεταβλητές που δημιουργούνται μέσα στη γονική συνάρτηση.

func makeAdder(base: Int) -> (Int) -> Int {
  func adder(_ i: Int) -> Int {
    base + i
  }
  return adder
}
// makeAdder: (Int) -> (Int) -> Int

let add10 = makeAdder(base: 10)
// add10: (Int) -> Int

let subtract20 = makeAdder(base: -20)
// subtract10: (Int) -> Int

add10(5)
// => 15

subtract20(5)
// => -15

Οδηγίες

Χαίρε, Πράκτορα Double-Null0111.

Η αποστολή σου, αν επιλέξεις να την αποδεχτείς, είναι να γράψεις ένα ζευγάρι εργαλείων που θα σε βοηθήσουν να διεισδύσεις στα κεντρικά της UMBRA (United Minions Being Really Awful) και να ανακτήσεις τα σχέδια για το τελευταίο πραγματικά φρικτό σχέδιό τους. Θα χρειαστείς δύο εργαλεία για να φέρεις εις πέρας αυτή την αποστολή.

1. Προστάτεψε τα μυστικά σχέδια που ανέκτησες με κωδικό πρόσβασης

Μόλις αποκτήσεις τα μυστικά σχέδια, θα πρέπει να τα προστατέψεις, ώστε μόνο όσοι γνωρίζουν τον κωδικό πρόσβασης να μπορούν να τα ανακτήσουν.

Για να το κάνεις αυτό, θα πρέπει να υλοποιήσεις τη συνάρτηση protectSecret(_ secret: String, withPassword password: String) -> (String) -> String. Αυτή η συνάρτηση θα επιστρέψει μια άλλη συνάρτηση που δέχεται ως είσοδο πιθανές συμβολοσειρές κωδικού πρόσβασης. Αν ο κωδικός πρόσβασης που εισάγεται είναι σωστός, η νέα συνάρτηση επιστρέφει το κρυμμένο μυστικό, αλλά αν ο κωδικός είναι λανθασμένος, η συνάρτηση επιστρέφει "Sorry. No hidden secrets here."

let secretFunction = protectSecret("Steal the world's supply of french fries!", withPassword: "5up3r53cr37")

secretFunction("Open sesame")
// Returns "Sorry. No hidden secrets here."

secretFunction("5up3r53cr37")
// Returns "Steal the world's supply of french fries!"

2. Δημιούργησε έναν συνδυασμό για να ανοίξεις το χρηματοκιβώτιό τους

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

Ωστόσο, η UMBRA αλλάζει τακτικά τη συνάρτηση που χρησιμοποιείται για τη δημιουργία των συνδυασμών, οπότε το εργαλείο σου θα πρέπει να δέχεται και τον αριθμό της αίθουσας και την κατάλληλη συνάρτηση για να δημιουργήσει τον συνδυασμό.

Υλοποίησε τη συνάρτηση generateCombination(forRoom room: Int, usingFunction f: (Int) -> Int) -> (Int, Int, Int) για να δημιουργήσεις τον συνδυασμό που θα χρειαστείς.

func makeCombo(_ x: Int) -> Int {
  (x * 13) % 256
}

generateCombination(forRoom: 227, usingFunction: makeCombo)
// Returns (135, 219, 31)
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Swift Exercism

Έτοιμος να ξεκινήσεις την άσκηση Μυστικός πράκτορας Double-Null0111;

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