Wir arbeiten viel asynchron auf mobilen Geräten, um zu verhindern, dass unser Code den Hauptthread blockiert. Früher bedeutete dies viele Delegatmethoden, aber neuere Fortschritte in Objective-C ermöglichten es uns, Werte als Vervollständigungshandler an Blöcke zurückzugeben. Zweifellos werden wir auch in Swift viel davon tun müssen.

Hier ist eine Funktionsdefinition von Objective-C, die das Vervollständigungsblockmuster und die zugehörige Syntax verwendet, um es zu verwenden:

- (void)hardProcessingWithString:(NSString *)input withCompletion:(void (^)(NSString *result))block;;

Danke verdammte Blocksyntax! Ich kann mich auch nie an dieses Zeug erinnern

Swift hat die Möglichkeit, dies zu verbessern, da es sich nicht um einen nachträglichen Sprachzusatz handeln muss, sondern von Anfang an eingebacken werden kann.

Das Ergebnis mag komplex aussehen (wie alle functions-in-function-Deklarationen), ist aber wirklich einfach. Es ist nur eine Funktionsdefinition, die eine Funktion als Argument verwendet, solange Sie die Verschachtelung verstehen, sollte dies schnell klar werden:

func hardProcessingWithString(input: String, completion: (result: String) -> Void) {...completion("we finished!")}

Der Abschlussabschluss hier ist nur eine Funktion, die eine Zeichenfolge verwendet und void zurückgibt. Zuerst klingt das rückwärts – das braucht einen String als Argument? Wir wollen einen String zurückgeben! – aber wir wollen nicht wirklich einen String zurückgeben, das würde bedeuten, dass wir blockiert haben, bis wir zurückkehren. Stattdessen rufen wir eine Funktion auf, die der Angerufene uns gegeben hat, und stellen ihnen die zugehörigen Argumente zur Verfügung.

Die Verwendung von Completion-Handlern ist jedoch einfacher als die Deklaration, dank einer cleveren Möglichkeit, Funktionsaufrufe vom Swift-Team zu verkürzen:

hardProcessingWithString("commands") {(result: String) inprint("got back: \(result)")}

Dies ist ein abschließender Abschluss, den wir immer dann verwenden können, wenn das letzte Argument ein Abschluss ist. Mit der etwas seltsamen Syntax {() in } haben wir auf magische Weise die Ergebnisse, dass wir den Abschluss in unserer asynchronen Funktion zurückgegeben haben. Ich muss wirklich noch die Tiefen von Swift ausloten, um zu verstehen, was diese Syntax zum Ticken bringt, aber im Moment bin ich froh, dass es funktioniert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.