En introduksjon til Swift Del 1

På WWDC 2014 har Apple introdusert en av de største oppdateringene til iOS siden 2008 fra utviklerens synspunkt. De introduserte HomeKit, HealthKit, CloudKit og Extensions, for bare å nevne noen. Men den største overraskelsen ut av WWDC 2014 var introduksjonen av et helt nytt programmeringsspråk, Swift.

Swift er et fantastisk programmeringsspråk som er bygget opp fra grunnen for å være effektivt og trygt. Den bruker de samme APIene som Objective-C gjør. Eller hva du kan gjøre i Objective-C, kan du gjøre i Swift. Det introduserer også noen nye konsepter som langtidsprogrammerne vil sette pris på, og noen av dem vil jeg dekke i denne innledende serien på Swift.

I denne serien skal jeg anta at du allerede er kjent med Objective-C. I den første artikkelen i denne serien snakker jeg om Swifts filosofi, filstruktur og syntaks. I den andre artikkelen zoomer jeg inn på mer avanserte aspekter av Swifts syntaks, for eksempel valgmuligheter og minnehåndtering. Hang på hatter, folk, det kommer til å bli en doozy.

1. Filosofi

For bedre å forstå Swift har Apple vært å konditionere oss med strukturelle forbedringer i Objective-C de siste årene. Mål-C-forbedringer som kodeblokker, bokstavelig array og ordboksdefinisjoner, og ARC (Automatic Reference Counting) er bare noen få ting Apple har lagt til Objective-C som lette overgangen til Swift.

En viktig søyle i Swifts filosofi er kodeinitialisering. Alle objekter og variabler når de er definert i Swift må initialiseres i kode. Et uninitialisert objekt eller en variabel vil resultere i en kompileringstidsfeil i Swift. Dette sikrer at et objekt eller en variabel alltid har en verdi. Det finnes ett spesielt tilfelle i Swift for når en startverdi ikke kan defineres. I dette spesielle tilfellet kalles variabelen en valgfri. Vi vil dekke opsjoner i den andre delen av denne serien.

En annen viktig søyle er grenens fullstendighet. Alle betingede grener, va det hvis eller bryter / case, må dekke alle forhold. På denne måten kan ingen kode falle gjennom uten at den blir dekket. Mangler en betingelse i avdelingserklæringen din vil bli fanget og generere en kompileringstidsfeil.

Et siste element i Swifts filosofi er dens preferanse til konstanter over variabler. Swift definerer variabler og konstanter på følgende måte:

la noenConstant: String = "Dette er en konstant" var noenVariabel: String = "Dette er en variabel"

I eksempelet ovenfor er det la Søkeord brukes til å definere en konstant mens Var Søkeord definerer en variabel. Ved å gjøre definisjonen av konstanter så lett, oppfordrer Apple bruken av konstanter når det er mulig. Dette fører til sikrere kode i et multithreaded miljø og bedre kodeoptimalisering som kompilatoren vet at en konstants verdi ikke vil endre seg.

Nå er det mye mer å Swift enn noen få syntaks og formateringsforbedringer. Swift ble bygget fra grunnen for å fikse mange vanlige C / C ++, og iboende Objective-C, kilder til krasjer. Spørsmål som:

  • ut-av-bundne indekser i arrays
  • uninitialized data
  • ukontrollerte returtyper
  • ukontrollert peker tilgang
  • implisitt faller gjennom 
  • goto feil

Som noen som programmerer både iOS og Android, vet jeg førstehånds hvor mye mer morsomt koding for iOS-plattformen egentlig er med kakao og uikit. Denne serien vil vise deg hvor mye mer moro koding kan være ved å legge til Swift i blandingen.

2. Filstruktur

I Mål-C har vi Overskrift filer (.h) og gjennomføring filer (.m). Dette er noe Objective-C arvet fra C-språket.

I Swift defineres en klasse i en enkelt implementeringsfil (.fort) som inkluderer alle definisjoner og implementeringer av klassen. Dette minner om andre språk som Java og C #.

