Tall er et vanlig mønster i mange programmeringsspråk. Mens du kanskje er kjent med tall i C og Objective-C, er Swifts implementering av tallene betydelig mer kraftig og fleksibel. I dette raske tipset lærer du hva som er spesielt med tall i Swift, hvordan du bruker dem i prosjektene dine, og hva som gjør dem så kraftige.
Tallene er ikke nye, og de er absolutt ikke unike for Swift. Men hvis du er kjent med tall i C, så kommer du til å elske Swifts kraftige påføring av tall.
Hvis enums eller antall tall er nye for deg, kan du ikke være kjent med hva de har å tilby. I Swift er opptellingene førsteklasses typer som definerer en liste over mulige verdier for den typen.
Et eksempel kan være de mulige tilstandene til en nettverkstilkobling. De mulige tilstandene kan være:
Vi kan legge til en fjerde stat for saken staten er ukjent. Med dette eksempelet i tankene, la oss se hvordan du definerer og implementerer en slik opptelling.
Som sagt, er tallrike tall i Swift. En oppsummeringsdefinisjon ser veldig ut som en klasse- eller strukturdefinisjon. I eksemplet nedenfor definerer vi ConnectionState
oppregning.
enum ConnectionState
Navnet på opptellingen er på forhånd av enum
søkeord og etterfulgt av et par krøllete braces. De ConnectionState
oppsummering vil definere mulige tilstander for en nettverkstilkobling. For å definere disse statene legger vi til medlemsverdier eller medlemmer til opptellingenes definisjon. Definisjonen av en medlemsverdi starter alltid med sak
søkeord.
enum ConnectionState tilfelle Ukjent tilfelle Avkoblet tilfelle Tilkoblingstilkobling Tilkoblet
I C eller Objective-C vil ovennevnte tall bli litt annerledes som illustrert i eksemplet nedenfor. Hver verdi av oppsummeringen tilsvarer et heltall, for eksempel, ConnectionStateUnknown
er lik 0
, ConnectionStateDisconnected
er lik 1
, etc.
typedef enum: NSUInteger ConnectionStateUnknown, ConnectionStateDisconnected, ConnectionStateConnecting, ConnectionStateConnected ConnectionState;
Dette er ikke sant i Swift. Medlemmene av en oppsummering samsvarer ikke automatisk med et heltall. Medlemmene av ConnectionState
opptelling er verdier selv og de er av typen ConnectionState
. Dette gjør arbeidet med oppføringer sikrere og mer eksplisitte.
Det er mulig å spesifisere verdiene til medlemmene av en oppsummering eksplisitt. I følgende eksempel, medlemmer av ConnectionState
opptelling har en rå verdi av typen int
. Hvert medlem er tildelt en rå verdi, tilsvarende med et heltall.
enum ConnectionState: Int tilfelle Ukjent = -1 tilfelle Avkoblet = 0 tilfelle Tilkobling = 1 sak Tilkoblet = 2
Vær oppmerksom på at vi spesifiserer typen av råverdiene i opptellingenes definisjon, og at ingen toverdier kan ha samme råverdi. Hvis vi bare angir en verdi for Ukjent
medlem, vil Swift automatisk øke verdien av Ukjent
medlem og tilordne unike verdier til de andre medlemmene av opptellingen. For bedre å illustrere dette, er eksemplet nedenfor identisk med den forrige definisjonen av ConnectionState
oppregning.
enum ConnectionState: Int sak Ukjent = -1 tilfelle Avkoblet tilfelle Tilkoblingstilkobling Tilkoblet
Bruker ConnectionState
Oppsummering ligner på bruk av en hvilken som helst annen type i Swift. I det neste eksemplet erklærer vi en variabel, connectionState
, og sett verdien til ConnectionState.Connecting
.
var connectionState = ConnectionState.Connecting
Verdien av connectionState
er ConnectionState.Connecting
og variabelen er av typen ConnectionState
.
Swifts typegivelse er veldig praktisk når du arbeider med opptellingene. Fordi vi erklærte connectionState
som å være av typen ConnectionState
, Vi kan nå tilordne en ny verdi ved å bruke syntetisk syntetisk syntetikk for antall tall.
connectionState = .Connected
Bruke tall i en hvis
eller bytte om
erklæringen er grei. Husk at bytte om
uttalelser må være uttømmende. Legg til en misligholde
tilfelle om nødvendig.
enum ConnectionState case Ukjent tilfelle Avkoblet tilfelle Tilkoblingstilkobling Tilkoblet var connectionState = ConnectionState.ConnectingState = .Konfigurert bryterforbindelseState case .Diskonnected: println ("Disconnected") tilfelle. Koble til: println ("Tilkobling") tilfelle. Tilkoblet: println ("Connected") standard: println ("Ukjent tilstand")
Følgende eksempel viser hvordan ConnectionState
Enum kan brukes. Det viser også hvordan du får tilgang til den tilknyttede verdien av en enummedlem. De canConnect
funksjonen aksepterer a ConnectionState
forekomst og returnerer a bool
.
func canConnect (connectionState: ConnectionState) -> Bool varresultat = falsk bryterforbindelseState case .Connected (let port): hvis port == 3000 result = true default: result = false returresultat la state = ConnectionState. Tilkoblet (3000) hvis canConnect (state) // ...
De canConnect
funksjonen returnerer bare ekte
hvis ConnectionState
forekomst overført til funksjonen er lik .Tilkoblet
og den tilhørende verdien er en int
lik 3000
. Merk at den tilhørende verdien av Tilkoblet
medlem er tilgjengelig i bytte om
uttalelse som en konstant navngitt havn
, som vi da kan bruke i det tilsvarende sak
.
En annen overbevisende funksjon av Swift enums er tilknyttede verdier. Hvert medlem av en enum kan ha en tilknyttet verdi. Tilknyttede verdier er svært fleksible. For eksempel trenger ikke tilknyttede verdier av forskjellige medlemmer av samme enum å være av samme type. Ta en titt på følgende eksempel for å bedre forstå begrepet tilknyttede verdier.
enum ConnectionState case Ukjent tilfelle Avkoblet tilfelle Tilkobling (Int, Double) -stilkobling Tilkoblet (Int)
De Ukjent
og koblet
Medlemmene har ikke en tilknyttet verdi. DeKobler til
medlem har en tilknyttet verdi av typen (Int, Double)
, angir portnummer og tidsavbruddsintervall for tilkoblingen. De Tilkoblet
medlem har en tilknyttet verdi av typen int
, angir portnummeret.
Det er viktig å forstå at en tilknyttet verdi er knyttet til eller knyttet til et medlem av opptellingen. Medlemmets verdi forblir uendret. Det neste eksemplet illustrerer hvordan du lager en ConnectionState
forekomst med tilhørende verdi.
var connectionState = ConnectionState.Connecting (3000, 30.0)
Tallene er ganske kraftige i Swift. Opptellingen kan til og med definere metoder, for eksempel en initialiserer for å velge en standard medlemsverdi hvis ingen er spesifisert.
enum ConnectionState case Ukjent tilfelle Avkoblet tilfelle Tilkobling (Int, Double) tilfelle Tilkoblet (Int) init () self = .Unknown var connectionState = ConnectionState () // .Unknown
I dette eksemplet initierer vi en forekomst av ConnectionState
oppsummering uten å spesifisere spesifikt en verdi for den. I initialiseringen av oppsummeringen setter vi imidlertid forekomsten til Ukjent
. Resultatet er at connectionState
variabel er lik ConnectionState.Unknown
.
I likhet med strukturer er tallene verdiverdier, noe som betyr at en oppsummering ikke er bestått ved referanse, som klasseeksempler, men av verdi. Følgende eksempel illustrerer dette.
var connectionState1 = ConnectionState () var connectionState2 = connectionState1 connectionState1 = .Connected (1000) println (connectionState1) // .Connected (1000) println (connectionState2) // .Unknown
Selv om vi tildeler connectionState1
til connectionState2
, verdiene til connectionState1
og connectionState2
er forskjellige på slutten av eksemplet.
Når connectionState1
er tildelt til connectionState2
, Swift lager en kopi av connectionState1
og tilordner det til connectionState2
. Med andre ord, connectionState1
og connectionState2
referer til to forskjellige ConnectionState
forekomster.
Enums i Swift er utrolig kraftige sammenlignet med for eksempel enums i C. En av de mest kraftfulle aspektene av tallene er at de er en førsteklasses typer i Swift. Type sikkerhet er et viktig aspekt av Swift-språket, og tallene passer perfekt i den tankegangen.