Swift este o mamă și are doi fii? –

  • Tipul valorii ?? ‍♀️
  • Tipul de referință? ‍♂️

Dar care sunt caracteristicile lor ?? ‍♂️

Se comportă la fel sau opus unul față de celălalt? ? ‍♂️

Swift este un limbaj de programare multi-paradigmă dezvoltat de Apple pentru iOS, macOS, watchOS, tvOS, Linux și z / OS.?

La fel ca alte limbaje de programare orientate pe obiecte, Swift are clase ca elemente de bază care pot defini metode, proprietăți, inițializatoare și se pot conforma protocoalelor, suportă moștenirea și polimorfismul.

Dar, așteaptă, așteaptă …

Swift are structuri și poate defini metode, proprietăți, inițializatoare și se poate conforma protocoalelor cu o singură excepție de moștenire.?

Ce? Acum sunt confuz !!! ???

Acum, să vă condimentăm confuzia: structurile nu sunt doar tipurile de valori din Swift. Tuplurile și enumurile sunt, de asemenea, tipuri de valori. De asemenea, clasele nu sunt singurele utilizate ca tip de referință. Funcțiile și închiderile sunt, de asemenea, tipuri de referință. Dar, ca semn de ușurare, știm cel puțin accentul principal și specializarea utilizării acestor tipuri.?

Deci, până în acest moment, rămânem cu o singură mare confuzie cu utilizarea structurilor și claselor.?

Deci, să mergem și să ștergem confuziile care se întâmplă .?‍♂️

Locații de stocare

Există trei tipuri de stocare disponibile:

  • Inregistreaza-te ?
  • Stiva ☄️
  • Heap?

Obiectele care au o durată de viață mai scurtă sunt stocate în registre sau stivă și cele care au o durată de viață mai lungă sunt stocate în interiorul heap-ului.?

Un tip de valoare își stochează conținutul în memoria alocată în stivă, deci putem spune că tipurile de valori sunt alocate în stiva în Swift. ?

Dar există o concepție greșită obișnuită despre tipurile de valori, ați auzit-o ?? ‍♂️

Concepția greșită este că majoritatea oamenilor cred că tipurile de valori sunt întotdeauna stocate în stivă.

❌❌ Așteptați un minut – nu este întotdeauna cazul. ❌❌

Tipurile de valori pot fi stocate în interiorul stivei atunci când sunt variabile temporare sau locale. Dar dacă un tip de valoare este conținut într-un tip de referință?

În această situație, poate fi stocat în memoria heap. ?

Uau, este tare!!!?

Astfel, tipurile de valori pot fi stocate în registru, stivă sau grămadă în funcție de durata lor de viață, indiferent dacă sunt de scurtă durată sau de lungă durată. Dacă este o variabilă locală, poate trăi în stivă și, dacă face parte din clasă, poate trăi și în memoria heap.

Pe de altă parte, tipul de referință își stochează conținutul în memoria alocată în memoria heap și variabila conține doar o referință la acea locație de memorie în care au fost stocate datele reale. ??

Cum funcționează pentru tipul de referință ??

Deci, pentru tipul de referință, este o situație destul de obișnuită când pot exista mai multe variabile care dețin referința la aceeași locație de memorie

Când o instanță de tip valoare este atribuită unei variabile sau transmisă unei funcții, instanța este copiată și atribuită acelei variabile. Dar cu tipul de referință, doar referința este copiată, iar noua variabilă deține aceeași referință la aceeași locație de memorie. ?

Diferențe în ceea ce privește mutabilitatea

Pot exista două stări pentru o variabilă:

  • ? ‍♀ ️Mutabil? ‍♀
  • ? ️‍♂️ Imuabil? ️‍♂️

Dacă o instanță de tip valoare este atribuită unei variabile imuabile, atunci instanța devine, de asemenea, imuabilă. Drept urmare, nu putem aduce modificări instanței respective .?‍♂️

Dacă o instanță de tip valoare este atribuită unei variabile modificabile, atunci numai aceasta face instanța mutabilă. ? ‍♂️

Dar lucrurile sunt total diferite pentru tipurile de referință. Variabila și instanța la care este atribuită sunt total diferite. Dacă declarăm o variabilă imuabilă care deține o referință la o clasă, aceasta înseamnă că referința pe care o deține nu se va schimba niciodată. Nu putem schimba referința și va indica întotdeauna aceeași referință. ?

Tipuri structurale

Valorile tipurilor structurale sunt comparate pentru egalitate în ceea ce privește atributele sau elementele lor. Putem spune că un tip de valoare este egal cu altul dacă și numai dacă toate atributele corespunzătoare sunt egale. ???

Umm … prea multe cuvinte puternice … la ce te referi ???

Să spunem că avem un Persoană tip de valoare care are atribute precum Nume și numele de familie.

