Swift From Scratch Optionalals og Control Flow

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.

1. Alternativer

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.

Hva er en valgfri?

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.

Tvunget unwrapping

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.

Valgfri binding

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")

Hva er 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.

2. Kontrollflow

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.

Uttømmende

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")

Faller gjennom

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.

Patterns

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.

Verdi Binding

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 

Konklusjon

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!