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.
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.
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.
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.
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")
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.
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.
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")
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.
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 ä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
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!