Ce e nou în Swift 4

Swift 4 a fost în lucru în ultimele luni. Dacă sunteți ca mine, ați putea urma Swift Evolution pentru a rămâne la curent cu toate propunerile și schimbările. Chiar dacă faceți acest lucru, acum este momentul potrivit să examinați toate adăugările și modificările aduse limbii în această nouă iterație.

Un instantaneu al lui Swift 4 a fost deja disponibil cu câteva săptămâni înainte ca Xcode 9 să fie anunțat la WWDC 2017. În acest post veți afla totul despre noile caracteristici introduse în Swift 4 - de la API-uri noi la îmbunătățirea sintaxei limbajului.

Să vedem mai întâi cum puteți obține noul compilator instalat pe mașina dvs..

Setarea Xcode

Există două modalități de a rula Swift 4. Puteți instala Xcode 9 beta dacă aveți un cont de dezvoltator cu acces la el sau puteți configura Xcode 8 pentru a rula cu un instantaneu Swift 4. În primul caz, descărcați beta-ul din pagina de descărcare a contului pentru dezvoltatori.

Dacă preferați să utilizați Xcode 8, pur și simplu mergeți la Swift.org pentru a descărca cel mai recent instantaneu de dezvoltare Swift 4.0. După terminarea descărcării, dublu click pentru a deschide fișierul .pkg, care instalează instantaneul. 

Treceți acum la Xcode și mergeți la Xcode> Toolchains> Gestionați Toolchains. De acolo, selectați instantaneul nou instalat Swift 4.0. Reporniți Xcode și acum Swift 4 va fi utilizat la compilarea proiectului sau a locului de joacă. Rețineți că tot codul prezentat în acest tutorial este disponibil și într-un repo GitHub.

Functii noi

Să aruncăm o privire la noile caracteristici adăugate la Swift 4. Un avertisment: limba este încă în versiune beta și vom vedea cel mai probabil mai multe modificări și remedierile de eroare înainte de lansarea versiunii oficiale. În plus, unele dintre cele mai recent aprobate propuneri nu pot fi încă implementate în acest moment, deci țineți cont de viitoarele note de lansare pentru a vedea ce vor fi implementate și fixate.

Codificare și decodare

Analiza JSON este unul dintre cele mai discutate subiecte din comunitatea Swift. Este minunat să vedem că cineva a avut grijă de scrierea propunerilor SE-0166 și SE-0167 și a împins ideea de a actualiza API-urile de arhivare și serializare în cadrul Fundației. În Swift 4, nu mai este nevoie să analizați sau să codificați manual clasa, structura sau enum. 

Nou codificabile și decodable au fost adăugate protocoale și puteți face clasele dvs. conforme prin simpla adăugare Codable (care este un alias pentru Decodabil și codificabil) în lista de moștenire a clasei. Apoi puteți folosi JSONEncoder pentru a codifica o instanță a clasei:

wwdc = Conferinta (numele: "WWDC", orasul: "San Jose", data: dateIntervalSince1970: 0) lasa jsonEncoder = JSONEncoder jsonEncodat, codificare: .utf8) // "nume": "WWDC", "oraș": "San Jose", "date": - 978307200

După cum puteți vedea, instanțiați a JSONEncoder obiect pentru a transforma structul într-o reprezentare de șir JSON. Există câteva setări pe care le puteți modifica pentru a obține exact formatul JSON de care aveți nevoie. De exemplu, pentru a seta un format de dată personalizat, puteți specifica a dateEncodingStrategy în modul următor:

lasă jsonEncoder = JSONEncoder () dateFormatter = DateFormatter () dateFormatter.dateStyle = .long dateFormatter.timeStyle = .long jsonEncoder.dateEncodingStrategy = JSONEncoder.DateEncodingStrategy.formatted (dateFormatter) lasă jsonEncoded = încercați jsonEncoder.encode (wwdc) lasă jsonString = String (data: jsonEncoded, codificare: .utf8) // "name": "WWDC", "city": "San Jose", "date": "1 ianuarie 1970 la 1:00:00 GMT + 

Procesul invers pentru a decoda o șir funcționează foarte asemănător, datorită JSONDecoder clasă.

lasă jsonDecoder = JSONDecoder () să decodezeWWDC = încercați jsonDecoder.decode (Conference.self, de la: jsonEncoded) // 'decodedWWDC' este deja de tip Conference!

