UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

Tipuri de Date

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!

Float și Double

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.

În Swift un Float are o capacitate mult mai mică decât un Double, așa că e bine să folosim Double pe cât posibil.

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.

Boolean

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

Folosing type annotations cu înțelepciune

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"

TAKE YOUR SKILLS TO THE NEXT LEVEL If you like Hacking with Swift, you'll love Hacking with Swift+ – it's my premium service where you can learn advanced Swift and SwiftUI, functional programming, algorithms, and more. Plus it comes with stacks of benefits, including monthly live streams, downloadable projects, a 20% discount on all books, and free gifts!

Find out more

Sponsor Hacking with Swift and reach the world's largest Swift community!

BUY OUR BOOKS
Buy Pro Swift Buy Pro SwiftUI Buy Swift Design Patterns Buy Testing Swift Buy Hacking with iOS Buy Swift Coding Challenges Buy Swift on Sundays Volume One Buy Server-Side Swift Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Advanced iOS Volume Three Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with macOS Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let us know!

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.