Un ghid pas cu pas pentru a converti o aplicație completă Objective-C în Swift
Publicat: 2018-03-14De la lansarea sa în 2014, limbajul de programare Apple Swift a cunoscut o creștere fenomenală. Limbajul de programare a reușit să-și facă loc în corvoada Top 10 limbaje de programare , împărțind poziția cu predecesorul său, Objective-C. Dar războiul dintre rapid și obiectiv-C nu se atenuează niciodată.
Odată cu această creștere a popularității și caracteristici interesante, mulți dezvoltatori de aplicații iOS care lucrau anterior cu Obj-C au trecut la limbajul de programare Swift. De fapt, în lupta dintre Swift sau Objective-C pentru iOS, diverse aplicații iOS precum LinkedIn, Yahoo Weather, Hipmunk și Lyft au fost deja actualizate de la Objective-C la Swift, în timp ce mulți intenționează să convertească o aplicație Objective-C. lui Swift.
FACTORI CARE FAC SWIFT O OPȚIUNE MAI BUNĂ
Personal, am văzut evoluția lui Swift de când a fost dezvăluită prima sa versiune și pot spune că între swift vs C, Swift înlocuiește Objective-C pe baza unor factori, cum ar fi
Sursa deschisa
Swift este un limbaj open-source, iar codul swift poate fi portabil pe mai multe platforme decât a fost vreodată Objective-C.
Viteză
Dezvoltarea Swift pentru iOS este un limbaj tip static care funcționează cu compilatorul LLVM și poate reutiliza codul existent, eradica resursele nefolosite, gestiona funcțiile inline și așa mai departe. În plus, funcționarea sa se bazează pe una dintre cele mai rapide aritmetice de calcul al algoritmului C++, care, la rândul său, demonstrează că are un avantaj competitiv față de predecesorul său.
Conform a ceea ce Apple susține și am experimentat cu mine, algoritmul de căutare Swift este de 2,6 ori mai rapid decât Objective-C.
Lizibilitate
Spre deosebire de Objective-C, Swift nu este legat de fundațiile C. Le permite dezvoltatorilor iOS să elimine apelurile de metodă imbricate, să omite un punct și virgulă la sfârșitul unei linii, să evite punerea @ la începutul unui cuvânt cheie, să concateneze șirul folosind semnul „+” și așa mai departe. În plus, clasa Swift nu este împărțită în părți, interfață și implementare. Acest lucru a redus lungimea codului la aproape jumătate, făcându-l mai lizibil.
De exemplu, când aplicația Lyft a fost rescrisă de la zero în limbajul Swift, codul aplicației a scăzut de la 75.000 la 25.000 de linii. Aceste cifre impresionante reduc eforturile dezvoltatorilor fără a afecta performanța aplicației la nivelul clientului.
Codare interactivă
Cu funcția Playgrounds, le permite programatorilor să scrie o bucată de cod sau algoritm în timp ce colectează feedback pe parcursul fazei de dezvoltare. Deoarece codul Swift este scris folosind vizualizări de date, acest lucru face procesul de dezvoltare a aplicației mai ușor și accesibil.
Siguranță
Swift este un limbaj mai sigur și mai sigur pentru construirea unei aplicații conform tendințelor actuale ale pieței. Sintaxa și constructul de limbaj au exclus tipurile de greșeli observate în mod obișnuit în timpul codificării în limbajul Objective-C. Aceasta înseamnă că există șanse mai mici de blocare a aplicației și cazuri de comportament problematic.
Spre deosebire de acesta în cazul Objective-C, codul scris în Swift poate fi compilat și erorile pot fi remediate, împreună cu partea de scriere a codului. Prin urmare, Swift acționează mai bine și mai rapid în procesul de testare, în comparație cu procesul de testare a codului Objective-C.
întreținere
Deoarece Swift nu depinde de C ca și predecesorul său, întreținerea în cazul dezvoltării aplicației Swift este mult mai ușoară. Ceva care a făcut ca Swift să fie viitorul dezvoltării de aplicații iOS .
În cazul construirii unei aplicații iOS folosind Objective-C, dezvoltatorii trebuiau să mențină două fișiere de cod distincte pentru a crește timpul de construire și eficiența codului. Cu toate acestea, Swift a renunțat la acest mecanism cu două fișiere, îmbinând antetul Objective-C (.h) și fișierele de implementare (.m) într-un singur fișier (.swift). Compilatorul LLVM descoperă automat dependențe în timp ce citește fișierul Swift, ceea ce este un mare beneficiu pentru dezvoltatorii de aplicații iOS.
În afară de factorii menționați mai sus, avantajul demn de menționat al alegerii Swift față de alt limbaj de programare Apple este compatibilitatea acestuia cu Objective-C. Apple a oferit dezvoltatorilor de aplicații posibilitatea de a folosi ambele limbi în același proiect. Acest lucru nu este util doar în cazul dezvoltării unei aplicații iOS folosind Swift de la zero, ci și în actualizarea aplicației existente la Swift folosind codul Objective-C.
Deși acum sunteți familiarizat cu diferențele filozofice dintre cele două limbaje de dezvoltare a aplicațiilor iOS, să trecem la diferențele în timpul implementării practice.
SWIFT VS OBIECTIV-C: DIFERENȚE MAJORE ÎNTRE TITANII DEZVOLTĂRII IOS
Cu experiența mea cu baza de cod complexă Objective-C și baza de cod Swift, veți întâlni mai multe upgrade-uri la conceptele existente, împreună cu o introducere a diferitelor elemente noi care fac procesul de dezvoltare a aplicației să fie rapid. Fără să ne grăbim, haideți să aruncăm o privire la tot ce veți găsi nou/diferit în războiul rapid vs obiectiv c.
Opționale
Când vorbim despre performanță rapidă vs Objective-C, putem apela metode pe obiecte zero pentru a obține o valoare zero în Obj-C. Trebuie să efectuăm manual verificări zero pentru a înțelege comportamentul nedefinit în cazul unei valori zero neașteptate. Cu toate acestea, această problemă poate fi rezolvată folosind Opțional, un nou concept introdus în codul Swift. Opțional permite funcțiilor care ar putea să nu poată returna o valoare semnificativă să returneze o valoare încapsulată într-un opțional sau zero.
Sintaxa declarării tipului Opțional este:
Public enum Optional<Wrapped> :_Reflectable, NilLiteralConvertible
Practic, poate avea fie o valoare de tip Wrapped, fie o valoare inexistentă.
Swift face ca zaharul sintactic pentru declararea tipurilor să fie opțional, astfel încât să putem înlocui Optional<String> cu String?
Există în primul rând două moduri de a obține valoarea încapsulată din containerul opțional:
Înlănțuire opțională: Folosită în cazul în care instrucțiunea condiționată if-let va primi o valoare numai dacă aceasta există.
Împachetare forțată: Folosită când variabila opțională declarată este non-nula. Dacă valoarea există, va furniza rezultatul fără condiții de implementare. Dar, în celălalt caz, se va prăbuși.
Putem găsi, de asemenea, opționale implicit desfășurate în limbajul Swift, declarate ca șir!
De exemplu:
Clasa XClass
{
var aString: șir
var bString: String!
var cString: String?
Init (șir: șir)
{
aString = șir
}
}
Aici,
Un șir nu poate fi niciodată nul. Este esențial ca această variabilă să aibă o valoare în timpul inițializării obiectului, altfel programul va duce la o blocare.
Șirul B poate fi zero. Cu toate acestea, dacă încercați să accesați obiectul nil, programul se va bloca.
Șirul C poate fi zero și se presupune a fi tratat ca o variabilă opțională obișnuită.
Extensii
Extensiile și categoriile găsite în Obj-C sunt consolidate într-o singură entitate, extensii în limbajul Swift. Extensiile adaugă funcționalități noi la o clasă, enumerare, structură sau protocol deja existentă, iar cea mai bună parte este că nu trebuie să aveți acces la codul sursă original pentru a extinde tipurile.
Tupluri
Pe lângă opțiunile, un alt tip de date nou introdus în noul limbaj de dezvoltare al Apple este Tuples. Tuplurile (în locul tipului de date definit de utilizator) sunt considerate practic pentru a grupa multe valori într-un singur grup compus. Este elementul potrivit de luat în considerare dacă credeți că crearea unui model într-un loc ar putea exagera și dicționarul nu este suficient de ușor de citit. Pentru a afla mai multe tupluri, consultați acest blog .
generice
Generics este una dintre cele mai izbitoare caracteristici ale limbajului de programare Swift și, de fapt, multe dintre bibliotecile standard Swift sunt create cu codul Swift. Codul generic permite dezvoltatorilor să scrie funcții și tipuri flexibile, reutilizabile, care pot funcționa cu diferite seturi de tipuri, în funcție de cerințele definite. Acest lucru minimizează riscul de duplicare și îmbunătățește lizibilitatea codului printr-o abordare clară, abstractă.
Conform experienței mele, Generics este greu de obținut la început, la fel ca recursiile. Dar, când veți pune mâna pe el, veți putea să vă relaxați o lume cu totul nouă a remedierii problemelor logice obositoare.
Enumerare
În codul Objective-C, enumerările sunt limitate la tipurile primitive. Pentru maparea valorilor de enumerare întregi cu cele ale șirurilor de caractere pentru afișarea ieșirii, trebuie să introduceți o matrice sau să vă întoarceți spre structura de control al comutatorului. Cu toate acestea, nu trebuie să treceți prin aceste necazuri cu limbajul de dezvoltare a aplicației Swift iOS.
Swift oferă noi enumerari variate cu mai multe opțiuni. Enumerările Swift pot avea valori asociate, iar cazul de enumerare Swift poate conține un set predefinit de câmpuri. De fapt, enumerările Swift pot fi recursive și pot stoca valori brute.
De exemplu: 
Indicele
Indicele pot fi priviți ca un mediu pentru a accesa informații dintr-o secvență, colecție sau listă în clase, enumerări și structuri fără a utiliza o metodă. Puteți lua în considerare indicele pentru a seta și a prelua valori prin index fără a crea metode separate pentru stocarea și preluarea. De exemplu, puteți accesa elemente dintr-o instanță Array ca someArray[index] și elemente dintr-o instanță Dicționar ca someDictionary[key].

