scrierea blocuri de finalizare cu închideri în Swift

chiar și după ce am avut un mâner bun pe conceptul de blocuri, am avut încă să se uite în sus sintaxa lor de fiecare dată când am vrut să scrie nimic, dar cel mai simplu de blocuri (vă mulțumesc fuckingblocksyntax.com). versiunea Swift a blocurilor, cunoscută sub numele de închideri, adoptă o abordare mult mai curată și mai naturală a sintaxei. Deci, fără alte întrebări, timpul de a învăța închiderile așa cum m-a învățat tatăl meu: scriind un bloc de finalizare.

API-ul de animație UIView este unul dintre cele mai comune domenii pe care iOS devs le utilizează blocuri. Înainte de a scrie orbește propria metodă, încercați să utilizați unul dintre eșantioanele de cod Apple pentru a vă familiariza cu sintaxa. Mai jos este un exemplu Objective-C, și apoi același cod scris în Swift:

obiectivul C:

Swift:

spre disperarea iepurilor și a dezvoltatorilor miopi, carets ( ^ ) nu se găsesc (încă) în Swift. Odihnește-te în pace vechi prieten, ai fost înlocuit cu cuvântul cheie in. Utilizați cuvântul cheie in după ce ați terminat de declarat parametrii și valorile de returnare pentru închiderea dvs. Acest lucru va face mai mult sens dacă vă arăt ce completare automată completat odată ce știa ce metodă am vrut:

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

concentrându-se pe această sintaxă, devine clar cum să scrieți corect parametrii și valorile returnate ale unei închideri:

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

în exemplul de cod Swift de mai sus, ambele închideri de animație s-au întors nule, așa că am putea renunța la sintaxa tipului de returnare împreună. De aceea vedeți doar ( ) pentru parametri. Observați că, chiar dacă nu există parametri, ca în prima închidere, tot aveți nevoie de cei goi ( ) înainte de cuvântul cheie in. Acestea sunt necesare. Bolded astfel încât să vă amintiți.

bine, acum să încercăm să scriem propria noastră metodă Swift cu o închidere de finalizare. În depozitul GitHub legat în partea de jos a acestui post, am lucrat la o aplicație client GitHub în Swift cu o echipă de colegi de cod. În acest proiect avem un controler de rețea care se ocupă de toate apelurile de rețea asincrone la API Github lui.

să scriem o metodă care preia o listă de utilizatori dintr-o interogare de căutare pe client. Această metodă va avea nevoie de o închidere de finalizare pentru a anunța controlerul de vizualizare solicitant când apelul de rețea este terminat și pentru a oferi o serie de modele de utilizatori pentru a popula vizualizarea colecției noastre.

Iată cum ar arăta semnătura funcției:

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

avem doi parametri aici: un tip de șir numit searchTerm și închiderea noastră de finalizare. Observați sintaxa în parametrul de închidere? Mai întâi este numele închiderii noastre, așa cum o vom numi mai târziu în metodă, apoi parametrul (matrice de utilizatori), urmat de valoarea noastră returnată (void). Mai jos este o aproximare a ceea ce arată corpul acestei metode:

 //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)

apelarea închiderii finalizării noastre în Swift este aproape la fel cum numim blocul nostru de finalizare în Objective-C. Se numește la fel ca orice altă funcție și ne asigurăm că trecem într-o matrice ca parametru, deoarece așa am definit-o în semnătura funcției noastre. Am lăsat intenționat tot codul de rețea pentru a menține acest post cât mai scurt posibil, dar nu ezitați să verificați depozitul Github dacă sunteți interesat să vedeți cum funcționează. Intenționăm să avem o postare pe blog în rețea în Swift în viitorul apropiat.

în cele din urmă, să aruncăm o privire la modul în care ne-ar numi această metodă de la SearchUsersViewController nostru:

un lucru mai vreau să observați este cum am sunat addOperationWithBlock()pe nostru mainQueue(). Dacă o închidere este ultimul parametru al semnăturii unei funcții, puteți utiliza sintaxa specială pentru a o face și mai curată. Aceasta este denumită o închidere finală. Închiderile finale sunt scrise direct după () ale unui apel de funcție. Mai jos este un apel de funcție, mai întâi cu o închidere regulată, apoi cu o închidere finală.

este o diferență subtilă și ambele moduri funcționează. Amintiți-vă că trebuie să fie ultimul parametru al funcției pentru a utiliza sintaxa de închidere finală.

acum ar trebui să știți sintaxa de bază a închiderilor în Swift. Pentru unele lucruri de nivel mai avansat cu privire la închideri, consultați limbajul de programare Swift pe iBooks. Are o întreagă subsecțiune pe ele. Și iată linkul către proiectul client github.

există, de asemenea, deja o contrapartidă Swift la fuckingblocksyntax.com numit, ai ghicit, dracu ‘ closuresyntax.com care merită cu siguranță să fie adăugat la bara de marcaje pe măsură ce învățați Swift.

Bună ziua.

gata pentru a deveni un dezvoltator profesionist? Intră în contact află cum!

Lasă un răspuns

Adresa ta de email nu va fi publicată.