Suggerimento rapido Enumerazioni in Swift

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.

1. Che cos'è un'enumerazione?

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:

  • scollegato
  • collegamento
  • collegato

Potremmo aggiungere un quarto stato per il caso in cui lo stato è sconosciuto. Tenendo presente questo esempio, vediamo come definire e implementare tale enumerazione.

Nozioni di base

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.

Valori grezzi

È 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

2. Lavorare con le enumerazioni

Inizializzazione

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

Flusso di controllo

Utilizzando le enumerazioni in un Seinterruttore 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.

3. Valori associati

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)

4. Metodi e tipi di valore

metodi

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.

Tipi di valore

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, connectionState1connectionState2 fare riferimento a due diversi ConnectionState casi.

Conclusione

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à.