[Swift] Sinn von Closures

m1LLo

Osnabrücker Reinette
Registriert
29.05.10
Beiträge
991
Huhu,

ich hab mal ein Verständnisproblem:
Ich sehe keinen Sinn von Closure! Das ist doch nichts anderes als ein Temporär erstellter Konstruktor/Initialisierung einer Klasse? Welchen Sinn hat das? Warum sollte ich nicht einfach eine passende Init Methode schreiben?

Man kann ja jetzt auch einer Konstanten den Typ Closure zuweisen. Welchen Sinn hat denn das?
Code:
let testObjekt: () -> Test = {
     let test = Test()
     test.propertie = "Wert"
     return test
}
Hab ich da jetzt einen Konstruktoraufruf über eine Konstante definiert?
Wo nutzt man sowas?
 

Tobias Scholze

Apfeltalk Entwicker
AT Redaktion
Registriert
15.07.09
Beiträge
1.581
Z.b. für kleine Helferlein wo man seine `viewDidLoad()` nicht zu bomben will bzw. schön gekapselt halten mag:

Code:
lazy var formatter: NSDateFormatter = {
    let formatter = NSDateFormatter()
    formatter.dateStyle = .ShortStyle
    formatter.timeStyle = .NoStyle
    return formatter
}()

Wobei du Blocks / Closures ja vor allem bei asynchronen Dingen wie Animationen oder http-calls hast.

Grüße, Tobi
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.541
Der deutsche Fachbegriff dazu heißt "Funktionsabschluss" oder kurz "Abschluss". Ein neues Konzept ist das nicht. Apple hat es aus den Funktionalen Programmiersprachen übernommen, zunächst als Ergänzung zu C, später dann in Swift. Bei den Funktionalen Programmiersprachen werden solche Konstruktionen seit Ende der 1950er Jahre verwendet. Die Idee dazu stammt wiederum aus dem sogenannten Lambda-Kalkül, das in den 1930er Jahren erschaffen wurde.

So kurz wie möglich beschrieben ist ein Abschluss eine namenlose Funktion, die direkt an der Stelle definiert wird, an der man sie braucht.

Dass man eine Closure auch einer Variablen zuweisen kann, ist eher ein interessanter Nebeneffekt, den man in der Praxis tatsächlich seltener braucht. Das steht trotzdem immer in den Anleitungen, denn auf diese Weise wird angedeutet, wie das System intern eine Closure realisiert: Man kann sich das so vorstellen, als würde ein Stück Programmcode mitsamt seiner Ablaufumgebung zwischengespeichert.

In der Praxis verwendet man im Apple-Umfeld Closures meistens in Situationen, bei denen man früher "Hook"- oder "Callback"-Funktionen verwendet hat: Zum Beispiel wenn man einen Ablauf anstößt, der ein Endergebnis (und vielleicht auch noch Zwischenergebnisse) zu Zeitpunkten produziert, die im Vorhinein unbekannt sind. Man kann dann in dem Aufruf, der diesen Vorgang startet, gleich ein Stück Code als Closure mitgeben, der später asynchron in einem anderen Thread aufgerufen wird, sobald die Ergebnisse vorliegen. Der Haupt-Thread läuft währenddessen weiter, so dass das Programm reaktionsfähig bleibt und nicht mit drehendem Cursor auf die Ergebnisse warten muss.

Aus Sicht einer imperativen Programmiersprache ist der Vorteil einer Closure, dass man keinen Funktionsnamen für dieses Stück Code definieren muss und dass sie direkt am Ort der Verwendung steht (wichtig für die Lesbarkeit und das Verständnis des Programms). Aus Sicht einer objektorientierten Programmiersprache braucht man keine Klasse und keine Methode zu definieren. Beim Aufruf muss kein Objekt erzeugt und danach wieder gelöscht werden.
 

m1LLo

Osnabrücker Reinette
Registriert
29.05.10
Beiträge
991
Vielen Dank! Sehr ausführlich und verständlich erklärt.