Snabbtips Uppräkningar i Swift

Uppräkningar är ett vanligt designmönster på många programmeringsspråk. Medan du kanske är bekant med uppräkningar i C och Objective-C, är Swifts genomförande av uppräkningar betydligt mer kraftfull och flexibel. I det här snabba tipset lär du dig vad som är speciellt med uppräkningar i Swift, hur man använder dem i dina projekt och vad som gör dem så kraftfulla.

1. Vad är en uppräkning?

Uppräkningar är inte nya och de är verkligen inte unika för Swift. Men om du är bekant med uppräkningar i C, kommer du att älska Swifts kraftfulla ta på uppräkningar.

Om enums eller uppräkningar är nya för dig kanske du inte är bekant med vad de har att erbjuda. I Swift är uppräkningar första klasstyper som definierar en lista över möjliga värden för den typen.

Ett exempel kan vara de möjliga tillstånden för en nätverksanslutning. De möjliga tillstånden kan vara:

  • osammanhängande
  • ansluta
  • ansluten

Vi kunde lägga till ett fjärde tillstånd för fallet staten är okänt. Med det här exemplet i åtanke, låt oss se hur du definierar och genomför en sådan uppräkning.

Grunderna

Som sagt, är uppräkningar första klasstyper i Swift. En uppräkningsdefinition ser mycket ut som en klass- eller strukturdefinition. I exemplet nedan definierar vi ConnectionState uppräkning.

enum ConnectionState 

Namnet på uppräkningen föregås av enum nyckelord och följt av ett par lockiga hängslen. De ConnectionState uppräkning kommer att definiera de möjliga tillstånden för en nätverksanslutning. För att definiera dessa tillstånd lägger vi till medlemsvärden eller medlemmar till uppräkningens definition. Definitionen av ett medlemsvärde börjar alltid med fall nyckelord.

enum ConnectionState fall Okänt fall Avkopplat fodral Anslutningsskydd ansluten

I C eller Objective-C skulle ovanstående uppräkning se lite annorlunda ut som illustreras i exemplet nedan. Varje värde av uppräkningen motsvarar exempelvis ett heltal, ConnectionStateUnknown är lika med 0, ConnectionStateDisconnected är lika med 1, etc.

typedef enum: NSUInteger ConnectionStateUnknown, ConnectionStateDisconnected, ConnectionStateConnecting, ConnectionStateConnected ConnectionState;

Detta är inte sant i Swift. Medlemmarna i en uppräkning motsvarar inte automatiskt ett heltal. Medlemmarna av ConnectionState uppräkning är värden själva och de är av typ ConnectionState. Detta gör att arbetet med uppräkningar säkrare och tydligare.

Råvärden

Det är möjligt att uttryckligen ange värdena för medlemmarna i en uppräkning. I följande exempel, medlemmarna av ConnectionState uppräkning har ett råvärde av typen int. Varje medlem tilldelas ett råvärde, motsvarande ett heltal.

enum ConnectionState: Int fall Okänt = -1 fall Avkopplat = 0 fall Anslutning = 1 fall Ansluten = 2

Observera att vi anger typen av råvärden i uppräkningens definition och att inga två medlemsvärden kan ha samma råvärde. Om vi ​​bara anger ett värde för Okänd medlem, kommer Swift automatiskt att öka värdet på Okänd medlem och tilldela unika värden till de andra medlemmarna i uppräkningen. För att bättre illustrera detta är nedanstående exempel identiskt med den tidigare definitionen av ConnectionState uppräkning.

enum ConnectionState: Int fall Okänt = -1 fall Ej anslutet fall Anslutningsväska anslutet

2. Arbeta med uppräkningar

initiering

Använda ConnectionState uppräkning liknar att använda någon annan typ i Swift. I det följande exemplet förklarar vi en variabel, connectionState, och sätta sitt värde till ConnectionState.Connecting.

var connectionState = ConnectionState.Connecting

Värdet av connectionState är ConnectionState.Connecting och variabeln är av typen ConnectionState.

Swifts typinferens är mycket bekvämt när man arbetar med uppräkningar. Eftersom vi förklarade connectionState som av typ ConnectionState, Vi kan nu tilldela ett nytt värde med hjälp av syntaxen för stentonpunkt för uppräkningar.

