Swift from Scratch Optionals en Control Flow

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.

1. Optionals

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.

Wat is een optionele?

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.

Gedwongen uitpakken

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.

Optionele binding

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

Wat is 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.

2. Stuurstroom

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.

grondig

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

fallthrough

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.

patronen

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.

Value Binding

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 

Conclusie

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!