In de vorige artikelen hebt u enkele basisconcepten van de Swift-programmeertaal geleerd. Als je eerder hebt geprogrammeerd, weet ik zeker dat je een aantal overeenkomsten hebt met andere programmeertalen, zoals Ruby, JavaScript en Objective-C.
In dit artikel zoomen we in op de besturingsstroom in Swift. Voordat we de controlestroom gedetailleerder kunnen bespreken, moeten we een concept bekijken dat voor de meesten van jullie nieuw is, optioneel. Optionals zijn een andere veiligheidsfunctie van Swift. In eerste instantie lijkt het misschien een gedoe om optionals te gebruiken, maar je zult snel leren dat optionals je code veel veiliger maken.
We hebben al gezien dat een variabele moet worden geïnitialiseerd voordat deze kan worden gebruikt. Bekijk het volgende voorbeeld om beter te begrijpen wat dit betekent.
var str: String str.isEmpty
Als je gewend bent om te werken met strings in Objective-C, dan zal het je misschien verbazen dat Swift je een fout laat zien. Laten we kijken wat die fout ons vertelt.
In veel talen hebben variabelen een initiële standaardwaarde. In Objective-C is bijvoorbeeld de tekenreeks in het volgende codefragment gelijk aan nul
.
NSString * newString;
Het concept van nul
verschilt in Swift en Objective-C. We zullen bespreken nul
in meer detail een beetje later.
Swift gebruikt optionals om een belangrijk concept in te kapselen, dat wil zeggen, een variabele of constante heeft een waarde of niet. Zo eenvoudig is het in Swift. Om een variabele of constante als optioneel te declareren, voegen we een vraagteken toe aan het type variabele of constante.
var str: String?
De variabele str
is niet langer van het type Draad
. Het is nu van het type facultatief Draad
. Dit is belangrijk om te begrijpen. Het resultaat of neveneffect is dat we niet langer rechtstreeks kunnen interageren met de waarde van de str
variabel. De waarde wordt veilig opgeslagen in het optionele en we moeten het optionele vragen voor de waarde die het inkapselt.
Een manier om toegang te krijgen tot de waarde van een optionele is door gedwongen uitpakken. We hebben toegang tot de waarde van de variabele str
door een !
naar de naam van de variabele.
var str: String? str = "Test" print (str!)
Het is belangrijk dat u zeker weet dat de optionele waarde een waarde bevat wanneer u deze forceert. Als de optionele waarde geen waarde heeft en u forceert het uitpakken, dan zal Swift u een fout geven.
Er is een veiligere manier om toegang te krijgen tot de waarde van een optionele. We zullen het van naderbij bekijken als
instructies in een paar minuten, maar het volgende voorbeeld laat zien hoe we veilig toegang kunnen krijgen tot de waarde die is opgeslagen in de variabele str
, die van het type optioneel is Draad
.
var str: String? if str! = nil print (str!) else print ("str heeft geen waarde")
We controleren eerst of de variabele str
is gelijk aan nul
voordat we de inhoud ervan afdrukken. In dit voorbeeld, str
heeft geen waarde, wat betekent dat het niet per ongeluk wordt uitgepakt.
Er is een meer elegante benadering die optionele binding wordt genoemd. In het volgende voorbeeld kennen we de waarde die is opgeslagen in de optionele toe aan een tijdelijke constante, die wordt gebruikt in de als
uitspraak. De waarde van de optionele str
is gebonden aan de constante strConst
en gebruikt in de als
uitspraak. Deze aanpak werkt ook voor terwijl
statements.
var str: String? str = "Test" als strConst = str print (strConst) else print ("str heeft geen waarde")
nul
?Als je van Objective-C komt, weet je heel goed wat nul
is. In doelstelling-C, nul
is een verwijzing naar een object dat niet bestaat. Swift definieert nul
een beetje anders, en het is belangrijk dat je het verschil begrijpt.
In Swift, nul
betekent de afwezigheid van een waarde, elke waarde. Terwijl nul
is alleen van toepassing op objecten in Objective-C, in Swift nul
kan voor elk type worden gebruikt. Het is daarom belangrijk om te begrijpen dat een optionele niet het equivalent is van nul
in Objective-C. Deze concepten zijn heel verschillend.
Swift biedt een aantal algemene constructies om de stroom van de code die u schrijft te beheren. Als je ervaring hebt met programmeren, dan heb je geen problemen om op de hoogte te zijn van Swift's controlestroomconstructies, voorwaardelijk als
en schakelaar
verklaringen, en voor
en terwijl
loops.
Swift zou echter niet snel zijn als de controlestroom ervan niet lichtjes verschilt van, bijvoorbeeld, de besturingsstroomconstructies van Objective-C. Hoewel de details belangrijk zijn, weet ik zeker dat ze je niet beletten om met Swift op de hoogte te zijn. Laten we beginnen met de meest voorkomende voorwaardelijke constructie, de als
uitspraak.
als
Swift's als
uitspraken lijken sterk op die in Objective-C. Het belangrijkste verschil is dat het niet nodig is om de voorwaarde tussen haakjes te plaatsen. Krullende accolades zijn echter verplicht. Dit laatste voorkomt dat ontwikkelaars veelvoorkomende fouten introduceren die te maken hebben met schrijven als
uitspraken zonder accolades. Dit is wat een als
verklaring ziet eruit als in Swift.
laat a = 10 indien a> 10 print ("De waarde van \" a \ "is groter dan 10.") else print ("De waarde van \" a \ "is kleiner dan of gelijk aan 10." )
Het zou geen verrassing moeten zijn dat Swift ook een definieert anders
clausule. De code in de anders
clausule wordt uitgevoerd als de voorwaarde gelijk is aan vals
. Het is ook mogelijk om te ketenen als
verklaringen zoals getoond in het volgende voorbeeld.
laat a = 10 als a> 10 print ("De waarde van \" a \ "is groter dan 10.") else if a> 5 print ("De waarde van \" a \ "is groter dan 5. ") else print (" De waarde van \ "a \" is kleiner dan of gelijk aan 5. ")
Er is een belangrijke opmerking te maken, dat wil zeggen, de toestand van een als
verklaring moet terugkeren waar
of vals
. Dit is niet waar voor als
verklaringen in Objective-C. Bekijk het volgende als
verklaring in Objective-C.
NSArray * array = @ []; if (array.count) NSLog (@ "De array bevat een of meer items."); else NSLog (@ "De array is leeg.");
Als we het bovenstaande codefragment zouden overbrengen naar Swift, zouden we een fout tegenkomen. De fout is niet erg informatief, maar Swift vertelt ons dat we ervoor moeten zorgen dat het resultaat van de conditie evalueert waar
of vals
.
De juiste manier om het bovenstaande objectief-C-fragment naar Swift te vertalen, is door ervoor te zorgen dat de voorwaarde van de als
statement evalueert naar waar
of vals
, zoals in het volgende fragment.
laat array = [String] () als array.count> 0 print ("De array bevat een of meer items.") else print ("De array is leeg.")
schakelaar
Swift's schakelaar
verklaring is krachtiger dan het equivalent van Objective-C. Het is ook veiliger, zoals u in een moment zult leren. Hoewel er enkele verschillen zijn, schakelaar
uitspraken in Swift houden zich aan hetzelfde concept als in andere programmeertalen; een waarde wordt doorgegeven aan de schakelaar
verklaring en wordt vergeleken met mogelijke overeenkomende patronen.
Dat klopt, patronen. Zoals ik al zei, een schakelaar
statement in Swift heeft een paar trucs in petto. We zullen deze trucs in een oogwenk bekijken. Laten we het eerst over veiligheid hebben.
EEN schakelaar
statement in Swift moet uitputtend zijn, wat betekent dat elke mogelijke waarde van het type dat aan de. wordt gegeven schakelaar
verklaring moet worden afgehandeld door de schakelaar
uitspraak. Net als in Objective-C kan dit eenvoudig worden opgelost door een standaard
geval, zoals weergegeven in het volgende voorbeeld.
laat a = 10 schakel een case 0: print ("a is gelijk aan 0") case 1: print ("a is gelijk aan 1") standaard: print ("a heeft een andere waarde")
Een belangrijk verschil met de implementatie van Objective-C van schakelaar
uitspraken is het ontbreken van een impliciete doorbraak. Het volgende voorbeeld werkt om een paar redenen niet in Swift.
laat a = 10 schakel een case 0: case 1: print ("a is gelijk aan 1") standaard: print ("a heeft een andere waarde")
Het eerste geval waarin een
wordt vergeleken met 0
impliciet niet impliciet door naar het tweede geval waarin een
wordt vergeleken met 1
. Als je het bovenstaande voorbeeld toevoegt aan je speeltuin, zul je merken dat Swift je een fout geeft. De fout zegt dat elk geval ten minste één uitvoerbare verklaring moet bevatten.
Merk op dat de gevallen van de schakelaar
verklaring niet opnemen breken
uitspraken om uit de schakelaar
uitspraak. Dit is niet vereist in Swift, omdat impliciete fallthrough niet bestaat in Swift. Dit zal een reeks veelvoorkomende fouten elimineren die worden veroorzaakt door onbedoelde fallthrough.
De kracht van een schakelaar
statement in Swift ligt in pattern matching. Bekijk het volgende voorbeeld waarin ik reeksen heb gebruikt om de betreffende waarde te vergelijken met.
laat a = 10 schakel een 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 ... <
operator of halfopen bereikoperator definieert een bereik van de eerste waarde tot de tweede waarde, exclusief de tweede waarde. De ...
operator of operator met een gesloten bereik definieert een bereik van de eerste waarde tot de tweede waarde, inclusief de tweede waarde. Deze operators zijn zeer nuttig in een breed scala van situaties.
Je kunt ook de beschouwde waarde van a vergelijken schakelaar
verklaring voor tuples. Bekijk het volgende voorbeeld om te zien hoe dit werkt.
let latng = (34.15, -78.03) switch latlng case (0, 0): print ("We zijn in het midden van de planeet.") case (0 ... 90, _): print ("We're in het noordelijk halfrond. ") case (-90 ... 0, _): print (" We zijn in het zuidelijk halfrond. ") default: print (" De coördinaat is ongeldig. ")
Zoals u in het bovenstaande voorbeeld kunt zien, is het mogelijk dat de waarde overeenkomt met meer dan één geval. Wanneer dit gebeurt, wordt de eerste overeenkomende case gekozen. Het bovenstaande voorbeeld illustreert ook het gebruik van het onderstrepingsteken. Zoals we in het vorige artikel hebben gezien, kunnen we een onderstrepingsteken gebruiken, _
, om Swift te vertellen aan welke waarden we niet zijn geïnteresseerd.
Waardebinding is ook mogelijk met schakelaar
verklaringen, zoals het volgende voorbeeld laat zien. De tweede waarde van het tuple is tijdelijk gebonden aan de constante Omschrijving
voor gebruik in het eerste en tweede geval.
var response = (200, "OK") schakelreactie 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.")
voor
De voor
Loop is de eerste lusconstructie die we zullen bekijken. Het gedraagt zich erg op dezelfde manier voor
loops in andere talen. Er waren twee smaken, de voor
loop en de voor in
lus. Vanaf Swift 3 echter C-stijl voor
loops zijn niet langer beschikbaar. Het volgende fragment is niet mogelijk in Swift 3.
voor var i = 0; ik < 10; i++ print("i is equal to \(i).")
Als je dit fragment in een speeltuin plakt, merk je ook dat het ++
en --
operators zijn niet langer beschikbaar in Swift 3.
De voor in
loop is ideaal voor het doorlussen van de inhoud van een bereik of verzameling. In het volgende voorbeeld doorlopen we de elementen van een array.
let numbers = [1, 2, 3, 5, 8] voor aantal in aantallen print ("number is equal to \ (number)")
We kunnen ook gebruiken voor in
loops om over de sleutel / waarde-paren van een woordenboek te lopen. In het volgende voorbeeld, verklaren we een woordenboek en drukken de inhoud ervan af op de console. Zoals we eerder in deze reeks zagen, is de reeks sleutel / waarde-paren niet gedefinieerd, omdat een woordenboek een ongeordende set sleutel / waarde-paren is.
var bids = ["Tom": 100, "Bart": 150, "Susan": 120] voor (naam, bod) in biedingen print ("\ (name) 's biede is $ \ (bid).")
Elk sleutel / waarde-paar van het woordenboek is beschikbaar in de voor in
loop als een tupel van benoemde constanten. De voor in
loop is ook geweldig in combinatie met ranges. Ik ben er zeker van dat u het ermee eens bent dat het onderstaande fragment gemakkelijk te lezen en te begrijpen is dankzij het gebruik van een gesloten bereik.
voor i in 1 ... 10 print ("i is gelijk aan \ (i)")
terwijl
De terwijl
loop komt in twee smaken, terwijl
en repeat-while
. Het belangrijkste verschil is dat de reeks uitspraken van a repeat-while
lus wordt altijd minstens een keer uitgevoerd, omdat de staat van de repeat-while
wordt geëvalueerd aan het einde van elke iteratie. Het volgende voorbeeld illustreert dit verschil.
var c = 5 var d = 5 terwijl c < d print("c is smaller than d") repeat print("c is smaller than d") while c < d
De printverklaring van de terwijl
lus wordt nooit uitgevoerd, terwijl die van de repeat-while
lus wordt eenmaal uitgevoerd.
Vaak, voor
loops kunnen worden herschreven als terwijl
loops, en het is vaak aan de ontwikkelaar om te bepalen welk type lus in een bepaalde situatie moet worden gebruikt. Het volgende voor
en terwijl
loops resulteren in dezelfde output.
voor i in 0 ... <10 print(i) var i = 0 while i < 10 print(i) i += 1
Er is veel meer om de stroom in Swift te beheersen dan wat we in dit artikel hebben behandeld, maar je hebt nu een basiskennis om je reis naar Swift voort te zetten. Ik hoop dat deze tutorial je heeft laten zien hoe de implementatie van de Swift-besturingsstroom erg lijkt op die van andere programmeertalen, maar met een draai.
In de rest van deze serie maken we meer gebruik van de besturingsstroomconstructies van Swift en krijg je geleidelijk een beter inzicht in de subtiele verschillen tussen Swift en talen zoals Objective-C. In de volgende aflevering van deze serie gaan we functies verkennen.
Als je snel wilt beginnen met het bouwen van apps met de Swift-taal, hebben we daar een cursus voor!
Of bekijk enkele van onze andere tutorials en cursussen over Swift- en iOS-ontwikkeling!