Borte er behovet for juggling header filer og legge til pesky #IFNDEF øverst på headerfiler.

3. Syntaks

Det første du vil legge merke til om Swift er forsvinningen av semikolonet på slutten av hver setning. I Swift anses hver linje som en uttalelse, og vi gjør det ikke  legg til et semikolon på slutten av hver linje.

Jeg understreker , fordi ingenting stopper deg fra å legge til semikolon på slutten av uttalelsene dine. Jeg vil fortsette å legge til semikolon på slutten av hvert utsagn som jeg tror det øker lesbarheten. Det er også veldig vanskelig å bli kvitt vana med å legge til semikoloner som kakaoutviklere har gjort i mange år.

En annen viktig endring i Swift er at krøllete bånd er obligatorisk for hvis uttalelser. Det betyr ikke mer Heartbleed bugs.

Syntaks kan være et komplekst emne for å skrive om. Swift har mange subtiliteter som kan ta veldig lang tid å gå over, men det er ikke målet med denne artikkelen. For kortfattet vil jeg konsentrere meg om hvilke endringer en Objective-C-utvikler vil legge merke til.

4. Likheter med mål-C

Jeg begynner med å vise deg tre kodestykker som illustrerer noen av likhetene med Objective-C. Det vil hjelpe deg i forståelsen av Swift-språket.

// Mål-C for (int indeks = 0; indeks < 5; i++)  NSLog(@"%d",index);  // Swift for index in 1… <5  plrintln("\(index)"); 
// Mål-C-bryter (indeks) tilfelle 0: break; tilfelle 1: pause standard: break;  // Swift-bryter (indeks) tilfelle 0: tilfelle 1: standard: // ingen pause setning
// Mål-C hvis (indeks == 0)  // Swift hvis indeks == 0  // parenteser er valgfrie // krøllete braces er påkrevd

Objective-C programmerere vil oppdage at Swift har de samme gren- og iterasjonssagnene du allerede er kjent med, for eksempel hvis / annet,  til løkker, for i sløyfer og bytte om uttalelser.

Swift inkluderer to rekkevidde operatører, ... < og ... , å angi en rekke verdier. I det ovennevnte til loop, bruker vi Half-closed Range Operator, ... <, å angi et utvalg av verdier som inkluderer 1, 2, 3 og 4, men det utelukker 5. Den andre rekkevidde operatøren er lukket operatør, ... . Den spesifiserer en rekke verdier som inkluderer verdien på begge sider av operatøren med lukket rekkevidde. For eksempel, 1 ... 5. angir en rekke verdier fra 1 til 5, inkludert 5.

5. Definere variabler og konstanter

La oss se på eksemplet jeg viste deg tidligere.

la noenKonstant: String = "Dette er en konstant"; var noenVariabel: String = "Dette er en variabel";

I Swift definerer vi konstanter med la søkeord og variabler ved hjelp av Var søkeord. Tyktarmen, : ,er en markør for å definere typer. I eksempelet ovenfor lager vi en konstant og en variabel av typen string.

Vi initialiserer også konstanten og variabelen med en streng. I Swift defineres strenger som C-strenger i Objective-C, de er ikke foran en @ symbol.

Mål-C er et sterkt skrevet språk, som betyr at typen av en variabel eller parameter alltid må angis. Swift er også et sterkt skrevet språk, men Swift er litt smartere da kompilatoren vil avlede en variants type. Kompilatoren sørger også for at ingen feilaktig avstøpning av variabler oppstår uten din uttrykte kunnskap og intervensjon.

Hvis vi skriver om eksempelet ovenfor, lar det være å utføre typegjennomtrengning, ser kodebiten ut som følger:

la noenConstant = "Dette er en konstant"; var someVariable = "Dette er en variabel"; la noenInt = 1; la noenFloat = 1,0;

Dette er mye bedre og koden er mye renere. Kompilatoren er smart nok til å forstå det someInt er en int og someFloat er en Dobbelt.

