Kurzusok
/
Swift
Swift
/
Feladatok
/
Double-Null0111 titkosügynök
Double-Null0111 titkosügynök

Double-Null0111 titkosügynök

Tanulófeladat

Bevezetés

Függvénytípusok

Ha egy Swift-függvény szignatúrájából eltávolítjuk az összes nevet és címkét, a függvény típusa marad.

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) -> ()

Vegyük észre, hogy az első két függvény típusa ugyanaz, (String, Int) -> String, pedig a két szignatúra különbözik, és a két függvény nagyon eltérően működik. Mindkettő egy String és egy Int értéket kap bemenetként, és egy String értéket ad vissza. A harmadik függvény típusából pedig látszik, hogy habár a függvény törzse látszólag nem ad vissza semmit, valójában implicit módon ()-t ad vissza, ami a Void típus egyetlen értéke.

Ezek a függvénytípusok ugyanúgy használhatók, mint bármely más típus a Swiftben, például szerepelhetnek változók vagy konstansok deklarációjában. És mivel a függvények értékek a Swiftben, a már létező függvények hozzárendelhetők ezekhez a konstansokhoz/változókhoz:

var stringAndIntToString: (String, Int) -> String

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

Ahogy a többi változó/konstans esetében, a hozzárendelt értéknek a megfelelő típusúnak kell lennie:

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

Függvénytípusok paramétertípusként

Mivel a függvénytípusok bárhol használhatók, ahol más típusok is, ebből következik, hogy paramétertípusként is szerepelhetnek, átadhatók más függvényeknek, és azokból a függvényekből meg is hívhatók.

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"

Függvénytípusok visszatérési típusként

Hasonlóképpen, a függvénytípusok visszatérési típusként is használhatók függvényekhez. Más szóval írhatunk olyan függvényeket, amelyek más függvényeket hoznak létre és adnak vissza. Amikor ezeket a függvényeket létrehozzuk, a visszaadott függvény felhasználhatja a függvénynek átadott többi paramétert vagy a szülőfüggvényben létrehozott helyi változókat.

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

Utasítások

Üdv, Double-Null0111 ügynök.

A küldetésed, ha úgy döntesz, hogy elfogadod, hogy írj két eszközt, amelyek segítenek behatolni az UMBRA (United Minions Being Really Awful) főhadiszállására, és megszerezni a legújabb, igazán szörnyű tervük terveit. Két eszközre lesz szükséged, hogy végrehajtsd ezt a küldetést.

1. Védd meg a megszerzett titkos terveket egy jelszóval

Miután megszerezted a titkos terveket, gondoskodnod kell róla, hogy csak azok férhessenek hozzájuk, akik ismerik a jelszót.

Ehhez implementálnod kell a protectSecret(_ secret: String, withPassword password: String) -> (String) -> String függvényt. Ez a függvény egy másik függvényt ad vissza, amely lehetséges jelszavakat kap bemenetként. Ha a megadott jelszó helyes, az új függvény visszaadja az elrejtett titkot, ha viszont a jelszó hibás, a függvény a „Sorry. No hidden secrets here.” értéket adja vissza.

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. Állíts elő egy kombinációt a széfjük kinyitásához

Megtudtuk, hogy az UMBRA az összes széf-kombinációját annak a helyiségnek a száma alapján készíti, amelyben a széf található. A széf kombinációit úgy állítják elő, hogy egy speciális függvényt ismételten alkalmaznak a helyiség számára. A kombináció első száma tehát úgy jön létre, hogy a függvényt a helyiség számára alkalmazzuk, a második úgy, hogy a függvényt az első számra alkalmazzuk, a harmadik pedig úgy, hogy a függvényt a második számra alkalmazzuk.

Az UMBRA azonban rendszeresen megváltoztatja a kombinációk előállításához használt függvényt, ezért az eszközödnek a helyiség számát és a megfelelő függvényt is meg kell kapnia ahhoz, hogy előállítsa a kombinációt.

Implementáld a generateCombination(forRoom room: Int, usingFunction f: (Int) -> Int) -> (Int, Int, Int) függvényt, hogy előállítsd a szükséges kombinációt.

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

generateCombination(forRoom: 227, usingFunction: makeCombo)
// Returns (135, 219, 31)
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Swift Exercism

Készen állsz elkezdeni a(z) Double-Null0111 titkosügynök 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.