Swift From Scratch Optionalals och Control Flow

I de föregående artiklarna lärde du dig några av de grundläggande begreppen i Swift-programmeringsspråket. Om du har programmerat förut är du säker på att du såg några likheter med andra programmeringsspråk, som Ruby, JavaScript och Objective-C.

I denna artikel zoomar vi in ​​på kontrollflödet i Swift. Innan vi kan diskutera kontrollflödet mer detaljerat, behöver vi titta på ett koncept som är nytt för de flesta av dig, alternativ. Alternativ är en annan säkerhetsfunktion hos Swift. I början kan det se ut som ett problem att använda alternativ, men du lär dig snabbt att alternativen gör din kod mycket säkrare.

1. Alternativ

Vi har redan sett att en variabel måste initialiseras innan den kan användas. Ta en titt på följande exempel för att bättre förstå vad det betyder.

var str: String str.isEmpty

Om du är van att arbeta med strängar i Objective-C, kan du bli förvånad över att Swift visar ett fel. Låt oss se vad det här felet berättar för oss.

På många språk har variabler ett initialt standardvärde. I mål-C är till exempel strängen i följande kodbit lika med noll.

NSString * newString;

Men konceptet av noll skiljer sig i Swift och Objective-C. Vi diskuterar noll mer detaljerat lite senare.

Vad är en valfri?

Swift använder alternativ för att inkapsla ett viktigt begrepp, det vill säga en variabel eller konstant har ett värde eller det har det inte. Det är så enkelt i Swift. För att deklarera en variabel eller konstant som valfri lägger vi till ett frågetecken för typen av variabeln eller konstanten.

var str: String?

Variabeln str är inte längre av typ Sträng. Det är nu av typ valfri Sträng. Detta är viktigt att förstå. Resultatet eller bieffekten är att vi inte längre direkt kan interagera med värdet av str variabel. Värdet lagras säkert i frivilligt, och vi måste fråga valfri för det värde som det inkapslar.

Tvångsupplöpning

Ett sätt att komma åt värdet av en valfri är genom tvångsöppning. Vi kan komma åt värdet av variabeln str genom att lägga till en ! till variabelns namn.

var str: String? str = "Test" print (str!)

Det är viktigt att du är säker på att tillvalet innehåller ett värde när du tvingar omplocka det. Om valfri inte har ett värde och du tvingar att pakka ut det, kommer Swift att kasta ett fel på dig.

Valfri bindning

Det finns ett säkrare sätt att få tillgång till värdet av ett valfritt. Vi tar en närmare titt på om uttalanden om några minuter, men följande exempel visar hur vi säkert kan komma åt värdet som lagras i variabeln str, vilken är av typen valfri Sträng.

var str: String? om str! = nil print (str!) else print ("str har inget värde")

Vi kontrollerar först om variabeln str är lika med noll innan vi skriver ut dess innehåll. I detta exempel, str har inget värde, vilket betyder att det inte kommer att tvingas oöppnad av olycka.

Det finns ett mer elegant tillvägagångssätt som kallas valfri bindning. I följande exempel tilldelar vi värdet som lagras i frivilligt till en tillfällig konstant, som används i om påstående. Värdet av det frivilliga str är bunden till konstanten strConst och används i om påstående. Detta tillvägagångssätt fungerar också för medan uttalanden.

var str: String? str = "Test" om låt strConst = str print (strConst) annars print ("str har inget värde")

Vad är noll?

Om du kommer från mål-C vet du säkert vad noll är. I mål-C, noll är en pekare till ett objekt som inte existerar. Swift definierar noll lite annorlunda, och det är viktigt att du förstår skillnaden.

I Swift, noll betyder frånvaro av ett värde, vilket värde som helst. Medan noll gäller endast objekt i Mål-C, i Swift noll kan användas för vilken typ som helst. Det är därför viktigt att förstå att en valfri inte motsvarar noll i mål-C. Dessa begrepp är väldigt olika.

2. Kontrollflöde

Swift erbjuder ett antal vanliga konstruktioner för att kontrollera flödet av koden du skriver. Om du har någon erfarenhetsprogrammering, har du inga problem med att få fart på Swifts kontrollflödeskonstruktioner, villkorliga om och växla uttalanden och för och medan slingor.