connectionState = .Connected

Styrningsflöde

Använda uppräkningar i en om eller växla uttalandet är enkelt. Kom ihåg det växla uttalanden måste vara uttömmande. Lägg till en standard fall om det behövs.

enum ConnectionState case Okänt fall Avslutat fall Anslutningsfall Ansluten var connectionState = ConnectionState.ConnectingState = .Kopplad anslutningsanslutningState case .Disconnected: println ("Disconnected") fallet.Koppling: println ("Connecting") fodral .Kopplad: println ("Connected") standard: println ("Okänd stat")

Följande exempel visar hur ConnectionState enum kan användas. Det visar också hur man får tillgång till det associerade värdet av en enummedlem. De canConnect funktionen accepterar a ConnectionState instans och returnerar a Bool.

func canConnect (connectionState: ConnectionState) -> Bool var result = false switch connectionState case .Connected (let port): om port == 3000 result = true default: result = false returresultat let state = ConnectionState. Ansluten (3000) om canConnect (state) // ...

De canConnect funktionen returnerar endast Sann om ConnectionState Instans som passerat till funktionen är lika med .Ansluten och dess tillhörande värde är en int lika med 3000. Observera att det associerade värdet av Ansluten medlem är tillgänglig i växla uttalande som en konstant namngiven hamn, som vi då kan använda i motsvarande fall.

3. Associerade värden

En annan övertygande egenskap hos Swift enums är associerade värden. Varje medlem i en enum kan ha ett associerat värde. Associerade värden är mycket flexibla. Till exempel behöver associerade värden av olika medlemmar av samma enum inte vara av samma typ. Ta en titt på följande exempel för att bättre förstå begreppet associerade värden.

enum ConnectionState fall Okänt fall Avslutat fall Anslutande (Int, Dubbel) fodral Ansluten (Int)

De Okänd och Osammanhängande medlemmar har inte ett tillhörande värde. DeAnslutning medlemmen har ett associerat värde av typen (Int, Double), specificerar portnummer och tidsintervall för anslutningen. De Ansluten medlemmen har ett associerat värde av typen int, Ange portnummer.

Det är viktigt att förstå att ett tillhörande värde är kopplat till eller associerat med en medlem i uppräkningen. Medlemmens värde förblir oförändrat. Nästa exempel illustrerar hur man skapar en ConnectionState instans med ett tillhörande värde.

var connectionState = ConnectionState.Connecting (3000, 30,0)

4. Metoder och Värdetyper

metoder

Uppräkningar är ganska kraftfulla i Swift. Uppräkningar kan till och med definiera metoder, såsom en initialiserare för att välja ett standardmedlemsvärde om inget anges.

enum ConnectionState fall Okänt fall Avslutat fall Anslutande (Int, Dubbel) fall Ansluten (Int) init () self = .Unknown var connectionState = ConnectionState () // .Unknown

I det här exemplet initierar vi en instans av ConnectionState uppräkning utan att uttryckligen ange ett värde för det. I initialiseringen av uppräkningen ställer vi dock instansen till Okänd. Resultatet är att connectionState variabeln är lika med ConnectionState.Unknown.

Värdetyper

Liksom strukturer är uppräkningar värdetyper, vilket innebär att en uppräkning inte överförs genom referens, som klassförekomster, utan av värde. Följande exempel illustrerar detta.

var connectionState1 = ConnectionState () var connectionState2 = connectionState1 connectionState1 = .Connected (1000) println (connectionState1) // .Connected (1000) println (connectionState2) // .Unknown

Även om vi tilldelar connectionState1 till connectionState2, värdena för connectionState1 och connectionState2 är olika vid slutet av exemplet.

När connectionState1 är tilldelad till connectionState2, Swift skapar en kopia av connectionState1 och tilldelar det till connectionState2. Med andra ord, connectionState1 och connectionState2 hänvisa till två olika ConnectionState instanser.

Slutsats

Enum i Swift är oerhört kraftfulla jämfört med till exempel enums i C. En av de mest kraftfulla aspekterna av uppräkningar är att de är en förstklassig typ i Swift. Typ av säkerhet är en viktig aspekt av det svarta språket och uppräkningarna passar perfekt i den tanken.