I de forrige artiklene lærte du noen av de grunnleggende konseptene i Swift programmeringsspråket. Hvis du har programmert før, er jeg sikker på at du så noen likheter med andre programmeringsspråk, for eksempel Ruby, JavaScript og Objective-C.
I denne artikkelen zoomer vi inn på kontrollflyten i Swift. Før vi kan diskutere kontrollflyten mer detaljert, må vi se på et konsept som er nytt for de fleste av dere, alternativer. Alternativer er en annen sikkerhetsfunksjon i Swift. I begynnelsen kan det virke som et problem å bruke alternativene, men du vil raskt lære at alternativene vil gjøre koden din mye tryggere.
Vi har allerede sett at en variabel må initialiseres før den kan brukes. Ta en titt på følgende eksempel for å bedre forstå hva dette betyr.
var str: Streng str.isEmpty
Hvis du er vant til å jobbe med strenger i Objective-C, kan du bli overrasket over at Swift viser deg en feil. La oss se hva den feilen forteller oss.
I mange språk har variabler en innledende standardverdi. I mål-C er for eksempel strengen i den følgende kodestykket lik nil
.
NSString * newString;
Men konseptet av nil
forskjellig i Swift og Objective-C. Vi diskuterer nil
mer detaljert litt senere.
Swift bruker opsjoner til å inkapslere et viktig konsept, det vil si en variabel eller konstant har en verdi, eller den har det ikke. Det er så enkelt i Swift. For å erklære en variabel eller konstant som valgfri, legger vi til et spørsmålstegn til typen av variabelen eller konstanten.
var str: String?
Variabelen str
er ikke lenger av typen string
. Det er nå av typen valgfri string
. Dette er viktig å forstå. Resultatet eller bivirkningen er at vi ikke lenger kan direkte samhandle med verdien av str
variabel. Verdien lagres sikkert i tilleggsutstyret, og vi må spørre valgfritt for verdien den innkapsler.
En måte å få tilgang til verdien av en valgfri, er gjennom tvungen utpakking. Vi kan få tilgang til verdien til variabelen str
ved å legge til en !
til variabelenes navn.
var str: String? str = "Test" utskrift (str!)
Det er viktig at du er sikker på at tilleggsutstyret inneholder en verdi når du tvinges til å pakke ut den. Hvis tilleggsutstyret ikke har en verdi, og du tvinger til å pakke ut det, vil Swift kaste en feil på deg.
Det er en tryggere måte å få tilgang til verdien av en valgfri. Vi tar en nærmere titt på hvis
uttalelser om noen få minutter, men følgende eksempel viser hvordan vi trygt kan få tilgang til verdien som er lagret i variabelen str
, som er av typen valgfri string
.
var str: String? hvis str! = nil print (str!) else print ("str har ingen verdi")
Vi sjekker først om variabelen str
er lik nil
før vi skriver ut innholdet. I dette eksemplet, str
har ingen verdi, noe som betyr at det ikke vil bli tvunget til å bli pakket uhell.
Det er en mer elegant tilnærming kalt valgfri binding. I det følgende eksempel tilordner vi verdien som er lagret i den valgfrie til en midlertidig konstant, som brukes i hvis
uttalelse. Verdien av det valgfrie str
er bundet til konstanten strConst
og brukes i hvis
uttalelse. Denne tilnærmingen fungerer også for samtidig som
uttalelser.
var str: String? str = "Test" hvis la strConst = str print (strConst) else print ("str har ingen verdi")
nil
?Hvis du kommer fra Objective-C, vet du absolutt hva nil
er. I Mål-C, nil
er en peker til et objekt som ikke eksisterer. Swift definerer nil
litt annerledes, og det er viktig at du forstår forskjellen.
I Swift, nil
betyr fravær av verdi, verdi. Samtidig som nil
er kun gjeldende for objekter i Objective-C, i Swift nil
kan brukes til alle typer. Det er derfor viktig å forstå at en valgfri ikke er ekvivalent av nil
i mål-C. Disse begrepene er veldig forskjellige.
Swift tilbyr en rekke vanlige konstruksjoner for å kontrollere strømmen av koden du skriver. Hvis du har noen erfaring med programmering, har du ingen problemer med å få fart på Swifts kontrollflytkonstruksjoner, betinget hvis
og bytte om
uttalelser og til
og samtidig som
løkker.
Imidlertid vil Swift ikke være Swift hvis kontrollflowen ikke var noe forskjellig fra, for eksempel, Objective-Cs kontrollflowkonstruksjoner. Mens detaljene er viktige, er jeg sikker på at de ikke hindrer deg i å komme opp til fart med Swift. La oss starte med den vanligste betingede konstruksjonen, hvis
uttalelse.
hvis
Swift hvis
uttalelser er svært lik dem som finnes i mål-c. Hovedforskjellen er at det ikke er nødvendig å vikle tilstanden i parentes. Krøllete braces er imidlertid obligatoriske. Sistnevnte forhindrer utviklere i å introdusere vanlige bugs som er relatert til skriving hvis
uttalelser uten krøllete braces. Dette er hva en hvis
setningen ser ut som i Swift.
la a = 10 hvis a> 10 print ("Verdien av \" a \ "er større enn 10.") else print ("Verdien av \" a \ "er mindre enn eller lik 10." )
Det bør ikke komme som en overraskelse at Swift også definerer en ellers
klausul. Koden i ellers
Klausulen utføres hvis tilstanden er lik falsk
. Det er også mulig å kjede hvis
uttalelser som vist i neste eksempel.
la a = 10 hvis a> 10 print ("Verdien av \" a \ "er større enn 10.") ellers hvis a> 5 print ("Verdien av \" a \ "er større enn 5. ") else print (" Verdien av \ "a \" er mindre enn eller lik 5. ")
Det er et viktig notat å gjøre, det vil si tilstanden til en hvis
uttalelse må returnere ekte
eller falsk
. Dette gjelder ikke for hvis
uttalelser i mål-C. Ta en titt på følgende hvis
uttalelse i mål-C.
NSArray * array = @ []; hvis (array.count) NSLog (@ "Arrayet inneholder ett eller flere elementer."); else NSLog (@ "Arrayet er tomt.");
Hvis vi skulle porte over kodekoden til Swift, ville det føre til en feil. Feilen er ikke veldig informativ, men Swift forteller oss at vi må sikre at resultatet av tilstanden vurderes til ekte
eller falsk
.
Den riktige måten å oversette Objektiv-C-koden til Swift er ved å sørge for tilstanden til hvis
setningen evaluerer til ekte
eller falsk
, som i følgende utdrag.
la array = [String] () hvis array.count> 0 print ("Arrayet inneholder ett eller flere elementer.") else print ("Arrayet er tomt.")
bytte om
Swift bytte om
erklæringen er kraftigere enn dens mål-C-ekvivalent. Det er også tryggere, som du vil lære om et øyeblikk. Mens det er noen forskjeller, bytte om
uttalelser i Swift holder seg til samme konsept som i andre programmeringsspråk; en verdi sendes til bytte om
uttalelse, og det er sammenlignet med mulige samsvarende mønstre.
Det er riktig, mønstre. Som jeg sa, a bytte om
uttalelse i Swift har noen triks opp på ermet. Vi tar en titt på disse triksene i et øyeblikk. La oss snakke om sikkerhet først.
EN bytte om
uttalelse i Swift må være uttømmende, noe som betyr at alle mulige verdier av typen som er levert til bytte om
uttalelse må håndteres av bytte om
uttalelse. Som i mål-C, løses dette lett ved å legge til en misligholde
tilfelle, som vist i følgende eksempel.
la a = 10 slå en case 0: print ("a er lik 0") tilfelle 1: print ("a er lik 1") standard: print ("a har en annen verdi")
En viktig forskjell med Objective-Cs implementering av bytte om
uttalelser er mangelen på implisitt fallthrough. Følgende eksempel virker ikke i Swift av noen grunner.
la a = 10 slå en case 0: case 1: print ("a er lik 1") standard: print ("a har en annen verdi")
Det første tilfellet der en
er sammenlignet med 0
falder ikke implisitt til det andre tilfellet der en
er sammenlignet med 1
. Hvis du legger til eksempelet ovenfor til lekeplassen, vil du legge merke til at Swift kaster en feil på deg. Feilen sier at hvert tilfelle må inneholde minst en eksekverbar erklæring.
Legg merke til at tilfellene til bytte om
erklæring inkluderer ikke gå i stykker
uttalelser å bryte ut av bytte om
uttalelse. Dette er ikke nødvendig i Swift siden implisitt fallthrough finnes ikke i Swift. Dette vil eliminere en rekke vanlige bugs forårsaket av utilsiktet fallthrough.
Kraften til a bytte om
uttalelse i Swift ligger i mønster matching. Ta en titt på følgende eksempel der jeg har brukt intervaller for å sammenligne vurderte verdiene mot.
la a = 10 slå en case 0 ... <5: print("The value of a lies between 0 and 4.") case 5… 10: print("The value of a lies between 5 and 10.") default: print("The value of a is greater than 10.")
De ... <
operatør eller halvåpent rekkevidde operatør definerer et område fra den første verdien til den andre verdien, unntatt den andre verdien. De ...
Operatør- eller lukketoperatør definerer et område fra den første verdien til den andre verdien, inkludert den andre verdien. Disse operatørene er svært nyttige i en rekke situasjoner.
Du kan også sammenligne verdien av a bytte om
uttalelse til tuples. Ta en titt på følgende eksempel for å se hvordan dette fungerer.
la latlng = (34.15, -78.03) bytte latlng case (0, 0): print ("Vi er i sentrum av planeten.") saken (0 ... 90, _): print den nordlige halvkule. ") saken (-90 ... 0, _): print (" Vi er på den sørlige halvkule. ") standard: print (" Koordinatet er ugyldig. ")
Som du kan se i eksempelet ovenfor, er det mulig at verdien stemmer overens med mer enn ett tilfelle. Når dette skjer, blir det første matchende tilfellet valgt. Eksemplet ovenfor illustrerer også bruken av understrekningen. Som vi så i forrige artikkel, kan vi bruke en understreking, _
, å fortelle Swift hvilke verdier vi ikke er interessert i.
Verdibinding er også mulig med bytte om
uttalelser, som det følgende eksemplet viser. Den andre verdien av tuplen er midlertidig bundet til konstanten beskrivelse
for bruk i første og andre tilfelle.
var respons = (200, "OK") bryterrespons tilfelle (200 ... <400, let description): print("The request was successful with description \(description).") case (400… <500, let description): print("The request was unsuccessful with description \(description).") default: print("The request was unsuccessful with no description.")
til
De til
sløyfe er den første sløyfekonstruksjonen vi tar en titt på. Det oppfører seg veldig likt til til
sløyfer på andre språk. Det pleide å være to smaker, den til
loop og for i
sløyfe. Som av Swift 3, men C-stil til
sløyfer er ikke lenger tilgjengelige. Følgende kode er ikke mulig i Swift 3.
for var i = 0; Jeg < 10; i++ print("i is equal to \(i).")
Hvis du limer inn dette stykket på en lekeplass, vil du også merke at ++
og --
Operatører er ikke lenger tilgjengelige i Swift 3.
De for i
loop er ideell for looping over innholdet i et utvalg eller samling. I det følgende eksempel løp vi over elementene i en matrise.
la tall = [1, 2, 3, 5, 8] for tall i tall print ("tall er lik \ (tall)")
Vi kan også bruke for i
looper å sløyfe over nøkkelverdier parene i en ordbok. I det følgende eksemplet erklærer vi en ordbok og skriver ut innholdet til konsollen. Som vi så tidligere i denne serien, er sekvensen av nøkkelverdeparene udefinert siden en ordbok er et uordnet sett med nøkkelverdige par.
var bids = ["Tom": 100, "Bart": 150, "Susan": 120] for (navn, bud) i bud print ("\ (navn) bud er $ \ (bud).")
Hvert nøkkelverdierpar i ordlisten er tilgjengelig i for i
loop som en tuple av navngitte konstanter. De for i
loop er også flott i kombinasjon med intervaller. Jeg er sikker på at du er enig i at underutsnittet er lett å lese og forstå takket være bruken av et lukket område.
for jeg i 1 ... 10 print ("jeg er lik \ (i)")
samtidig som
De samtidig som
loop kommer i to smaker, samtidig som
og repeat-mens
. Hovedforskjellen er at settet med uttalelser fra a repeat-mens
loop er alltid utført minst en gang, fordi tilstanden til repeat-mens
evalueres ved slutten av hver iterasjon. Følgende eksempel illustrerer denne forskjellen.
var c = 5 var d = 5 mens c < d print("c is smaller than d") repeat print("c is smaller than d") while c < d
Utskriftserklæringen til samtidig som
sløyfe blir aldri utført, mens den av repeat-mens
sløyfen utføres en gang.
I mange tilfeller, til
sløyfer kan omskrives som samtidig som
sløyfer, og det er ofte opp til utvikleren å bestemme hvilken sløyfe som skal brukes i en bestemt situasjon. Følgende til
og samtidig som
sløyfer resulterer i samme utgang.
for jeg i 0 ... <10 print(i) var i = 0 while i < 10 print(i) i += 1
Det er mye mer å kontrollere flyt i Swift enn hva vi har dekket i denne artikkelen, men du har nå en grunnleggende forståelse for å fortsette reisen din til Swift. Jeg håper denne opplæringen har vist deg hvordan Swifts kontrollflowimplementasjon er veldig lik den for andre programmeringsspråk, men med en vri.
I resten av denne serien vil vi gjøre mer bruk av Swifts kontrollflowkonstruksjoner, og du får gradvis en bedre forståelse av de subtile forskjellene mellom Swift og språk som Objective-C. I neste utgave av denne serien begynner vi å utforske funksjoner.
Hvis du vil ha en rask måte å komme i gang med å bygge programmer med Swift-språket, har vi et kurs for det!
Eller sjekk ut noen av våre andre opplæringsprogrammer og kurs på Swift og iOS-utvikling!