Opsommingen zijn een algemeen ontwerppatroon in veel programmeertalen. Hoewel je misschien bekend bent met opsommingen in C en Objective-C, is Swift's implementatie van opsommingen aanzienlijk krachtiger en flexibeler. In deze snelle tip leer je wat er speciaal is aan opsommingen in Swift, hoe je ze kunt gebruiken in je projecten en wat hen zo krachtig maakt.
Opsommingen zijn niet nieuw en ze zijn zeker niet uniek voor Swift. Als je echter bekend bent met opsommingen in C, dan zul je Swift's krachtige kijk op opsommingen geweldig vinden.
Als enums of opsommingen nieuw voor je zijn, ben je misschien niet bekend met wat ze te bieden hebben. In Swift zijn opsommingen eerste klastypen die een lijst met mogelijke waarden voor dat type definiëren.
Een voorbeeld kunnen de mogelijke toestanden van een netwerkverbinding zijn. De mogelijke toestanden zouden kunnen zijn:
We zouden een vierde staat kunnen toevoegen voor het geval de staat onbekend is. Laten we met dit voorbeeld in gedachten een dergelijke opsomming definiëren en implementeren.
Zoals ik al zei, opsommingen zijn eerste klas types in Swift. Een opsommingsdefinitie lijkt erg op een klasse- of structuurdefinitie. In het onderstaande voorbeeld definiëren we de ConnectionState
opsomming.
enum ConnectionState
De naam van de opsomming wordt voorafgegaan door de enum
sleutelwoord en gevolgd door een paar accolades. De ConnectionState
opsomming definieert de mogelijke toestanden van een netwerkverbinding. Om deze toestanden te definiëren, voegen we toe lidwaarden of leden naar de opsomming van de definitie. De definitie van een lidwaarde begint altijd met de geval
trefwoord.
enum ConnectionState case Onbekend geval Geen verbinding case Verbonden zaak Verbonden
In C of Objective-C zou de bovenstaande opsomming er een beetje anders uitzien, zoals geïllustreerd in het onderstaande voorbeeld. Elke waarde van de opsomming komt bijvoorbeeld overeen met een geheel getal, ConnectionStateUnknown
is gelijk aan 0
, ConnectionStateDisconnected
is gelijk aan 1
, enz.
typedef enum: NSUInteger ConnectionStateUnknown, ConnectionStateDisconnected, ConnectionStateConnecting, ConnectionStateConnected ConnectionState;
Dit is niet waar in Swift. De leden van een opsomming komen niet automatisch overeen met een geheel getal. De leden van de ConnectionState
opsomming zijn waarden zelf en ze zijn van het type ConnectionState
. Dit maakt het werken met opsommingen veiliger en explicieter.
Het is mogelijk om expliciet de waarden van de leden van een opsomming op te geven. In het volgende voorbeeld, de leden van de ConnectionState
opsomming hebben een onbewerkte waarde van het type Int
. Elk lid krijgt een onbewerkte waarde toegewezen die overeenkomt met een geheel getal.
enum ConnectionState: Int case Unknown = -1 case Disconnected = 0 case Connecting = 1 case Connected = 2
Merk op dat we het type ruwe waarden in de definitie van de opsomming specificeren en dat geen twee lidwaarden dezelfde onbewerkte waarde kunnen hebben. Als we alleen een waarde opgeven voor de Onbekend
lid, dan Swift verhoogt automatisch de waarde van de Onbekend
lid en unieke waarden toewijzen aan de andere leden van de opsomming. Om dit beter te illustreren, is het onderstaande voorbeeld identiek aan de vorige definitie van de ConnectionState
opsomming.
enum ConnectionState: Int case Unknown = -1 case Disconnected case Connecting case Connected
De ... gebruiken ConnectionState
opsomming is vergelijkbaar met het gebruik van een ander type in Swift. In het volgende voorbeeld verklaren we een variabele, connectionState
, en stel de waarde in op ConnectionState.Connecting
.
var connectionState = ConnectionState.Connecting
De waarde van connectionState
is ConnectionState.Connecting
en de variabele is van het type ConnectionState
.
De gevolgtrekking van Swift is erg handig bij het werken met opsommingen. Omdat we hebben verklaard connectionState
als zijnde van het type ConnectionState
, we kunnen nu een nieuwe waarde toewijzen door de stenotypesyntaxis voor opsommingen te gebruiken.
connectionState = .Connected
Opstellingen gebruiken in een als
of schakelaar
verklaring is eenvoudig. Onthoudt dat schakelaar
uitspraken moeten uitputtend zijn. Voeg een ... toe standaard
case indien nodig.
enum ConnectionState case Onbekend geval Verbroken zaak Verbindingsgeval Verbonden var connectionState = ConnectionState.Connecting connectionState =. Verbonden switch connectionState case. Disconnected: println ("Disconnected") case. Aansluiten: println (zaak "Connecting"). Verbonden: println ("Verbonden") standaard: println ("Onbekende staat")
Het volgende voorbeeld laat zien hoe het ConnectionState
enum kan worden gebruikt. Het toont ook hoe toegang te krijgen tot de bijbehorende waarde van een enum-lid. De canConnect
functie accepteert a ConnectionState
exemplaar en geeft a Bool
.
func canConnect (connectionState: ConnectionState) -> Bool var result = false switch connectionState case .Connected (let port): if port == 3000 result = true standaard: result = false retourresultaat let state = ConnectionState. Verbonden (3000) als canConnect (staat) // ...
De canConnect
function only retourneert waar
als het ConnectionState
instantie doorgegeven aan de functie is gelijk aan .Verbonden
en de bijbehorende waarde is een Int
gelijk aan 3000
. Merk op dat de bijbehorende waarde van de Verbonden
lid is beschikbaar in de schakelaar
statement als een constante met de naam haven
, die we dan kunnen gebruiken in de bijbehorende geval
.
Een andere aantrekkelijke eigenschap van Swift-enums zijn bijbehorende waarden. Elk lid van een enum kan een bijbehorende waarde hebben. Bijbehorende waarden zijn erg flexibel. De bijbehorende waarden van verschillende leden van hetzelfde enum hoeven bijvoorbeeld niet van hetzelfde type te zijn. Bekijk het volgende voorbeeld om het concept van bijbehorende waarden beter te begrijpen.
enum ConnectionState case Onbekende case Disconnected case Verbinding maken (Int, Double) case Verbonden (Int)
De Onbekend
en Verbinding verbroken
leden hebben geen bijbehorende waarde. DeAansluiten
lid heeft een bijbehorende waarde van het type (Int, dubbel)
, het poortnummer en time-outinterval van de verbinding opgeven. De Verbonden
lid heeft een bijbehorende waarde van het type Int
, het poortnummer opgeven.
Het is belangrijk om te begrijpen dat een bijbehorende waarde is gekoppeld aan of geassocieerd met een lid van de opsomming. De waarde van het lid blijft ongewijzigd. Het volgende voorbeeld illustreert hoe een a te maken ConnectionState
bijvoorbeeld met een bijbehorende waarde.
var connectionState = ConnectionState.Connecting (3000, 30.0)
Opsommingen zijn behoorlijk krachtig in Swift. Opsommingen kunnen zelfs methoden definiëren, zoals een initialisator om een standaardlidwaarde te selecteren als er geen is opgegeven.
enum ConnectionState case Onbekend geval Verbroken zaak Verbinden (Int, Double) geval Verbonden (Int) init () self = .Unknown var connectionState = ConnectionState () // .Unknown
In dit voorbeeld initialiseren we een exemplaar van de ConnectionState
opsomming zonder expliciet een waarde ervoor op te geven. In de initialisatie van de opsomming stellen we echter de instantie in Onbekend
. Het resultaat is dat de connectionState
variabele is gelijk aan ConnectionState.Unknown
.
Net als structuren zijn opsommingen waardetypes, wat betekent dat een opsomming niet door verwijzing wordt doorgegeven, zoals klasse-instanties, maar door waarde. Het volgende voorbeeld illustreert dit.
var connectionState1 = ConnectionState () var connectionState2 = connectionState1 connectionState1 = .Connected (1000) println (connectionState1) // .Connected (1000) println (connectionState2) // .Unknown
Ook al wijzen we het toe connectionState1
naar connectionState2
, de waarden van connectionState1
en connectionState2
verschillen aan het einde van het voorbeeld.
Wanneer connectionState1
is toegewezen aan connectionState2
, Snel maakt een kopie van connectionState1
en wijst dat toe connectionState2
. Met andere woorden, connectionState1
en connectionState2
verwijzen naar twee verschillende ConnectionState
instanties.
Enums in Swift zijn ongelooflijk krachtig vergeleken met, bijvoorbeeld, enums in C. Een van de krachtigste aspecten van opsommingen is dat ze een eerste klas types in Swift zijn. Type veiligheid is een belangrijk aspect van de Swift-taal en opsommingen passen perfect in die mindset.