În prezent, Swift este una dintre cele mai importante limbi de tip sigur. ???

Ohhh stai !! Ce înseamnă dacă o limbă este sigură pentru tip? ?

Un limbaj sigur de tip asigură întotdeauna că o operațiune funcționează cu tipul corect de date disponibile în acel moment. ✓

Dacă o limbă are capacitatea de a declara diferite tipuri de date (de exemplu, Int, Float, String, Array, Dictionary) și are, de asemenea, capacitatea de a se asigura că o variabilă declarată cu un anumit tip de date nu va avea niciodată un alt tip de date, apoi se numește un limbaj sigur pentru tip.

În limbile de tip sigur, verificarea tipului se face întotdeauna. Se poate întâmpla în timpul compilării sau în timpul rulării, în funcție de limbă.✅

Acum, ce sunt Generics în Swift ??

Genericele sunt sigure pentru tipuri și ne ajută să scriem funcții și tipuri flexibile, reutilizabile. Folosind Generics, putem scrie cod care funcționează pentru toate tipurile de date. Deoarece Swift este un limbaj sigur pentru tip, fără a rupe acest lucru, suntem capabili să scriem coduri generice care pot evita duplicarea codurilor.

Să luăm un exemplu simplu: o matrice este o colecție ordonată care poate conține același tip de date. De aceea, în definiția unui Array, putem vedea că este nevoie de un tip generic de Element. Prin urmare, o matrice devine un tip generic de Colecție.

ad-banner

O.K. Misto. Atunci ce este Orice tip în Swift????

Swift acceptă, de asemenea, orice tip. După cum indică numele, poate reprezenta o instanță de orice tip, cum ar fi struct, clasă, enum și tip de funcție.

Deci sunt Objective C id și Swift’s la fel??

În Swift 3, Obiectivul C id tastați hărți la orice tip de Swift. Acest lucru îmbunătățește compatibilitatea dintre Swift și Objective C.

Dar cum și de ce ??

În Swift 2, Obiectivul C id a fost mapat la obiectul Orice al lui Swift. Acest lucru a funcționat bine pentru majoritatea cazurilor, dar uneori a dus la un comportament neașteptat. Unul dintre conceptele cheie din Swift este tipurile de valori, iar această cartografiere nu făcea justiția corespunzătoare acestui concept.

Swift este doar un nou limbaj pentru dezvoltarea iOS, iar Objective C există de ani de zile. Deci, desigur, majoritatea proiectelor au fost dezvoltate numai în Obiectivul C. Acum, pentru a converti un proiect Objective într-un proiect Swift, a venit cerința că ar trebui să fie posibil să legați orice tip Swift la orice obiect Objective C.

Dar aceasta nu a fost o problemă pentru clasele Swift și tipurile de valori Swift, cum ar fi Int, String, Float, deoarece au deja omologii lor Obiectiv C. Problema a apărut pentru tipurile de valori Swift care nu aveau omologi ai obiectivului C.

Deci, pentru a remedia acest lucru, tipul de identificator Objective C a fost mapat pe tipul Swift Any

Definiții suficiente? Acum să trecem la subiectul principal. După punctele de mai sus, se pare că Generics și Any type sunt aceleași. Dar chiar sunt ???

La un nivel ridicat, Orice poate arăta similar cu Generics. Dar să încercăm să găsim câteva diferențe – ???

Știm cu toții ce Grămadă este în Structuri de date, nu? O stivă este o structură de date liniară de bază în care inserarea și ștergerea articolelor are loc doar la un capăt.

Acum vom implementa structura Stack în Swift. Mai întâi, vom implementa folosind Generics apoi cu tipul Any.

Implementarea stivei folosind generice:

Implementarea Stack de mai sus utilizează Generics. Structura are un tip generic de Element element și implementează o stivă folosind acel element. Acum să facem câteva operații cu Generic Stack:

Se declară o stivă generică care poate conține un tip întreg de element. Împingem elementul întreg la stivă. Până în prezent, totul funcționează excelent.

Dar dacă vreau să împing un element plutitor pe cel de deasupra genericStack?

Sa disecam diferentele dintre Generics si tipul Any din Swift

❌❌ Hopa! Eroare de compilare! ❌❌

Implementarea stivei utilizând tipul Orice:

În această implementare Stack, matricea de articole poate conține orice tip de element. Nu specificăm care va fi tipul exact de date al fișierului obiecte element de matrice în definiție. Acum să facem aceleași operațiuni de bază pe această stivă:

Fără probleme, nu? Totul funcționează bine și aici. Inițial, am declarat o stivă și am împins două elemente întregi în ea. Când apelăm la spectacol() , imprimă matricea exactă [3, 4].

Acum, să împingem o valoare float în ea.☄️

1611549306 679 Sa disecam diferentele dintre Generics si tipul Any din Swift

✅✅ Nicio eroare! Totul merge bine! ✅✅

Deci, ce se întâmplă în culise? De ce nu primim nicio eroare ????

Generics spune în principiu compilatorului că:

Am declarat un tip generic și vă voi oferi un tip exact mai târziu. Vreau să aplicați acest tip oriunde specific.

Tipul Any spune practic compilatorului:

Nu vă faceți griji cu privire la această variabilă, nu este nevoie să aplicați niciun tip aici, lăsați-mă să fac tot ce vreau să fac.

Genericele pot fi utilizate pentru a defini funcții flexibile, dar tipurile de argumente sunt încă verificate de către compilator. Orice tip poate fi folosit pentru a evita sistemul de tip Swift.?

În declarația generică a stivei, îi spunem compilatorului că stiva ar trebui să ia doar tipul întreg. Atunci când încercăm să introducem un tip flotant de element în el, asta înseamnă că încălcăm această promisiune. Prin urmare, generează o eroare de timp de compilare. Se așteaptă întotdeauna ca elementul să fie de tip întreg.

Dar pentru Any Stack, nu primim nicio eroare de timp de compilare sau de execuție. Chiar dacă numim spectacol() metoda, imprimă stiva ca [3, 4, 5.0] ceea ce înseamnă că stiva deține valori întregi și flotante. Deci, în orice stivă, nu există restricții de tip, putem împinge orice tip de valoare în ea (dar există posibilități de excepții de execuție).

Concluzie

Deci, dacă folosim Generics, putem scrie funcții, structuri, clase și protocoale flexibile fără a compromite siguranța tipului Swift. Dar dacă folosim orice tip, atunci suntem un fel de propriul nostru șef, putem face aproape orice vrem.

??? Noroc!!! Mulțumesc că ai citit !! ???