Le enumerazioni sono uno schema di progettazione comune in molti linguaggi di programmazione. Anche se puoi avere familiarità con le enumerazioni in C e Objective-C, l'implementazione delle enumerazioni di Swift è significativamente più potente e flessibile. In questo suggerimento rapido, imparerai cosa c'è di speciale nelle enumerazioni in Swift, come utilizzarle nei tuoi progetti e cosa li rende così potenti.
Le enumerazioni non sono nuove e non sono certamente uniche per Swift. Tuttavia, se hai familiarità con le enumerazioni in C, allora amerai la potente interpretazione di Swift sulle enumerazioni.
Se enumerazioni o enumerazioni sono nuove per te, allora potresti non avere familiarità con ciò che hanno da offrire. In Swift, le enumerazioni sono tipi di prima classe che definiscono un elenco di possibili valori per quel tipo.
Un esempio potrebbe essere il possibile stato di una connessione di rete. Gli stati possibili potrebbero essere:
Potremmo aggiungere un quarto stato per il caso in cui lo stato è sconosciuto. Tenendo presente questo esempio, vediamo come definire e implementare tale enumerazione.
Come ho detto, le enumerazioni sono di prima classe in Swift. Una definizione di enumerazione sembra molto simile a una definizione di classe o struttura. Nell'esempio seguente, definiamo il ConnectionState
enumerazione.
enum ConnectionState
Il nome dell'enumerazione è preceduto dal enum
parola chiave e seguito da un paio di parentesi graffe. Il ConnectionState
l'enumerazione definirà i possibili stati di una connessione di rete. Per definire questi stati, aggiungiamo valori dei membri o membri alla definizione dell'enumerazione. La definizione di un valore membro inizia sempre con Astuccio
parola chiave.
enum ConnectionState case Caso sconosciuto Caso disconnessione Caso di connessione Connected
In C o Objective-C, l'enumerazione di cui sopra sarebbe un po 'diversa come illustrato nell'esempio seguente. Ad esempio, ogni valore dell'enumerazione corrisponde a un numero intero, ConnectionStateUnknown
è uguale a 0
, ConnectionStateDisconnected
è uguale a 1
, eccetera.
typedef enum: NSUInteger ConnectionStateUnknown, ConnectionStateDisconnected, ConnectionStateConnecting, ConnectionStateConnected ConnectionState;
Questo non è vero in Swift. I membri di un'enumerazione non corrispondono automaticamente a un valore intero. I membri del ConnectionState
l'enumerazione sono valori stessi e sono di tipo ConnectionState
. Ciò rende il lavoro con le enumerazioni più sicuro e più esplicito.
È possibile specificare esplicitamente i valori dei membri di un'enumerazione. Nell'esempio seguente, i membri del ConnectionState
l'enumerazione ha un valore grezzo di tipo Int
. A ogni membro viene assegnato un valore non elaborato, corrispondente a un numero intero.
enum ConnectionState: Int case Unknown = -1 case Disconnected = 0 case Connecting = 1 case Connected = 2
Si noti che specifichiamo il tipo di valori non elaborati nella definizione dell'enumerazione e che nessun valore di due membri può avere lo stesso valore non elaborato. Se si specifica solo un valore per il Sconosciuto
membro, quindi Swift aumenterà automaticamente il valore di Sconosciuto
membro e assegnare valori univoci agli altri membri dell'enumerazione. Per meglio illustrarlo, l'esempio seguente è identico alla precedente definizione di ConnectionState
enumerazione.
enum ConnectionState: Int caso Unknown = -1 caso Disconnected case Connecting case Connected
Usando il ConnectionState
l'enumerazione è simile all'utilizzo di qualsiasi altro tipo in Swift. Nel prossimo esempio, dichiariamo una variabile, ConnectionState
, e impostare il suo valore a ConnectionState.Connecting
.
var connectionState = ConnectionState.Connecting
Il valore di ConnectionState
è ConnectionState.Connecting
e la variabile è di tipo ConnectionState
.
L'inferenza di tipo di Swift è molto comoda quando si lavora con le enumerazioni. Perché abbiamo dichiarato ConnectionState
come di tipo ConnectionState
, ora possiamo assegnare un nuovo valore usando la sintassi del punto stenografico per le enumerazioni.
connectionState = .Connected
Utilizzando le enumerazioni in un Se
o interruttore
la dichiarazione è semplice. Ricordatelo interruttore
le dichiarazioni devono essere esaustive. Aggiungere un predefinito
caso se necessario.
enum ConnectionState caso Caso sconosciuto Caso disconnessione Caso di connessione Connesso var connectionState = ConnectionState.Connecting connectionState = .Connected switch connectionState case .Disconnected: println ("Disconnected") case .Connecting: println ("Connecting") case. Connected: println ("Connesso") predefinito: println ("Stato sconosciuto")
Il seguente esempio dimostra come ConnectionState
enum può essere usato. Mostra anche come accedere al valore associato di un membro enum. Il canConnect
la funzione accetta a ConnectionState
istanza e restituisce a Bool
.
func canConnect (connectionState: ConnectionState) -> Bool var result = false switch connectionState case. Connected (let port): if port == 3000 result = true default: result = false risultato restituito let state = ConnectionState. Connesso (3000) se canConnect (stato) // ...
Il canConnect
la funzione restituisce solo vero
se la ConnectionState
l'istanza passata alla funzione è uguale a .Collegato
e il suo valore associato è un Int
uguale a 3000
. Si noti che il valore associato di Collegato
membro è disponibile nel interruttore
affermazione come una costante chiamata porta
, che possiamo quindi utilizzare nel corrispondente Astuccio
.
Un'altra caratteristica interessante delle enumerazioni di Swift sono valori associati. Ogni membro di un enum può avere un valore associato. I valori associati sono molto flessibili. Ad esempio, i valori associati di membri diversi della stessa enumerazione non devono necessariamente essere dello stesso tipo. Dai un'occhiata al seguente esempio per capire meglio il concetto di valori associati.
enum ConnectionState case Caso sconosciuto Caso disconnesso Caso di connessione (Int, Double) Connected (Int)
Il Sconosciuto
e scollegato
i membri non hanno un valore associato. IlCollegamento
membro ha un valore associato di tipo (Int, doppio)
, specificando il numero di porta e l'intervallo di timeout della connessione. Il Collegato
membro ha un valore associato di tipo Int
, specificando il numero di porta.
È importante capire che un valore associato è collegato o associato a un membro dell'enumerazione. Il valore del membro rimane invariato. Il prossimo esempio illustra come creare un ConnectionState
istanza con un valore associato.
var connectionState = ConnectionState.Connecting (3000, 30.0)
Le enumerazioni sono piuttosto potenti in Swift. Le enumerazioni possono anche definire metodi, come un inizializzatore per selezionare un valore membro predefinito se non ne è stato specificato nessuno.
enum ConnectionState case Caso sconosciuto Caso disconnesso Caso di connessione (Int, Double) Connected (Int) init () self = .Unknown var connectionState = ConnectionState () // .Unknown
In questo esempio, inizializziamo un'istanza di ConnectionState
enumerazione senza specificarne esplicitamente un valore. Nell'inizializzatore dell'enumerazione, tuttavia, impostiamo l'istanza su Sconosciuto
. Il risultato è che il ConnectionState
la variabile è uguale a ConnectionState.Unknown
.
Come le strutture, le enumerazioni sono tipi di valore, il che significa che un'enumerazione non viene passata per riferimento, come le istanze di classe, ma per valore. Il seguente esempio illustra questo.
var connectionState1 = ConnectionState () var connectionState2 = connectionState1 connectionState1 = .Connected (1000) println (connectionState1) //. Connected (1000) println (connectionState2) // .Unknown
Anche se assegniamo connectionState1
a connectionState2
, i valori di connectionState1
e connectionState2
sono diversi alla fine dell'esempio.
quando connectionState1
è assegnato a connectionState2
, Swift crea una copia di connectionState1
e lo assegna a connectionState2
. In altre parole, connectionState1
e connectionState2
fare riferimento a due diversi ConnectionState
casi.
Enums in Swift è incredibilmente potente rispetto, ad esempio, alle enumerazioni in C. Uno degli aspetti più potenti delle enumerazioni è che sono dei tipi di prima classe in Swift. Digitare la sicurezza è un aspetto chiave del linguaggio Swift e le enumerazioni si inseriscono perfettamente in quella mentalità.