Swift skulle dock inte vara Swift om dess kontrollflöde inte skilde sig något från, till exempel, Objective-C: s kontrollflödesstrukturer. Medan detaljerna är viktiga, är jag säker på att de inte hindrar dig från att komma i snabb takt med Swift. Låt oss börja med den vanligaste villkorliga konstruktionen, om påstående.

om

Swifts om uttalanden liknar dem som finns i mål-C. Huvudskillnaden är att det inte finns något behov av att sätta in tillståndet inom parentes. Curly braces är dock obligatoriska. Det senare hindrar utvecklare att införa vanliga buggar som är relaterade till skrivning om uttalanden utan lockiga hängslen. Detta är vad en om uttalandet ser ut som i Swift.

låt a = 10 om a> 10 print ("Värdet av \" a \ "är större än 10.") else print ("Värdet av \" a \ "är mindre än eller lika med 10." )

Det skulle inte bli någon överraskning att Swift också definierar en annan klausul. Koden i annan klausulen utförs om villkoret är lika med falsk. Det är också möjligt att kedja om uttalanden som visas i nästa exempel.

låt a = 10 om a> 10 print ("Värdet av \" a \ "är större än 10.") annars om a> 5 print ("Värdet på \" a \ "är större än 5. ") else print (" Värdet på \ "a \" är mindre än eller lika med 5. ")

Det finns en viktig anteckning att göra, det vill säga villkoret för en om uttalandet måste återvända Sann eller falsk. Detta gäller inte för om uttalanden i mål-C. Ta en titt på följande om uttalande i mål-C.

NSArray * array = @ []; om (array.count) NSLog (@ "Arrayen innehåller ett eller flera föremål.");  else NSLog (@ "Arrayen är tom."); 

Om vi ​​skulle sätta in ovanstående kodbit till Swift skulle vi få ett fel. Felet är inte särskilt informativt, men Swift berättar för oss att vi måste se till att resultatet av tillståndet utvärderas Sann eller falsk.

Det korrekta sättet att översätta ovanstående Objective-C-kod till Swift är genom att se till att tillståndet för om uttalandet utvärderas till Sann eller falsk, som i följande kod.

låt array = [String] () om array.count> 0 print ("Arrayen innehåller en eller flera poster.") else print ("Arrayen är tom.")

växla

Swifts växla uttalandet är kraftfullare än dess mål-C-ekvivalent. Det är också säkrare, som du lär dig på ett ögonblick. Medan det finns vissa skillnader, växla uttalanden i Swift följer samma begrepp som i andra programmeringsspråk; ett värde skickas till växla uttalande, och det jämförs med eventuella matchningsmönster.

Det är rätt, mönster. Som jag sa, a växla uttalandet i Swift har några knep på ärmen. Vi tar en titt på dessa tricks på ett ögonblick. Låt oss prata om säkerhet först.

Uttömmande

en växla uttalandet i Swift måste vara uttömmande, vilket innebär att alla möjliga värden av typen som lämnas till växla uttalandet måste hanteras av växla påstående. Liksom i mål-C löses detta enkelt genom att lägga till en standard fall, som visas i följande exempel.

låt a = 10 byta en case 0: print ("a är lika med 0") fall 1: utskrift ("a är lika med 1") standard: print ("a har ett annat värde")

Falla igenom

En viktig skillnad med mål-C: s genomförande av växla uttalanden är bristen på implicit genombrott. Följande exempel fungerar inte i Swift av några skäl.

låt a = 10 byta en case 0: case 1: print ("a är lika med 1") default: print ("a har ett annat värde")

Det första fallet i vilket en jämförs mot 0 faller inte implicit till det andra fallet i vilket en jämförs mot 1. Om du lägger till ovanstående exempel på din lekplats, märker du att Swift kastar ett fel på dig. Felet säger att varje fall måste innehålla minst ett körbart uttalande.

Observera att fallen av växla uttalandet omfattar inte ha sönder uttalanden att bryta ut ur växla påstående. Detta behövs inte i Swift, eftersom det inte finns något implicit fall i Swift. Detta kommer att eliminera en rad vanliga buggar orsakade av oavsiktlig nedbrytning.

Mönster

Kraften hos a växla uttalande i Swift ligger i mönster matchning. Ta en titt på följande exempel där jag har använt intervaller för att jämföra det bedömda värdet mot.

låt a = 10 byta 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 operatör med halv öppning definierar ett intervall från det första värdet till det andra värdet, med undantag för det andra värdet. De ... Operatör eller sluten operatör definierar ett intervall från det första värdet till det andra värdet, inklusive det andra värdet. Dessa operatörer är mycket användbara i ett brett spektrum av situationer.

Du kan också jämföra det ansedda värdet av a växla uttalande till tuples. Ta en titt på följande exempel för att se hur det fungerar.

låt latlng = (34.15, -78.03) switch latlng case (0, 0): print ("Vi är i mitten av planeten.") fallet (0 ... 90, _): print norra halvklotet. ") fallet (-90 ... 0, _): print (" Vi är på södra halvklotet. ") standard: print (" Koordinaten är ogiltig. ")

Som du kan se i ovanstående exempel är det möjligt att värdet matchar mer än ett fall. När detta händer väljs det första matchande fallet. Ovanstående exempel illustrerar också användningen av underskriften. Som vi såg i föregående artikel kan vi använda en understrykning, _, att berätta för Swift vilka värden vi inte är intresserade av.

Värdebindning

Värdebindning är också möjlig med växla uttalanden, som följande exempel visar. Tuples andra värde är temporärt bunden till konstanten beskrivning för användning i första och andra fallet.

var response = (200, "OK") switch response case (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.") 

för

De för slinga är den första slingkonstruktionen vi tar en titt på. Det beter sig väldigt likartat för slingor på andra språk. Det brukade vara två smaker, den för slinga och för-in slinga. Från och med Swift 3, dock, C-stil för slingor är inte längre tillgängliga. Följande kod är inte möjligt i Swift 3.

för var i = 0; jag < 10; i++  print("i is equal to \(i).") 

Om du klistrar in detta stycke på en lekplats märker du också att ++ och -- Operatörer är inte längre tillgängliga i Swift 3.

De för-in loop är idealisk för looping över innehållet i ett intervall eller samling. I det följande exemplet slogs vi över elementen i en array.

låt siffror = [1, 2, 3, 5, 8] för antal i siffror print ("talet är lika med \ (nummer)")

Vi kan också använda för-in loopar att slingra över nyckelvärdesparen i en ordlista. I följande exempel förklarar vi en ordlista och skriver ut dess innehåll till konsolen. Som vi såg tidigare i denna serie är sekvensen av nyckelvärdesparen odefinierad eftersom en ordlista är en orörd uppsättning nyckelvärdespar.

var bids = ["Tom": 100, "Bart": 150, "Susan": 120] för (namn, bud) i bud print ("\ (namn) bud är $ \ (bud) 

Varje nyckelvärdespar i ordlistan finns tillgänglig i för-in loop som en tupel av namngivna konstanter. De för-in loop är också bra i kombination med intervall. Jag är säker på att du håller med om att nedanstående kod är lätt att läsa och förstå tack vare användningen av ett slutet område.

för jag i 1 ... 10 print ("jag är lika med \ (i)")

medan

De medan slingan kommer i två smaker, medan och upprepad medan. Huvudskillnaden är att uppsättningen uttalanden av a upprepad medan Slingan utförs alltid minst en gång, eftersom tillståndet hos upprepad medan utvärderas i slutet av varje iteration. Följande exempel illustrerar denna skillnad.

var c = 5 var d = 5 medan c < d  print("c is smaller than d")  repeat  print("c is smaller than d")  while c < d

Skriv ut uttalandet av medan Slingan utförs aldrig, medan den av upprepad medan slingan exekveras en gång.

I många fall, för slingor kan omskrivas som medan slingor, och det är ofta upp till utvecklaren att bestämma vilken slinga som ska användas i en viss situation. Det följande för och medan loopar resulterar i samma utgång.

för jag i 0 ... <10  print(i)  var i = 0 while i < 10  print(i) i += 1 

Slutsats

Det finns mycket mer att kontrollera flödet i Swift än vad vi har behandlat i den här artikeln, men du har nu en grundläggande förståelse för att fortsätta din resa till Swift. Jag hoppas att denna handledning har visat dig hur Swifts kontrollflödesimplementation är väldigt likat med andra programmeringsspråk, men med en vridning.

I resten av denna serie utnyttjar vi Swifts kontrollflödesstrukturer, och du får gradvis en bättre förståelse för de subtila skillnaderna mellan Swift och språk som Objective-C. I nästa del av denna serie börjar vi utforska funktioner.

Om du vill ha ett snabbt sätt att komma igång med att bygga appar med Swift-språket, har vi en kurs för det!

Eller kolla in några av våra andra handledning och kurser om Swift och iOS utveckling!