Schreiben von Vervollständigungsblöcken mit Schließungen in Swift

Selbst nachdem ich das Konzept der Blöcke gut im Griff hatte, musste ich ihre Syntax jedes Mal nachschlagen, wenn ich etwas anderes als die einfachsten Blöcke schreiben wollte (danke fuckingblocksyntax.com ). Swifts Version von Blöcken, bekannt als Closures, nimmt einen viel saubereren, natürlicheren Ansatz zur Syntax. Also ohne weiteres, Zeit zu lernen, wie mein Vater es mir beigebracht hat: indem ich einen Abschlussblock schreibe.

Die Animations-API von UIView ist einer der häufigsten Bereiche, in denen iOS-Entwickler Blöcke verwenden. Bevor Sie blind Ihre eigene Methode schreiben, versuchen Sie, eines der Codebeispiele von Apple zu verwenden, um sich mit der Syntax vertraut zu machen. Unten finden Sie ein Objective-C-Beispiel und dann denselben Code, der in Swift geschrieben wurde:

Objective C:

Swift:

Sehr zum Entsetzen von Kaninchen und kurzsichtigen Entwicklern sind Carets (^ ) in Swift (noch) nirgends zu finden. Ruhe in Frieden alter Freund, du wurdest durch das Schlüsselwort in ersetzt. Sie verwenden das Schlüsselwort in, sobald Sie die Parameter und die Rückgabewerte für Ihren Abschluss deklariert haben. Dies macht mehr Sinn, wenn ich Ihnen zeige, was Autocomplete ausgefüllt hat, sobald es wusste, welche Methode ich wollte:

UIView.animateWithDuration(duration: NSTimeInterval, animations: (() -> Void)?, completion: ((Bool) -> Void)?)

Wenn Sie sich auf diese Syntax konzentrieren, wird klar, wie die Parameter und Rückgabewerte eines Abschlusses richtig geschrieben werden:

{(parameters) -> (return type) in expression statements}

Im obigen Swift-Codebeispiel gaben beide Animationsverschlüsse void zurück, sodass wir die Syntax des Rückgabetyps alle zusammen löschen konnten. Deshalb sehen Sie nur das ( ) für die Parameter. Beachten Sie, dass Sie auch dann, wenn keine Parameter vorhanden sind, wie im ersten Abschluss, diese empty ( ) vor dem Schlüsselwort in . Sie sind erforderlich. Fett gedruckt, damit Sie sich daran erinnern.

Okay, jetzt versuchen wir, unsere eigene Swift-Methode mit einem Abschlussabschluss zu schreiben. In dem Github-Repository, das am Ende dieses Beitrags verlinkt ist, habe ich mit einem Team von Code Fellows an einer Github-Client-App in Swift gearbeitet. In diesem Projekt haben wir einen Netzwerkcontroller, der alle asynchronen Netzwerkaufrufe an die Github-API verarbeitet.

Schreiben wir eine Methode, die eine Liste von Benutzern aus einer Suchabfrage auf dem Client abruft. Diese Methode benötigt einen Abschlussabschluss, damit der anfordernde View Controller weiß, wann der Netzwerkaufruf beendet ist, und ein Array von Benutzermodellen zum Auffüllen unserer Sammlungsansicht bereitstellt.

So würde die Signatur der Funktion aussehen:

func searchUsersWithSearchTerm(searchTerm: String, completionClosure: (users :User) ->()) 

Wir haben hier zwei Parameter: einen String-Typ namens searchTerm und unseren Abschlussabschluss. Beachten Sie die Syntax im Schließungsparameter? Zuerst ist der Name unseres Abschlusses, wie wir ihn später in der Methode nennen werden, dann der Parameter (Array von Benutzern), gefolgt von unserem Rückgabewert (void). Unten sehen Sie eine Annäherung daran, wie der Körper dieser Methode aussieht:

 //setup a NSMutableRequest with the correct API URL and parameters //setup a dataTask on our NSURLSession instance //once our datatask has successfully retrieved the data we wanted, and we have parsed through it to create an array of User Models, we call our completion closure like this: var users : User = //Parse the JSON data into Users completionClosure(users: users)

Es wird wie jede andere Funktion aufgerufen, und wir stellen sicher, dass ein Array als Parameter übergeben wird, da wir es so definiert haben in unserer Funktionssignatur. Ich habe absichtlich den gesamten Netzwerkcode weggelassen, um diesen Beitrag so kurz wie möglich zu halten, aber schauen Sie sich das Github-Repository an, wenn Sie sehen möchten, wie es funktioniert. Wir planen, in naher Zukunft einen Blogbeitrag über das Netzwerk in Swift zu veröffentlichen.

Werfen wir zum Schluss einen Blick darauf, wie wir diese Methode von unserem SearchUsersViewController aufrufen würden:

Eine weitere Sache, die ich Ihnen mitteilen möchte, ist, wie ich addOperationWithBlock() auf unserem mainQueue() aufgerufen habe. Wenn ein Abschluss der letzte Parameter der Signatur einer Funktion ist, können Sie eine spezielle Syntax verwenden, um ihn noch sauberer zu machen. Dies wird als Trailing Closure bezeichnet. Trailing Closures werden direkt nach dem ( ) eines Funktionsaufrufs geschrieben. Unten finden Sie einen Funktionsaufruf, zuerst mit einem regulären Abschluss, dann mit einem abschließenden Abschluss.

Es ist ein subtiler Unterschied, und beide Wege funktionieren. Denken Sie daran, dass es der letzte Parameter der Funktion sein muss, um die abschließende Schließungssyntax zu verwenden.

Jetzt sollten Sie die grundlegende Syntax von Closures in Swift kennen. Für einige fortgeschrittenere Dinge über Verschlüsse, schauen Sie sich die Swift-Programmiersprache auf iBooks an. Es hat einen ganzen Unterabschnitt über sie. Und hier ist der Link zum Github-Client-Projekt.

Es gibt auch schon ein Swift-Pendant zu fuckingblocksyntax.com genannt, du hast es erraten, fuckingclosuresyntax.com, das es definitiv wert ist, zu Ihrer Lesezeichenleiste hinzugefügt zu werden, wenn Sie Swift lernen.

Guten Tag.

Bereit, ein professioneller Entwickler zu werden? Kontaktieren Sie uns finden Sie heraus wie!

Schreibe einen Kommentar

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