Sfat rapid Enumerări în Swift

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.

1. Ce este o enumerare?

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:

  • decuplat
  • conectarea
  • conectat

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.

Elementele de bază

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.

Valorile crude

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

2. Lucrul cu enumerările

Inițializarea

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

Control Flow

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.

3. Valorile asociate

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)

4. Metode și tipuri de valori

metode

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.

Tipuri de valori

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.

Concluzie

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.

Cod