Sintaxa pentru declararea unui indice este următoarea:
indice (index: Int) -> Int {
obține {
//pentru declararea valorii indicelui
}
set (newValue) {
//pentru definirea valorilor
}
}
Tip Inferență
Swift a propus și siguranța de tip pentru dezvoltarea aplicației iOS, conform căreia o variabilă atunci când este declarată cu un anumit tip, tipul acesteia va fi static și neschimbabil. Compilatorul va determina (sau va deduce) ce tip va fi variabila dvs. pe baza valorilor pe care le atribuiți.
De exemplu:

Aici, compilatorul va afișa o eroare atunci când încercați să inițializați cu valori numerice la o variabilă str2 (vezi mai jos)

Funcții
Sintaxa Funcției din limbajul de programare Swift este mai flexibilă de definit decât cea din stilul complex de cod Objective-C. În Swift, fiecare funcție are un tip care cuprinde tipurile de parametri ale funcției și returnează tipul, ceea ce implică că puteți atribui funcții unei variabile sau puteți să o transmiteți ca valoare altor funcții (după cum se arată în exemplul de mai jos):

În afară de aceasta, Swift a permis dezvoltatorilor de aplicații să definească valorile implicite ale parametrilor funcționali.
Eroare de manipulare
Swift oferă o abordare complet nouă pentru aruncarea, prinderea, circulația și manipularea erorilor recuperabile în timpul execuției. Pentru a obține o privire despre gestionarea erorilor în Swift, consultați blogul.
În afară de acestea, diferite concepte care fac ca dezvoltarea aplicației Swift să fie de câștigat față de dezvoltarea aplicației Objective-C sunt:
Modele
În cazul lui Swift, modelele sunt de preferat să fie structuri, mai degrabă decât clase.
Protocoale
În primul dintre videoclipurile Apple WWDC, swift a fost introdus ca „limbaj orientat spre protocol”. Un protocol poate fi definit ca un model de metode, proprietăți și alte entități care se potrivesc unei anumite sarcini/funcționalitate. Ele pot fi îmbrățișate de o clasă, enumerare sau structură pentru a facilita o implementare efectivă a acelor cerințe și sunt mult mai puternice în comparație cu Obj C cu caracteristicile de furnizare de implementări implicite, încorporare generice etc.
În calitate de dezvoltator de aplicații iOS, prefer să creez un protocol înainte de a defini o clasă ca cea mai eficientă practică pentru a valorifica beneficiile limbajului de programare avansat Apple.
Abordarea programării funcționale
Swift permite dezvoltatorilor să folosească mai multe abordări funcționale pentru rezolvarea problemelor banale decât utilizarea buclelor tradiționale sau a tipurilor de referințe. Aici, perspectiva este de a analiza o problemă în ceea ce privește soluția, în loc de a determina cum să obținem soluția așa cum se face în abordarea tradițională.
Din experiența mea cu atât limbajul iOS, un lucru pe care l-am observat este că ceea ce făceam prin iterații folosind bucle for în Objective-C se poate face folosind conceptul de Filtrare, Hartă și Reducere în Swift. Pentru a obține informații aprofundate despre aceste funcții de ordin înalt în Programarea funcțională, consultați blogul.
GHID PAS CU PAS PENTRU CONVERȚIA O APLICATIE COMPLETĂ OBJECTIVE-C ÎN SWIFT
Astăzi, există diverse instrumente pentru a converti o aplicație din Objective-C în Swift linie cu linie. Cu toate acestea, sfătuiesc să nu folosiți niciunul. Deși ambele limbi iOS sunt interoperabile, paradigmele programului lor sunt diferite. Migrarea directă a unei aplicații de la Obj-C la Swift va aduce un risc mai mare de a utiliza paradigme greșite. Permiteți-mi să detaliez acest lucru.
Swift, spre deosebire de predecesorul său, este influențat de paradigma de programare funcțională, ceea ce îl face să se bazeze în mare măsură pe imuabilitate. De exemplu, dacă vorbiți despre matrice și dicționare - aceste modele de bază sunt folosite pentru a fi un tip de referință în Objective-C, dar sunt de tip valoare în Swift, deci imuabile. Acest lucru implică faptul că convertirea codului Obj-C în Swift subconștient folosind orice instrument vă va face să vă confruntați cu o mulțime de erori care sunt greu de depanat. În plus, Swift are o mulțime de funcții noi (așa cum este deja descris mai sus) care transformă algoritmii/abordările mai eficienți și programează mai rapid! De fapt, acesta este motivul principal pentru care Apple a dezvăluit o nouă limbă în loc să actualizeze Obj-C. Având în vedere toate aceste puncte, recomand tuturor să scrie o nouă aplicație în Swift de la zero, mai degrabă decât să opteze pentru o conversie linie cu linie de la Obj-C la Swift.
Totuși, dacă doriți să convertiți o aplicație completă Objective-C în Swift, un instrument pe care îl puteți utiliza este Swiftify. Instrumentul ușurează procesul de actualizare a codului Obj-C la noul limbaj de programare Apple cu un singur clic; economisind mii de ore de lucru. Caracteristica de interoperabilitate permite integrarea codului iOS convertit înapoi în Objective-C fără nicio bătaie de cap, ceea ce implică că puteți explora multitudinea de opțiuni pe care le oferă Swift și apoi să îl integrați înapoi în proiectul dvs. Obj-C fără a rescrie totul dintr-o dată.
Pregătiți codul aplicației existente pentru conversie
Este întotdeauna mai bine să începem cu cel mai recent cod Obj-C. Acest lucru se datorează faptului că Xcode folosește un convertor modern Objective-C care vă poate ajuta cu:
1. Schimbarea id-ului în instancetype ori de câte ori este posibil
2. Folosind macrocomenzile de enumerare corecte
3. Actualizarea la cea mai recentă sintaxă @property
În timp ce convertorul ajută la mecanismele de analiză și aplicare a potențialelor modificări, nu descrie semantica codului. Deci, este recomandabil ca toți dezvoltatorii de aplicații iOS să revizuiască totul manual o dată și apoi să confirme modificările.
Pentru a utiliza convertorul, selectați Editare -> Refactorare -> Modificare la sintaxa Modern Objective-C.
Procesul de migrare a codului Objective-C la Swift
Cea mai eficientă abordare pentru a converti o aplicație completă Objective-C în Swift este, pentru început, o clasă la un moment dat, în special o clasă fără nicio subclasă, deoarece nu puteți subclasa clasele Swift în Obj-C.
Înlocuiți fișierele .m și .h aferente clasei cu un singur fișier .swift. Cu aceasta, totul, de la interfață până la implementare, va intra automat în fișierul Swift. În plus, nu trebuie să creați un fișier antet, deoarece Xcode generează automat un antet, dacă este necesar.
Proiectarea unui fișier de antet de legătură
Când adăugați primul fișier .swift, veți găsi o solicitare ca cea prezentată mai jos.