6. Strings

En måte å få en ide om styrken til et språk ved, er å utforske hvordan det håndterer strengmanipulering. Mål-C har mange funksjoner og funksjoner som lar oss håndtere snorer, bedre enn de fleste språk, men de pleier å være verbose og forvirrende fra tid til annen.

La oss starte med et mål-C eksempel. For å sammenkoble to strenger i Objective-C, gjør vi følgende:

NSString * streng = @ "Hei"; NSString * greeting = [string stringByAppendingString: @ "World!"];

I Swift, for å legge til en streng til en annen streng, bruker vi + operatør. Det er så enkelt.

la streng = "Hei" la hilsen = streng + "Verden!"

Strings i Swift er Unicode, noe som betyr at vi kan skrive:

la streng = "你好 世界"

Vi kan iterere tegnene til en streng ved hjelp av en for i setning som vist i følgende eksempel. Vi kan bruke en for i loop for å iterate Unicode-strengene også. Det er virkelig så kult.

la str = "Hei"; for char in str println (char);  // utganger // H // e // l // l // o

En siste ting jeg vil dekke om strenger før du går videre er strenginterpolering. I Mål-C, hvis vi ønsker å sende ut en streng med variabler, anvender vi [NSString stringWithFormat:]. I Swift kan variabler bli integrert. Ta en titt på følgende eksempel.

la x = 4; la y = 5; println ("\ (x) x \ (y) = \ (x * y)") // utganger // 4 x 5 = 20

Hvis du vil bruke strenginterpolering, vikler du variabelen eller funksjonssamtalen i parentes og legger et tilbakeslag foran den, \ (uttrykk).

7. Arrayer og ordbøker

Array & Ordbok

Som en Objective-C programmerer, er du allerede kjent med arrays og ordbøker. Swift har også samlingsklasser og legger til noen ekstra funksjoner for dem.

Hvordan bruker du samlinger i Swift? I Swift kalles de Array og Ordbok. Deklarere en matrise i Swift ligner på å deklarere en matrise i Objective-C, ved å bruke et sett med firkantede parenteser, [], men uten en @ symbol foran dem.

la noenArray: [String] = ["en", "to", "tre"]; var noenAndreArray: [String] = ["alpha", "beta", "gamma"];

Det samme gjelder for ordbøker. I stedet for å bruke krøllete braces bruker du firkantede parenteser.

la noenDictionary: [String: Int] = ["one": 1, "two": 2, "three": 3]; var noeOtherDictionary: [String: Int] = ["katter": 1, "hunder": 4, "mus": 3];

mutability

Hvis en Array objektet tilsvarer en NSArray objekt og a Ordbok objektet tilsvarer en NSDictionary objekt, så hvordan lager vi mutable arrays og ordbøker i Swift?

Svaret er veldig enkelt, erklære objektet som en variabel. Med andre ord, i det forrige eksempelet someArray er ekvivalent av en NSArray forekomst og someOtherArray det av en NSMutableArray forekomst. Dette gjelder også ordbøker. I forrige eksempel, someDictionary er ekvivalent av en NSDictionary forekomst og someOtherDictionary det av en NSMutableDictionary forekomst. Det er pent, ikke sant?

Mens mål-C-arrays og ordbøker kun kan inneholde objekter, kan i samlinger inneholde samlinger både objekter og primitive datatyper, som heltal og flyter. En annen viktig forskjell med Objective-C er at samlinger i Swift er skrevet, eksplisitt eller gjennom typegjennomgang ved kompileringstid. Ved å spesifisere typen objekter i en samling, legger Swift ekstra sikkerhet til disse samlingene.

Selv om vi kan utelate en variants type når de erklærer det, endrer det ikke det faktum at kompilatoren vil tildele typer til objektene i en samling. Ved hjelp av typegjennomtrengning bidrar det til å holde koden leselig og lys.

Vi kan omklare Array og Ordbok objekter vi erklærte tidligere som følger:

la noenArray = ["en", "to", "tre"]; var someOtherArray = ["alpha", "beta", "gamma"]; la someDictionary = ["one": 1, "two": 2, "three": 3]; var noenOtherDictionary = ["katter": 1, "hunder": 4, "mus": 3];

Kompilatoren vil inspisere samlingene under initialiseringen og avlede riktig type. Med andre ord forstår det det someArray og someOtherArray er en samling av string objekter og someDictionary og someOtherDictionary er ordbøker med taster av typen string og verdier av typen int.

Samling manipulering

Hvis du legger til et objekt eller en annen matrise i en matrise, ligner det meget på strengekonjugering ved at vi også bruker + operatør.

var array = ["en", "to", "tre"]; // mutable array array + = "four"; // legge element til array array + = ["fem", "six"]; // legge til array til array

Manipulere ordbøker er like enkelt.

var ordbok = ["katt": 2, "hund": 4, "slange": 8]; // mutable ordbok ordbok ["løve"] = 7; // legge element til ordbok ordbok + = ["bjørn": 1, "mus": 6]; // legge til ordbok i ordbok

Typede samlinger

Tidligere nevnte jeg at samlinger i Swift er skrevet, men hva betyr det? Hvis vi definerer en samling som inneholder string objekter, du kan bare legge til string gjenstander for den samlingen. Hvis du ikke gjør det, vil det føre til en feil.

La oss se på et eksempel for å avklare dette. Vi definerer en samling av Bil objekter. Følgende kodestykke viser Bil klasses Definisjon og en mutable array biler, inneholder tre Bil forekomster.

// Bilklasse klasse Bil var hastighet = 0.0 func akselerere (ved: Double = 1.0) -> Bool speed + = by; returnere sant;  var biler = [bil (), bil (), bil ()]; 

Bak kulissene vil kompilatoren avlede typen av matrisen. Hvis vi vil legge til en ny Bil eksempel på samlingen, kan vi bare bruke + operatør som vist nedenfor.

biler + = bil ();

Hvis du legger til et objekt av en annen type, vil det imidlertid oppstå en feil.

biler + = "noen strenger"; // dette vil føre til en kompilatorfeil

Dette har den ekstra fordelen av typen sikkerhet for å hente objekter fra samlinger. Det eliminerer også behovet for å kaste innsamlingsobjekter før de brukes.

I vårt eksempel, a Bil objektet har en akselerere metode. Fordi en samling er skrevet, kan vi hente et element fra gruppen og umiddelbart påkalle en metode på objektet, i en linje med kode. Vi trenger ikke å bekymre oss om elementets type siden samlingen bare inneholder Bil objekter.

biler [0] .accelerere (ved: 2.0);

For å oppnå det samme i Objective-C med samme nivå av sikkerhet, må vi skrive følgende:

id pointer = biler [0]; hvis ([peker erKindOfClass: [Bilklasse]]) Bil * bil = (Bil *) peker; [bil akselerere med: 2.0]; 

Til slutt, for å iterere en matrise, bruker vi en for i løkke:

for bil i biler car.accelerate (ved: 2.0); 

For å iterere en ordbok, bruker vi også en for i løkke:

for (nøkkel, verdi) i noenDictionary println ("Key \ (key) har verdi \ (verdi)"

Som du kan se, er skrevet samlinger en kraftig funksjon av Swift-språket.

Konklusjon

 Vi har allerede lært litt om Swift-språket, og du bør ta deg tid til å la det synke inn. Jeg anbefaler at du laster ned Xcode 6 så snart som mulig og begynner å bruke det du har lært i denne artikkelen i Xcodes nye Lekeplass trekk. Lekeplasser lar deg spille med Swift i sanntid.

Det er det for denne artikkelen. I neste utgave av denne serien ser vi på tuples, funksjoner, nedleggelser, klasser og sist men ikke minst, alternativene. Du vil også lære hvordan minnehåndtering fungerer i Swift. Følg med.