Enumerările reprezintă un model comun de design în multe limbi de programare. Deși este posibil să fiți familiarizați cu enumerările în C și Obiectiv-C, implementarea de enumerări de către Swift este semnificativ mai puternică și mai flexibilă. În acest sfat rapid, veți afla ce este special despre enumerările din Swift, cum să le utilizați în proiectele dvs. și ceea ce le face atât de puternice.
Enumerările nu sunt noi și cu siguranță nu sunt unice pentru Swift. Cu toate acestea, dacă sunteți familiarizați cu enumerările în C, atunci veți plăcea să luați puterile lui Swift asupra enumerărilor.
În cazul în care enums sau enumerations sunt noi pentru tine, atunci este posibil să nu fiți familiarizați cu ceea ce au de oferit. În Swift, enumerările sunt tipuri de primă clasă care definesc o listă de valori posibile pentru acel tip.
Un exemplu ar putea fi stările posibile ale unei conexiuni de rețea. Posibilele stări ar putea fi:
Am putea adăuga o a patra stare pentru cazul în care statul nu este cunoscut. Având în vedere acest exemplu, să vedem cum să definim și să implementăm o astfel de enumerare.
Cum am spus, enumerările sunt de primă clasă în Swift. O definiție de enumerare pare foarte asemănătoare cu o definiție de clasă sau de structură. În exemplul de mai jos, definim ConnectionState
enumerare.
enum ConnectionState
Numele enumerării este precedată de enum
cuvânt cheie și urmată de o pereche de bretele curry. ConnectionState
enumerarea va defini stările posibile ale unei conexiuni de rețea. Pentru a defini aceste stări, adăugăm membre sau membrii la definiția enumerării. Definiția valorii unui membru începe întotdeauna cu caz
cuvinte cheie.
enum ConnectionState caz necunoscut caz deconectat caz conectat conectat
În C sau Obiectiv-C, enumerarea de mai sus ar arăta un pic diferită, așa cum este ilustrat în exemplul de mai jos. Fiecare valoare a enumerării corespunde, de exemplu, cu un număr întreg, ConnectionStateUnknown
este egală 0
, ConnectionStateDisconnected
este egală 1
, etc.
typedef enum: NSUInteger ConnectionStateUnknown, ConnectionStateDisconnected, ConnectionStateConnecting, ConnectionStateConnected ConnectionState;
Acest lucru nu este valabil în Swift. Membrii unei enumerări nu corespund automat unei valori întregi. Membrii ConnectionState
enumerarea sunt valori în sine și ele sunt de tip ConnectionState
. Acest lucru face lucrul cu enumerările mai sigure și mai explicite.
Este posibil să specificăm explicit valorile membrilor unei enumerări. În exemplul următor, membrii ConnectionState
enumerarea are o valoare brută de tip Int
. Fiecărui membru îi este atribuită o valoare brută, corespunzătoare unui număr întreg.
enum ConnectionState: Int caz necunoscut = -1 caz deconectat = 0 caz conectare = 1 caz conectat = 2
Rețineți că specificăm tipul de valori brute în definiția enumerării și că nici două valori ale membrilor nu pot avea aceeași valoare brută. Dacă specificăm doar o valoare pentru Necunoscut
membru, Swift va crește automat valoarea lui Necunoscut
membru și atribuie valori unice celorlalți membri ai enumerării. Pentru a ilustra mai bine acest lucru, exemplul de mai jos este identic cu definiția anterioară a ConnectionState
enumerare.
enum ConnectionState: Int caz necunoscut = -1 caz caz deconectat caz conectat conectat
Utilizarea ConnectionState
enumerarea este similară cu utilizarea oricărui alt tip în Swift. În următorul exemplu, declarăm o variabilă, connectionState
, și setați valoarea acestuia ConnectionState.Connecting
.
var connectionState = ConnectionState.Connectați
Valoarea a connectionState
este ConnectionState.Connecting
iar variabila este de tip ConnectionState
.
Inferența de tip Swift este foarte convenabilă atunci când lucrați cu enumerări. Pentru că am declarat connectionState
ca fiind de tip ConnectionState
, acum putem atribui o nouă valoare folosind sintaxa punctului stenoid pentru enumerări.
connectionState =. Conectat
Folosirea enumerărilor într-un dacă
sau intrerupator
declarația este simplă. Sa nu uiti asta intrerupator
declarațiile trebuie să fie exhaustive. Adauga o Mod implicit
caz dacă este necesar.
enum ConnectionState caz necunoscut Caz deconectat Caz conectabil Conectat var conexiuneState = conexiuneState.Connectare conexiuneState = .Connector de conectareStat caz .Disconnected: caseta println ("Deconectat") .Connect: caseta println ("Conectare" (Implicit "Connected"): println ("State Unknown")
Următorul exemplu demonstrează modul în care ConnectionState
enum poate fi utilizat. Acesta arată, de asemenea, modul de accesare a valorii asociate unui membru enum. canConnect
funcția acceptă a ConnectionState
instanță și returnează a bool
.
func canConnect (linkState: ConnectionState) -> Bool var rezultat = conexiune false switchState case .Connected (let port): if port == 3000 result = true Conectat (3000) dacă canConnect (state) // ...
canConnect
funcția revine numai Adevărat
dacă ConnectionState
instanța trecută la funcție este egală cu .Conectat
și valoarea asociată acesteia este un Int
egal cu 3000
. Rețineți că valoarea asociată a Conectat
membru este disponibil în intrerupator
declarație ca o constantă numită port
, pe care le putem folosi apoi în cele corespunzătoare caz
.
O altă caracteristică convingătoare a enumerărilor Swift sunt valorile asociate. Fiecare membru al unui enum poate avea o valoare asociată. Valorile asociate sunt foarte flexibile. De exemplu, valorile asociate ale diferiților membri ai aceluiași enum nu trebuie să fie de același tip. Uitați-vă la următorul exemplu pentru a înțelege mai bine conceptul de valori asociate.
enum ConnectionState caz necunoscut Caz deconectat Conectare (int, dublu) caz Connected (Int)
Necunoscut
și debreiat
membrii nu au o valoare asociată.conectarea
membrul are o valoare asociată de tip (Int, Dublu)
, specificând numărul portului și intervalul de timp al conexiunii. Conectat
membrul are o valoare asociată de tip Int
, specificând numărul portului.
Este important să înțelegeți că o valoare asociată este asociată sau asociată cu un membru al enumerării. Valoarea membrului rămâne neschimbată. Următorul exemplu ilustrează cum să creați un ConnectionState
instanță cu o valoare asociată.
var conexiuneState = conexiuneState.Connectare (3000, 30.0)
Enumerările sunt destul de puternice în Swift. Enumerările pot chiar să definească metode, cum ar fi un inițializator pentru a selecta o valoare implicită a membrului dacă nu a fost specificat niciunul.
enum ConnectionState caz Caz necunoscut Caz deconectat Caz conectare (int, dublu) Conectat (int) init () self = .Unknown var connectionState = ConnectionState
În acest exemplu, inițializăm o instanță a ConnectionState
enumerare fără a specifica în mod explicit o valoare pentru aceasta. În inițializatorul enumerării, cu toate acestea, am setat instanța la Necunoscut
. Rezultatul este că connectionState
variabila este egală cu ConnectionState.Unknown
.
Ca și structuri, enumerările sunt tipuri de valori, ceea ce înseamnă că o enumerare nu este trecută prin referință, cum ar fi instanțele de clasă, ci prin valoare. Următorul exemplu ilustrează acest lucru.
var conexiuneState1 = ConnectionState () conexiune varState2 = conexiuneState1 conexiuneState1 = .Connected (1000) println (connectionState1) //.Connected (1000) println (connectionState2) // .Unknown
Chiar dacă atribuim connectionState1
la connectionState2
, valorile lui connectionState1
și connectionState2
sunt diferite la sfârșitul exemplului.
Cand connectionState1
este alocat connectionState2
, Swift creează o copie a lui connectionState1
și atribuie asta connectionState2
. Cu alte cuvinte, connectionState1
și connectionState2
se referă la două diferite ConnectionState
instanțe.
Enums in Swift sunt incredibil de puternice în comparație cu, de exemplu, enums în C. Unul dintre cele mai puternice aspecte ale enumerărilor este că ele sunt de primă clasă în Swift. Siguranța tipului este un aspect cheie al limbajului Swift și enumerările se potrivesc perfect în acel tip de mentalitate.