struct Person {
   var firstName: String
   var lastName: String
}

var person1 = Person(firstName: "foo", lastName: "bar")

var person2 = Person(firstName: "foo", lastName: "bar")

Aici amândouă persoana1 & persoana2 instanțele dețin aceeași valoare pentru Nume („Foo”) și prenume („bară”). Deci, conform înțelegerii noastre, putem spune că cele două instanțe sunt egale între ele, deoarece atributele lor (Nume & numele de familie) dețin aceleași valori.

Dar nu se limitează doar la acest lucru: în viitor, orice instanță de două persoane care deține aceleași valori pentru Nume & numele de familie vor fi egale între ele.

Deci, conform înțelegerii noastre până în acest moment, putem spune că:

Tipurile de valori nu au identitate, deci nu poate exista nicio referire la acestea. Tipurile de valori sunt fără chip.?

Ce? Cum poți spune că????

var myAge: Int = 21
var friendAge: Int = 21

Ambii vârsta mea & friendAge sunt variabile de tip întreg cu valoarea 21.

Putem distinge una de alta? ?

Nu, pentru că dețin aceeași valoare.?

O variabilă întreagă cu valoarea 21 nu poate fi diferită de o altă variabilă întreagă care are, de asemenea, valoarea 21. La fel de simplă ca asta. ???

Neavând o identitate oferă tipurilor de valoare un alt avantaj: dacă te gândești practic, îți poți imagina dacă nu ai o identitate, atunci oricine cu aceleași caracteristici te poate înlocui sau înlocui. ???

La fel putem gândi și pentru noi, ca și oameni. Dacă nu am o identitate, oricine cu aceleași caracteristici mă poate înlocui ???. Este bine pentru noi că avem o identitate, altfel ar fi un mare risc pentru existența noastră.?

Dar pentru tipurile de valoare, acestea nu au o identitate și este un avantaj pentru ei. ?

Care sunt avantajele utilizării tipurilor de valori?

? Fără condiții de cursă și blocaje:?

Pentru tipurile de valori dintr-un mediu multi-thread, este imposibil ca un thread să mute starea instanței în timp ce este utilizat de un alt thread. Deci, putem spune că nu vor exista condiții de cursă sau blocaje.

⚔️ Fără cicluri de reținere: ⚔️

Când există două instanțe de tip referință care păstrează referințe puternice între ele și care împiedică reciproc să fie alocate din memorie, se numește ciclu de reținere. Deoarece tipurile de valori nu funcționează ca referință, putem spune că nu vor exista cicluri de reținere pentru tipurile de valori.

?‍?‍?‍? Numărare automată a referințelor: ?‍?‍?‍?

Pentru tipul de referință, Swift folosește numărarea automată a referințelor pentru a ține evidența tuturor obiectelor active sau active și alocă instanța numai atunci când nu mai există referințe puternice la aceasta. Dacă ne gândim puțin, atunci putem spune că este un fel de operație grea, deoarece timpul de rulare Swift trebuie să țină evidența obiectelor întotdeauna. Dar, deoarece tipurile de valori sunt alocate în stivă, nu are nevoie de ARC. Deci este mai ieftin și mai rapid ??.

Dar așteaptă … Cum gestionează memoria pentru matrice, dicționar și șir ??

Deoarece nu putem ști care va fi dimensiunea reală a unui tablou, a unui dicționar și a unui șir la momentul compilării, nu există nicio posibilitate pentru a fi alocate la momentul compilării. Deși sunt tipuri de valori pe plan intern, ele nu pot fi alocate în stivă. Trebuie să fie alocați în memoria heap și, pentru a gestiona acest lucru, Swift vine cu Copie pe scriere.?

Dar ce este asta ??

Când spunem că o instanță este o copie a unei alte instanțe, acest lucru înseamnă într-adevăr că sunt aceleași, că conțin aceleași valori. Dar în Swift, pentru aceste tipuri de mai sus (Array, Dictionary, String, etc), o copie reală a fost făcută în heap numai atunci când o instanță este mutată. Aceasta se numește o tehnică de optimizare a performanței pentru tipurile de valori. ???

Concluzie

Nu există o regulă dificilă care să definească când să se utilizeze tipul de valoare și când să se utilizeze tipul de referință. Tipurile de valori au unele avantaje unice față de tipurile de referință și invers. Amândoi sunt unici în felul lor. Depinde într-adevăr de cerințele dvs. și de ceea ce încercați să realizați. Ar trebui să cunoașteți semantica codului dvs., deoarece știți cel mai bine codul dvs., deci depinde de dvs. să alegeți. Ai libertatea deplină.

Deci, mai degrabă decât să lupți pentru tipul de valoare față de tipul de referință, folosește-le inteligent.

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

✅✅✅Mă poți găsi Stare de nervozitate.✅✅✅