Faceți clic pe opțiunea „ Creați antet de legătură”.
Un ghid pas cu pas
1. Alegeți o pereche de fișiere .h și .m pe care doriți să le convertiți în Swift. Dacă doriți să convertiți întregul proiect, lăsați clasa AppDelegate pentru mai târziu.
2. Căutați #import „MyViewController.h” în tot codul și eliminați-l din fișierul antet de legătură Objective-C ([MyProject]-Bridging-Header.h).
3. Înlocuiți cazurile de #import „[filename].h” cu #import „[MyProject]-Swift.h” în toate fișierele .m și puneți @class [filename] în loc de #import „[filename].h” în toate fișierele .h.
4. Transformați partea din fișierele Obj-C în Swift. Acest lucru se poate face cu ușurință folosind extensia Finder a „Swiftify for Xcode”. În caz contrar, copiați conținutul fișierelor .m și .h în .swift și utilizați opțiunea „Convertire fișier în Swift” disponibilă în extensia Swiftify Xcode.
5. Înlocuiți fișierele .h și .m cu fișierele .swift convertite în proiect.
6. Compilați proiectul și remediați erorile de conversie. Deși multe probleme vor fi gestionate cu ușurință folosind sugestiile de remediere automată Xcode, vă puteți baza și pe Swiftify pentru a raporta și a remedia erorile care apar de mai multe ori în proiect.
7. Odată terminat, construiți și rulați proiectul. Dacă apare problema „Class not Found” urmată de blocare, găsiți toate referințele la aceasta în Editorul Storyboard. Reintroduceți numele clasei în Identity Inspector, salvați și încercați din nou.
8. Dacă convertiți întregul proiect, puteți transforma clasa AppDelegate acum. În acest moment, toate celelalte fișiere au fost convertite în Swift și, prin urmare, dacă nu mai există fișiere Obj-C în țintă, puteți șterge cu ușurință fișierul main.m și .pch (antet precompilat).
Ce practică preferați – creați o nouă aplicație iOS în Swift de la zero sau convertiți complet Objective-C în Swift? Împărtășiți-vă opiniile prin secțiunea de comentarii de mai jos.