După cum puteți vedea, trecând tipul obiectului la decodifica , lăsăm decodorul să știe ce obiect așteptăm înapoi de la datele JSON. Dacă totul este reușit, vom primi o instanță a obiectului nostru model gata de a fi folosit.

Nu este chiar toată puterea și modularitatea noului API. În loc să folosești a JSONEncoder, puteți utiliza noul PropertyListEncoder și PropertyListDecoder în cazul în care trebuie să stocați datele într-un fișier plist. De asemenea, puteți crea propriul encoder și decodor personalizat. Trebuie doar să faceți decodorul dvs. în conformitate cu decodor și codificatorul dvs. la encoder protocol.

Siruri de caractere

Ca parte a Manifestului de coarde, Şir tip, de asemenea, a primit destul de o reîmprospătare mare. Se compensează acum încă o dată (după ce a fost eliminat în Swift 2) la Colectie protocol datorită propunerii SE-0163. Deci, acum puteți enumera pur și simplu un șir pentru a obține toate personajele.

lăsați textul: String = "Bună ziua de la Tutsplus!" pentru caracterul în text.reversed () print (character)

subșir este un tip nou care se conformează aceleași condiții StringProtocol la care Şir de asemenea, conforme. Puteți crea un nou subșir doar prin inscripționarea a Şir. Următoarea linie creează o subșir prin omiterea primului și ultimului caracter.

