I den föregående artikeln lärde du dig om variabler, konstanter och några av de vanliga datatyperna, som heltal, floats och strängar. I denna artikel zoomar vi in på samlingar. Swifts standardbibliotek definierar tre samlingstyper: uppsättningar, arrays och ordböcker. Låt oss börja med arrays.
Om du är bekant med Objective-C, JavaScript eller PHP, blir det inte svårt att förstå arrays. En array är en beställd, nollindexerad värdesamling. Men det finns några viktiga skillnader mellan arrays för Swift och andra programmeringsspråk.
Den första viktiga skillnaden jämfört med arrays i Objective-C är att värdena som lagras i en array alltid är av samma typ. Först kan det verka som en betydande begränsning, men det är det faktiskt inte. Faktum är att denna begränsning har en viktig fördel. Vi vet exakt vilken typ vi kommer tillbaka när vi frågar arrayen för ett av dess värden.
En annan viktig skillnad är den typ av värden en array kan lagra. I mål-C kan en array bara lagra värden för en klasstyp. Swift har inte denna begränsning. En array i Swift kan lagra strängar, heltal, floats och klassinstanser. Hur detta fungerar och varför det här är möjligt i Swift kommer att bli tydligt senare i denna serie när vi täcker klasser och strukturer.
Medan det finns flera sätt att skapa en array, måste du komma ihåg att Swift behöver veta vilken typ av värden du planerar att lagra i arrayen. Skapa en ny lekplats i Xcode, som vi gjorde i föregående artikel, och lägg till följande rader på din lekplats.
var array1: Arrayvar array2: [String] var array3 = ["Apple", "Pear", "Orange"]
Den första och andra raden betyder samma sak. Den andra raden är bara stenografi. De torgformiga parentesna omsluter Sträng
sökord berätta Swift att vi förklarar en array som bara kan innehålla Sträng
objekt.
Du kan läsa den första raden av kod som: "Vi förklarar en variabel som heter matris1
av typ Array
som bara kan innehålla Sträng
objekt. "Kolonet betyder av typ.
Den tredje raden visar oss hur man initialiserar en array med hjälp av en array bokstavlig. Array-bokstäver ser väldigt ut som array-bokstäver i mål-C. Huvudskillnaden är frånvaron av @
symbol som föregår torgets parentes och strängtexten.
Det finns också ett fint sätt att initiera en array med ett fördefinierat antal standardvärden. Syntaxen kan vara förvirrande först, men ta en stund att låta det sjunka in.
var a = [String] (upprepa: "Test", räkna: 5)
Den resulterande raden innehåller fem strängar, där varje sträng är lika med "Testa"
. För att bättre förstå ovanstående initialisering, ta en titt på följande två kodkategorier där vi initierar en tom rad strängar.
var b = Array() var c = [String] ()
Oroa dig inte om du fortfarande är förvirrad. Vi utforskar syntaxen närmare när vi börjar hantera klasser och funktioner. I den här artikeln fokuserar vi bara på samlingar.
En aspekt av Swift som du snabbt kommer att uppskatta är hur man förklarar mutable samlingar. Ovanstående kodbit, förklarar exempelvis tre mutable arrays. En mutabel array definieras genom att använda var
nyckelord. Det är så enkelt.
Om du inte vill att en array ska vara smidig, använd sedan låta
sökord istället. Swift syftar till att vara intuitivt och lätt att använda, och dess genomförande av mutability är ett perfekt exempel på det målet.
För att komma åt värdena som lagras i en array använder vi samma prenumerationssyntax som i Mål-C. I följande exempel frågar vi array3
för dess andra element, strängen "Päron"
.
array3 [1]
Byta värde lagrat i index 1
är lika enkelt som att tilldela ett nytt värde med samma subscriptsyntax. I det följande exemplet ersätter vi "Päron"
på index 1
med "Persika"
.
array3 [1] = "Peach"
Detta är endast möjligt eftersom arrayen är mutabel, det vill säga vi använde var
sökord för att deklarera matrisen. Att mutera en konstant uppsättning är inte möjlig. Det finns mer avancerade tekniker för att manipulera innehållet i en array, men det underliggande konceptet är detsamma.
Sammanfoga två arrays är lika enkelt som att lägga dem ihop. I följande exempel förklarar och sammanfogar vi två oföränderliga arrays. Observera att den resulterande matrisen, c
, behöver inte vara mutable för att detta ska fungera.
låt a = [1, 2, 3] låt b = [4, 5, 6] låt c = a + b
Det är dock viktigt att de värden som lagras i en
och b
är av samma typ. Anledningen skulle vara uppenbart nu. Som jag nämnde tidigare måste värdena som lagras i en array vara av samma typ. Följande exempel resulterar i ett fel.
låt a = [1, 2, 3] låt b = [1.5, 5.2, 6.3] låt c = a + b
För att lägga till en matris till en variabel array använder vi +=
operatör. Observera att operand till höger är en matris. Denna operation skulle inte fungera om vi tog bort de firkantiga parenteserna 4
.
var a = [1, 2, 3] a + = [4]
Arrayer är föremål där du kan utföra ett brett spektrum av operationer. Arrays avslöjar ett antal funktioner eller metoder. För att anropa en metod på ett objekt använder du pricknotationen. Lägg till följande rad på din lekplats för att lägga till ett objekt till array3
.
array3.append ( "Cherry")
Låt oss se hur många saker array3
innehåller genom att inspektera värdet av dess räkna
fast egendom. Detta matar ut 4
till resultatrutan.
array3.count
Det är också möjligt att infoga ett objekt i ett specifikt index genom att påkalla arrayen infoga (_: vid :)
metod som visas nedan. De infoga (_: vid :)
Metoden accepterar mer än en parameter, och syntaxen kan se lite udda först.
array3.insert ("Prune", vid: 2)
Liksom Objective-C stöder Swift namngivna parametrar för att förbättra läsbarheten. Resultatet är att koden är lättare att läsa och förstå, och funktioner eller metoder behöver inte mycket förklarande vad gäller vad de gör. Det är till exempel tydligt att infoga (_: vid :)
Metoden infogar ett element i indexet 2
.
Medan Swift är mer koncis och mindre verbos än Objective-C, stöder den namngivna parametrar. Om du kommer från PHP, Ruby eller JavaScript, så är det verkligen något som väntar på att bli van vid.
Vad jag verkligen tycker om Swift är de Ruby-liknande bekvämlighetsegenskaper och metoder för Swifts standardbibliotek. En array har till exempel en är tom
egenskap som berättar om arrayen innehåller några element. Detta är inget annat än kortfattat för att kontrollera arrayen räkna
fast egendom. Resultatet är emellertid kod som är mer koncis och lättare att läsa.
array3.isEmpty
Ordböcker beter sig väldigt likt ordböcker i mål-C. En ordbok lagrar en oordnad värdesamling. Varje värde i ordlistan är kopplat till en nyckel. Med andra ord lagrar en ordbok ett antal nyckel / värdepar.
Liksom med arrays måste nycklarna och värdena som lagras i en ordlista vara av samma typ. Det betyder att om du frågar en ordlista för värdet av en viss nyckel vet du vilken typ ordlistan kommer att returnera.
Att deklarera en ordbok liknar att deklarera en matris. Skillnaden är att du måste ange typen för både nycklar och värden. Följande exempel visar tre sätt att deklarera en ordlista.
var dictionary1: ordbokvar dictionary2: [String: Int] var dictionary3 = ["Apple": 3, "Pear": 8, "Orange": 11]
Den andra raden är stenografi för första raden. Nycklarna till dessa ordböcker måste vara av typ Sträng
medan värdena förväntas vara av typen int
. De var
nyckelordet indikerar att ordböckerna är mutable.
Du kan läsa den första raden av kod som: "Vi förklarar en variabel som heter dictionary1
av typ Ordbok
som bara kan innehålla nycklar av typen Sträng
och värden av typ int
."
Den tredje raden illustrerar hur vi kan initiera en ordlista med hjälp av en ordbok bokstavlig. Detta liknar den syntax vi använder i Objective-C, men observera att de krökta stagarna ersätts med kvadratparentes och den bokstavliga är inte prefixad med en @
symbol.
Åtkomst av värden liknar att man får tillgång till värden för en array. Den enda skillnaden är att du använder nyckeln istället för indexet för det värde du behöver komma åt. Följande exempel illustrerar detta.
låt värdet = dictionary3 ["Apple"] print (value)
Du märker att Xcode berättar för oss att värdet på värde
är inte 3
, men Valfritt (3)
. Vad betyder det här? Swift använder alternativ för att sätta in värden som kan vara en av två saker, ett värde eller noll
. Oroa dig inte om alternativen vid denna tidpunkt. Vi kommer att fokusera på alternativ i nästa artikel i denna serie. Låt mig bara berätta att alternativ är ett annat viktigt begrepp i Swift programmeringsspråket.
Det är intressant att påpeka att syntaxen för att komma åt ett värde i en ordlista är identisk med den för arrays om ordlistorna är av typ int
. Ta en titt på följande exempel för att se vad jag menar.
var dictionary4 = [0: "Apple", 1: "Pear", 2: "Orange"] låt frukt = dictionary4 [0]
Som med arrays definierar Swift standardbiblioteket ett brett spektrum av operationer som du kan utföra på ordböcker. Du kan fråga en ordlista för dess antal nyckel / värdepar genom dess räkna
fast egendom. Att ta bort ett nyckel / värdepar är enkelt och intuitivt, som det följande exemplet illustrerar. Det här är naturligtvis bara möjligt om ordlistan är omöjlig.
dictionary4.removeValue (förKey: 0)
När du börjar lära dig Swift kommer du kanske att köra in kodrader som ser udda eller förvirrande. Ta en titt på följande rad, där vi först deklarerar en ordlista och tar bort dess nyckel / värdepar.
var dictionary = [String: Int] () ordbok ["Apelsiner"] = 2 ordbok ["Äpplar"] = 10 ordbok ["Pears"] = 5 ordbok = [:]
Du måste erkänna att den sista raden ser lite udda ut. Eftersom Swift vet vilka typer av nycklar och värden som kan lagras i ordbok
, tömning av ordlistan är lika enkelt som att tilldela en tom ordbok till den.
Det finns inget behov av att ange typerna för nycklarna och värdena i det här fallet, eftersom vi redan gjorde när vi förklarade ordlistan i första raden. Detta pekar på en annan viktig detalj, det vill säga typen av värden du kan lagra i arrayer och ordböcker kan inte ändras när samlingen är deklarerad.
Satser är mycket liknade arrays genom att de lagrar en samling värden av samma typ. Men det finns flera viktiga skillnader. Elementen som lagras i en uppsättning är oordnade, och varje objekt kan bara visas en gång i en uppsättning.
Att arbeta med uppsättningar är lite annorlunda än att arbeta med arrays. Ta en titt på nästa exempel där vi förklarar tre uppsättningar. De set1
variabeln är av typen Uppsättning
, en uppsättning som bara kan innehålla värden av typen Sträng
.
var set1: Setvar set2 = Ställ in () var set3: Set = ["Apple", "Pear", "Orange"]
De set2
variabeln är en tom uppsättning, och vi använder en array bokstavlig i det tredje exemplet för att skapa och fylla i en mutabel uppsättning som innehåller tre värden. Tack vare Swifts typinferens kan vi släppa ut typen av uppsättningen.
var set3: Set = ["Apple", "Pear", "Orange"]
Att arbeta med uppsättningar liknar att arbeta med arrays. Vi kan fråga om antalet element som lagras i en uppsättning genom att inspektera setets räkna
fast egendom.
set3.count
Att sätta in ett element är enkelt. Eftersom elementen i en uppsättning är oordnade behöver vi inte ange platsen för det nya elementet.
set3.insert ( "Prune")
Och detsamma gäller att ta bort ett element från en uppsättning.
set3.remove ( "Orange")
Du kan också fråga en uppsättning om den innehåller ett visst element.
set3.contains ( "Apple")
Jag hänvisar ofta till uppsättningar som lätta versioner av arrays. Om ordningen av elementen inte är viktig eller du vill försäkra dig om att varje element bara kan visas en gång i en samling, så är uppsättningar vägen att gå.
Du kommer att älska tuples. Tuples är inte samlingar, men som samlingar, grupperar de också flera värden. Liksom arrays och ordböcker kan tuples innehålla värden av vilken typ som helst. Huvudskillnaden är dock att värdena som lagras i en tuple inte behöver vara av samma typ. Låt oss titta på ett exempel för att förklara detta mer i detalj.
importfonden var currency = ("EUR", 0.81) var time = (Datum (), "Detta är mitt meddelande.") Var email = ("Bart Jacobs", "[email protected]")
Det första exemplet deklarerar en tupel som heter valuta
det är av typ (String, Int)
. Den andra tupeln, tid
, innehåller a Datum
exempel och en sträng bokstavlig. Värdena lagrade i e-post
är båda av typen Sträng
, som betyder e-post
är av typ (Sträng, sträng)
.
För att få tillgång till ett värde som är lagrat i en tupel använder du indexet som motsvarar det värde du är intresserad av.
var rate = currency.1 var message = time.1 var name = email.0
Xcode visar oss indexerna för varje värde som lagras i en tupel i resultatrutan på lekplatsen till höger.
För att förbättra läsbarheten kan du namnge värdena som är lagrade i en tupel. Resultatet är att du kan komma åt värdena på tupeln genom deras namn istället för deras index. Deklarera en tuple är något annorlunda i det fallet.
var currency = (namn: "EUR", betygsätt: 0.81) låt currencyName = currency.name låt currencyRate = currency.rate
Det finns en andra, mer elegant sätt att arbeta med värdena som lagras i en tupel. Ta en titt på följande exempel där vi sönderdelar innehållet i valuta
.
låt (currencyName, currencyRate) = valuta
Värdet av valuta
på index 0
lagras i CurrencyName
, och värdet vid indexet 1
lagras i växlingskurs
. Det finns inget behov av att ange typen för CurrencyName
och växlingskurs
eftersom Swift infekterar typen från de värden som lagras i valuta
. Med andra ord, CurrencyName
är av typ Sträng
, och växlingskurs
är av typ Flyta
.
Om du bara är intresserad av specifika värden på en tuple kan du använda ett understreck för att berätta för Swift vilka värden du inte är intresserad av.
låt (currencyName, _) = valuta
Arrays och ordböcker är grundläggande komponenter i nästan alla programmeringsspråk, och Swift är inte annorlunda. Medan samlingar beter sig lite annorlunda i Swift, tar det inte lång tid att bli bekant med Swifts samlingstyper om du har arbetat med arrays och ordböcker på andra programmeringsspråk. I nästa handledning undersöker vi alternativ och kontrollflöde.
Vi har byggt en komplett guide för att hjälpa dig att lära dig Swift, oavsett om du bara har börjat med grunderna eller vill utforska mer avancerade ämnen.
Om du vill komma igång med snabbt språk snabbt, kolla in vår kurs om att skapa iOS-appar med Swift.
Eller kolla in några av våra andra handledning och kurser om Swift och iOS utveckling!