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.
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:
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.
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.
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
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
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
.
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)
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
.
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.
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.