Swift - Closures

Aus Wikizone
Version vom 17. Januar 2023, 10:52 Uhr von 134.3.86.14 (Diskussion) (→‎Einführung)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

Links[Bearbeiten]

Swift (Programmiersprache)

Einführung[Bearbeiten]

Closures sind anonyme Funktionen, also Funktionen ohne Namen. Da eine Funktion nicht nur Variablen sondern auch andere Funktionen als Parameter entgegennehmen kann, ist es möglich effektiven Code mit Funktionen zu schreiben.

Closure Allgemeine Form[Bearbeiten]

{ (parameters)->(return_type) in 
  statements
}

Beispiele[Bearbeiten]

/**
 BEISPIEL
 Closures sind anonyme Funktionen.
 Hier wird zu jedem Element des Arrays eins hinzugezählt. Das tut die anonyme Funktion. Die Funktion map führt diese für jedes Element aus.
 */
let myArray = [6,4,8,9,2,0]
let newArray = myArray.map({$0 + 1})
print(newArray)

/**
 I DER WEG ZUM CLOSURE
 1. Funktionen könnnen Funktionen als Parameter aufnehmen
 2. Funktionen können Funktionen zurückgeben
 3. Um eine Funktion zu übrergeben reduziere alles auf die Typen der Ein und ausgabe Parameter:
 (Float, Float) -> (Float)
 und übergebe das als Funktionsparameter
 */

func add( x: Int, y: Int )->Int{
    return x + y
}
func operation( x: Int, y: Int, operation: (Int, Int) -> Int) -> Int{
    return operation(x,y)
}
let result = operation(x: 4, y: 5, operation: add)

/**
 II ERSTELLE EINE ANONYME FUNKTION
 Wir können aus der übergebenen Funktion aber auch ein Closure machen:
 1. Entferne das Schlüsselwort func und den Funktionsnamen
 2. Bewege die { Klammer ganz nach vorne
 3. Dort wor die Klammer vorher war schreibe das Schlüsselwort in
 { (x: Int, y: Int)->Int in return x + y }
 4. Diesen Ausdruck kann man jetzt in Funktionen nutzen oder als Variable speichern.
 */
let result2 = operation(
    x: 8,
    y: 8,
    operation: { (n1:Int, n2:Int ) -> Int in return n1 + n2 }
)

// KÜRZER SCHREIBEN
// 1. Swift kann Datentypen selbst herleiten (Infer). Man kann sie weglassen
let result3 = operation(x: 8, y: 8, operation: { (n1, n2 ) in
    return n1 + n2
})

// 2. Wenn die Funktion nur eine Zeile hat kann man return weglassen
let result4 = operation(x: 3, y: 7, operation: { (n1, n2 ) in n1 + n2 })

// 3. Im Closure kannst du anonyme Parameter verwenden $0 ist der Erste $1 der Zweite
// Auch das Schlüsselwort in kann man weglassen
let result5 = operation(x: 5, y: 5, operation: { $0 + $1 })

// 4. Wenn der letzte Parameter ein Closure ist, dann kannst du den letzen Parameternamen weglassen und ein Trailing Closure erstellen. (Beachte die vorgezogene runde Klammer.
let result6 = operation(x: 5, y: 5){ $0 + $1 }

// Wäge zwischen Kürze und Lesbarkeit ab.