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'
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"
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
Ü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.
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!"
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)
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.