Există o mulțime de tipuri de date, iar Swift le tratează pe toate în mod individual. Deja am văzut unul dintre cele mai importante tipuri când am alocat niște text unei variabile, dar în Swift se numește String
(șir) – literalmente un șir de caractere.
Șirurile pot fi lungi (de ex. șiruri de un milion de litere), scurte (de ex. șiruri de 10 litere) sau chiar și goale (fără litere), nu contează: toate sunt șiruri din punctul lui Swift de vedere, și toate funcționează la fel. Swift știe că variabila name
ar trebui să conțină un șir deoarece i-am atribuit un șir când am creat-o: "Tim McGraw". Dacă am rescrie codul astfel nu ar mai funcționa:
var name
name = "Tim McGraw"
De data asta Xcode ne va arăta un mesaj de eroare care nu prea are sens încă: "Type annotation missing in pattern". Ce vrea să spună este "Nu pot să îmi dau seama ce tip de date este name
deoarece nu îmi dai destule informații".
În acest punct avem două opțiuni: fie creăm o variabilă și îi dăm o valoare inițială într-un singur rând, fie folosim ceea ce se numește "type annotation", atunci când îi spunem lui Swift ce tip de date va conține variabila mai târziu, chiar dacă nu îi atribuim o valoare chiar acum.
Deja am văzut cum arată prima opțiune, așa că ne vom concentra pe a doua: type annotations. Știm că name
va fi un șir, putem scrie asta în Swift folosind două puncte si apoi String
, astfel:
var name: String
name = "Tim McGraw"
În proiectele reale – spre deosebiere de playground-uri – asta merge destul de bine deoarece Swift știe ce tip de date va conține name
în viitor. Playground-urile sunt un caz mai special, deci încă vom vedea o eroare.
Notă: unor persoane le place să adauge un spațiu înainte si după două puncte, astfel: var name : String
, dar greșesc și ar fi bine să încercăm să nu mentionăm greșala într-o companie politicoasă.
Morala este că Swift mereu vrea să știe ce tip de date va conține fiecare variabilă sau constantă. Mereu. Nu putem scăpa de asta, și asta e un lucru bun, pentru că oferă ceea ce se numește "type safety" – dacă spunem "asta va conține un șir" iar apoi, mai târziu, punem un iepure acolo, Swift va refuza.
Putem încerca asta acum introducând un alt tip de date important numit Int, care este o prescurtare a cuvântului "integer". Int-urile sunt numere întregi cum ar fi 3, 30, 300, sau -16777216. De exemplu:
var name: String
name = "Tim McGraw"
var age: Int
age = 25
Aici am declarat o variabilă de tip șir și una de tip întreg. De observat este faptul că și String
și Int
încep cu majusculă, spre deosebire de name
și age
– aceasta este convenția standard de a coda în Swift. O convenție de codare este ceva care nu contează pentru Swift în sine (putem să alegem și să scriem ce nume vrem!) dar contează pentru ceilalți dezvoltatori. În cazul de mai sus, tipurile de date încep cu majusculă, în timp ce variabilele și constantele nu.
Acum că avem variabile de două tipuri diferite, putem vedea type safety în acțiune. Încearcă să scrii:
name = 25
age = "Tim McGraw"
În codul de mai sus încercăm să punem un întreg într-o variabilă de tip șir și un șir într-o variabilă de tip întreg – și, din fericire, Xcode va arunca erori. Ai putea crede că este cam exagerat dar, de fapt, e chiar de ajutor: faci o promisiune că o variabilă va conține un anumit tip de date, iar Xcode îți impune asta pe tot parcursul programului.
Înainte să trecem mai departe, te rog să ștergi cele două linii de cod care cauzează eroarea, altfel nimic din playground nu va mai funcționa de aici încolo!
Hai să aruncăm o privire la alte două tipuri de date numite Float
și Double
. Acestea sunt modul lui Swift de a stoca numere cu o componentă fractorială, cum ar fi 3,1, 3,141, 3,1415926, și -16777216,5. Există două tipuri de date pentru a face acest lucru deoarece avem posibilitatea de a alege cât de multă acuratețe dorim, dar în majoritatea cazurilor nu contează așa că recomandarea oficială Apple este să folosim întotdeauna Double
pentru că are cea mai mare acuratețe.
Încearcă să scrii asta în playground:
var latitude: Double
latitude = 36.166667
var longitude: Float
longitude = -86.783333
Putem vedea ambele numere apărând în partea dreaptă, dar dacă ne uităm cu atenție putem observa că există o mică discrepanță. Am spus că longitude
ar trebui să fie egal cu -86,783333, dar în panoul de rezultate va apărea -86,78333 – îi lipsește un 3 de la coadă. Am putea spune "ce mai contează un 0,000003 între prieteni?" dar asta demonstrează ce am vrut să spun mai sus când m-am referit la acuratețe.
Pentru că playground-ul se actualizează în timp ce scriem, putem experimenta pentru a vedea exact cum diferă Float
de Double
. Încearcă să schimbi codul cu acesta:
var longitude: Float
longitude = -86.783333
longitude = -186.783333
longitude = -1286.783333
longitude = -12386.783333
longitude = -123486.783333
longitude = -1234586.783333
Aici adăugăm din ce în ce mai multe cifre înainte de virgulă în timp ce menținem același număr ce cifre după virgulă. Dar dacă aruncăm o privire la panoul de rezultate putem observa că în timp ce adăugăm cifre înainte de virgulă, Swift șterge cifre de după virgulă. Asta se întâmlpă pentru că există un spațiu limitat în care putem să ne stocăm numărul, așa că Swift prioretizează stocarea parții mai importante – să avem o eroare de 1.000.000 este imens, în timp ce o eroare de 0,000003 nu prea înseamnă nimic.
Acum hai să schimbăm Float
-ul într-un Double
și vom vedea că Swift printează numărul corect de fiecare dată:
var longitude: Double
Din nou, asta se întâmplă deoarece un Double
are acuratețea de două ori mai mare decât un Float
, deci nu trebuie să taie din număr pentru a încăpea. Double
-urile au totuși limite – dacă am încerca cu un număr masiv cum ar fi 123456789,123456789 vom observa că este rotunjit la 123456789,12345679.
Swift are incorporat un tip de date care poate să stocheze dacă o valoare este adevărată sau falsă și se numește Bool
. Acesta nu are spațiu pentru "poate" sau "probabil", ci numai pentru adevăruri absolute: adevărat sau fals (true
sau false
). De exemplu:
var stayOutTooLate: Bool
stayOutTooLate = true
var nothingInBrain: Bool
nothingInBrain = true
var missABeat: Bool
missABeat = false
După cum am văzut, există două moduri de a-i spune lui Swift ce tip de date poate conține o variabilă: prin atribuirea unei valori când creăm variabila sau prin folosirea unui type annotation. Dacă avem opțiunea de a alege, prima este întotdeauna varianta preferată pentru că este mai clară. De exemplu:
var name = "Tim McGraw"
…este de preferat în locul:
var name: String
name = "Tim McGraw"
Asta se aplică tuturor tipurilor de date. De exemplu:
var age = 25
var longitude = -86.783333
var nothingInBrain = true
Această tehnică este numită type inference (inferarea tipului de date), deoarece Swift poate să infere ce tip de date ar trebui folosit pentru o variabilă uitându-se la tipul de date pe care vrei să îl atribui variabilei. Când vine vorba de numere cum ar fi -86,783333, Swift intotdeauna va infera un Double
decât un Float
.
De dragul completitudinii trebuie să adaug că este posibil să specificăm tipul de date și, în același timp, să oferim o valoare, astfel:
var name: String = "Tim McGraw"
SAVE 50% To celebrate WWDC23, all our books and bundles are half price, so you can take your Swift knowledge further without spending big! Get the Swift Power Pack to build your iOS career faster, get the Swift Platform Pack to builds apps for macOS, watchOS, and beyond, or get the Swift Plus Pack to learn advanced design patterns, testing skills, and more.
Link copied to your pasteboard.