Snelle tip opsommingen in Swift

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.

1. Wat is een telling?

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:

  • verbinding verbroken
  • verbinden
  • verbonden

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.

Basics

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.

Raw-waarden

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

2. Werken met opsommingen

initialisatie

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

Controlestroom

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.

3. Geassocieerde waarden

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)

4. Methoden en waardetypes

methoden

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.

Waardetypes

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.

Conclusie

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.