permiteți substring = text [text.index (după: text.startIndex) ... 

Un plus frumos care ar trebui să facă mai ușor să lucreze cu bucăți mari de text este șirurile cu mai multe linii. Dacă trebuie să creați un bloc de text care să se întindă pe mai multe linii, anterior a trebuit să inserați manual \ n peste tot. Acest lucru a fost foarte inelegant și dificil de gestionat. Există acum o modalitate mai bună de a scrie șiruri multi-linie, după cum puteți vedea din următorul exemplu:

"Bine ați venit la Envato Tuts + Sperăm că vă place să învățați cu noi!" "

Există puține reguli care merg împreună cu această nouă sintaxă. Fiecare șir începe cu o cotație triplă („““). Apoi, dacă întregul șir este indentat, distanța dintre caracterele de închidere decide distanța care urmează să fie îndepărtată de la fiecare linie din șir. De exemplu, dacă caracterul de închidere este indentat de 2 file, aceeași sumă va fi eliminată din fiecare rând. Dacă șirul are o linie care nu are această distanță, compilatorul va arunca o eroare.

Căi cheie

Au fost adăugate căi cheie în Swift 3 pentru a facilita referirea la proprietăți într-un obiect. În loc să facem referire la o cheie de obiect cu un literal simplu, literal, căile cheie ne permit să impunem o verificare a compilării în timp ce un tip conține cheia necesară - eliminând un tip obișnuit de eroare de execuție. 

Căile cheie au fost un plus frumos pentru Swift 3, dar utilizarea lor a fost limitată la NSObjectși nu au jucat bine cu structuri. Acestea au fost principalele motivații din spatele propunerii SE-0161 de a oferi API o reîmprospătare.

O nouă sintaxă a fost convenită de comunitate pentru a specifica o cale cheie: calea este scrisă începând cu a \. Se pare ca:

struct Conferința var name = "" lăsați orașul: String lasă numeleKeyPath = \ Conference.name let wwdc = Conferința (nume: "WWDC"

 nameKeyPath obiect descrie o trimitere la Nume proprietate. Acesta poate fi apoi folosit ca un indice pe acel obiect.

Dacă schimbați variabila de la lăsa la var de WWDC, puteți modifica, de asemenea, o anumită proprietate prin intermediul sintaxei indiciu-cheie al căii.

wwdc [keyPath: nameKeyPath] = "AltConf" da numele = wwdc [keyPath: nameKeyPath] // "AltConf"

Ranguri unilaterale

SE-0172 a propus adăugarea de operatori prefix și postfix pentru a evita repetarea inutilă a unui index de început sau de sfârșit atunci când se poate deduce. De exemplu, dacă doriți să inscripționați o matrice de la cel de-al doilea index până la ultima, ați putea să o scrieți în felul următor:

permiteți numerelor = [-2, -1, 0, 1, 2] să fie pozitive = numere [2 ... 

Anterior, endIndex trebuia specificat. Acum, există o sintaxă mai scurtă:

lăsați pozitiv = numere [2 ...]

Sau, dacă doriți să începeți cu indexul de pornire:

lasă negativ = numere [... 1]

Aceeași sintaxă poate fi utilizată, de asemenea, pentru potrivirea modelului în a intrerupator afirmație.

Subscripts generic

Înainte de Swift 4, erau necesare indexuri pentru a defini un tip specific de valoare de retur. SE-0148 a propus posibilitatea de a defini un singur indice generic care să deducă tipul retur pe baza valorii rezultatelor definite. Pe lângă adnotarea de tip, funcționează cam la fel ca înainte.

struct Conferences let conferințe: [String: Any] // Returnează modelele conferinței ținând cont de cheia lui. subscript(cheie: String) -> T? conferințe de întoarcere [cheie] ca? T // Definirea tipului de returnare a variabilei și accesarea obiectului prin index. ce lucru: conferință? = conferințe ["WWDC"]

După cum puteți vedea, acest lucru îmbunătățește cu adevărat lizibilitatea obiectelor dvs. în cazurile în care trebuie să le accesați prin sintaxa subscript.

Existențiali de clasă și subtip

Una dintre caracteristicile care lipsesc de la sistemul tip Swift până în prezent a fost capacitatea de a constrânge o clasă unui protocol specific. Acest lucru a fost stabilit în Swift 4 - acum puteți specifica tipul de obiect și protocoalele la care trebuie să se conformeze, datorită SE-0156. Puteți scrie, de exemplu, o metodă care să ia o UIView care este conformă cu reîncărcabil protocol cu ​​următoarea sintaxă:

func reload (vizualizare: UIView & Reloadable) 

Dicționar și setări de îmbunătățiri

Dicţionar și A stabilit au primit, de asemenea, o reîmprospătare frumos în Swift 4. Acestea sunt mult mai plăcute de a utiliza datorită unor metode de utilitate care au fost adăugate.

mapValues

Dicționar now has a mapValues metoda de a schimba toate valorile, evitând utilizarea genericului Hartă metodă care necesită lucrul cu tupluri cheie, valoare.

Conferințe = "[WWDC": "Foarte bine", "AltConf": "Bine", "Firebase Party": "Foarte distractiv"] // Hartă peste toate valorile din dicționar. lăsați newConferences = conferences.mapValues ​​valoare în valoare returnată + "👍"

filtru Tip retur

 filtru metoda returneaza acum un obiect de acelasi tip cu care filtrati.

// Tipul acestei variabile este [String: String] let wwdc = conferințe.filter $ 0.key == "WWDC"

Implicit pentru Căutare în dicționar

Când lucrați cu dicționare, puteți furniza o valoare implicită atunci când utilizați sintaxa subscript pentru a evita să mai despachetați mai târziu un opțional.

// Valoare implicită dacă cheia nu a fost găsită. lasa talkShow = conferinte ["The Talk Show", implicit: "🤷♂️"]

Dicționar de grupare Initializer

În cele din urmă, a Dicționar (gruparea :) inițializatorul a fost introdus pentru a facilita crearea unui nou dicționar prin gruparea elementelor unei colecții existente în funcție de anumite criterii. 

În exemplele următoare, vom crea un dicționar prin gruparea tuturor conferințe care au aceeași scrisoare de început. Dicționarul va avea o cheie pentru fiecare literă inițială din conferințe colectare, fiecare valoare constituind toate cheile care încep cu acea literă.  

dă dicționar = dicționar (grupare: conferințe.value) $ 0.uppercased () mai întâi! 

Resurse

Dacă sunteți interesat să mergeți mai adânc în noile caracteristici Swift 4, iată câteva resurse:

  • Ce este nou în Swift - Sesiunea 402 - WWDC 2017
  • Ghidul Apple Swift
  • Ole Begemann, care este nou în terenul de joacă Swift 4
  • Ghid de migrare către Swift 4

Concluzie

Acum că ați aruncat o privire asupra unora dintre noile caracteristici noi din Swift 4, probabil că doriți să începeți să le folosiți, pentru a vă ajuta să păstrați codul dvs. proaspăt și curat. Începeți să scrieți noul cod pentru a profita de noile funcții utile și să vă gândiți să refacționați unele dintre codurile anterioare pentru a le simplifica și a le citi mai ușor.

Aflați Swift

Am construit un ghid complet pentru a vă ajuta să învățați Swift, indiferent dacă începeți doar cu elementele de bază sau doriți să explorați subiecte mai avansate.

De asemenea, puteți să consultați unele dintre celelalte postări ale noastre în dezvoltarea aplicațiilor iOS!

Cod