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..
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.
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.
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.
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 laNume
proprietate. Acesta poate fi apoi folosit ca un indice pe acel obiect.Dacă schimbați variabila de la
lăsa
lavar
deWWDC
, 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ă cureîncărcabil
protocol cu următoarea sintaxă:func reload (vizualizare: UIView & Reloadable)Dicționar și setări de îmbunătățiri
Dicţionar
șiA 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 genericuluiHartă
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ă dinconferinț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!