Swift fra Scratch: Arv og Protocols

Swift fra Scratch: Arv og protokoller
34
Del
11
Del
Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie som heter Swift fra Scratch.Swift fra Scratch:. En introduksjon til Klasser og StructuresSwift fra Scratch: Delegering og Egenskaper

Hvis du har lest de foregående artiklene i denne serien, bør du ha en god forståelse av de grunnleggende av Swift programmeringsspråk nå. Vi snakket om variabler, konstanter og funksjoner, og i forrige artikkel dekket vi det grunnleggende objektorientert programmering i Swift.

Mens lekeplasser er et flott verktøy for å spille med Swift og lære språket, er det på tide å flytte på og lage vår første Swift prosjekt i Xcode. I denne artikkelen skal vi skape grunnlaget for en enkel to-do program som bruker Xcode og Swift. Underveis vil vi lære mer om objektorientert programmering, og vi vil også ta en nærmere titt på integrasjon mellom Swift og Objective-C.

Forutsetninger

Hvis du vil liker å følge med meg, så sørg for at du har Xcode 6.3 eller nyere installert på din maskin. I skrivende stund, Xcode 6.3 er i beta og tilgjengelig fra Apples iOS Dev Center til registrerte iOS-utviklere.

Bakgrunnen for å kreve Xcode 6.3 eller høyere er å være i stand til å dra nytte av Swift 1.2, som Apple introdusert for noen dager siden. Swift 1.2 introduserer en rekke store filer som vi vil dra nytte av i resten av denne serien.

1. Prosjektet Setup

Trinn 1: Velg en mal

Launch Xcode 6.3 eller høyere, og velg New > Prosjekt ... fra Fil-menyen. Fra listen over iOS Application maler, velger Enkel visning Application mal og klikk Neste

Trinn 2:. Konfigurer Prosjekt

Navn prosjektet ToDo og sette språk til Swift. Kontroller at Devices er satt til iPhone og avkrysningsruten Bruk kjernedata er avmerket. Klikk på Neste for å fortsette.

Fortell Xcode hvor du ønsker å lagre prosjektet ditt, og klikk Opprett lavt i høyre for å lage din første Swift prosjektet.

2. Prosjektet Anatomy

Før vi fortsetter vår reise inn Swift, la oss ta et øyeblikk å se hva Xcode har skapt for oss. Hvis du er ny på Xcode og iOS utvikling, da det meste av dette vil være nye for deg. Ved å jobbe med en Swift prosjekt, men vil du få en bedre følelse av hvordan klasser og strukturer se ut og oppføre seg i Swift.

Prosjektet mal skiller seg ikke mye fra et prosjekt som er opprettet med Objective-C som programmeringsspråket. De viktigste forskjellene er knyttet til AppDelegate og ViewController klasser.

Hvis du har jobbet med Objective-C i det siste, så vil du merke at prosjektet malen inneholder mindre filer. Det er ingen header (.h) eller gjennomføring (BFD) filer som finnes i vårt prosjekt. I Swift, klasser har ingen egen header filen der grensesnittet er deklarert. I stedet er en klasse erklært og implementert i en enkelt .swift fil.

Vårt prosjekt inneholder i dag to Swift-filer, en for AppDelegate klassen, AppDelegate.swift, og en annen for ViewController klassen, ViewController.swift . Prosjektet omfatter også et storyboard, Main.storyboard, og en XIB fil for lanseringen skjermen, LaunchScreen.xib. Vi vil samarbeide med dreieboken litt senere i denne artikkelen. Det foreløpig kun inneholder scenen for ViewController klassen.

Det finnes en rekke andre filer og mapper som inngår i prosjektet, men vi kommer til å ignorere de for nå. De spiller ingen viktig rolle i omfanget av denne artikkelen.

3. Arv

Det første vi vil berøre i denne artikkelen er arv, et felles paradigme i objektorientert programmering. I Swift, bare klasser kan arve fra en annen klasse. Med andre ord, strukturer og enumerations ikke støtter arv. Dette er en av de viktigste forskjellene mellom klasser og strukturer.

Åpne ViewController.swift å se arv i aksjon. Grensesnittet og gjennomføring av ViewController klassen er pen bare-bones, som vil gjøre det lettere for oss å fokusere på det essensielle.

UIKit

På toppen av ViewController.swift, bør du se en import regnskapet for UIKit rammeverk. Husk at UIKit rammeverket gir infrastrukturen for å skape en funksjonell iOS søknad. Importen uttalelse på toppen gjør denne infrastrukturen tilgjengelig for oss i ViewController.swift.
Import UIKit
Super

Under import uttalelse, vi definerer en ny klasse som heter ViewController. Kolon etter klassenavnet ikke oversette til er av typen
som vi så tidligere i denne serien. I stedet klassen etter kolon er super av ViewController klassen. Med andre ord, kan følgende kodebit leses som vi definere en klasse som heter ViewController som arver fra UIViewController
klasse ViewController. UIViewController {}

Dette forklarer også tilstedeværelsen av import uttalelse på toppen av ViewController.swift siden UIViewController klassen er definert i UIKit rammeverket.

Overstyrer

ViewController klassen omfatter i dag to metodene, men merker at hver metode er prefiks med overstyring nøkkelordet. Dette indikerer at metodene er definert i klassens superklasse-eller høyere opp arven tree-og overstyres av den ViewController klassen
klasse ViewController. UIViewController {overstyring func viewDidLoad () {super.viewDidLoad ()} overstyring func didReceiveMemoryWarning () {super.didReceiveMemoryWarning ()}}

Den overstyring konstruere ikke eksisterer i Objective-C. I Objective-C, du implementere en overstyrt metode i en underklasse uten eksplisitt indikerer at det overstyrer en metode høyere opp arven treet. The Objective-C runtime tar seg av resten.

Det samme er tilfelle i Swift, men de overstyrer søkeord legger sikkerheten til metode altoverskyggende. Fordi vi har prefikset den viewDidLoad metoden med overstyring søkeord, forventer Swift denne metoden i klassens superklasse eller høyere opp arven treet. Enkelt sagt, hvis du overstyre en metode som ikke finnes i arv treet, vil Swift kaste en feil. Du kan teste dette ved feilstaving den viewDidLoad metoden som vist nedenfor.

4. Brukergrensesnitt

Erklærte Outlets

La oss legge til en tabell utsikt til visningen kontrolleren til å vise en liste over gjøremål. Før vi gjør det, må vi opprette et utløp for tabellvisningen. Et uttak er noe mer enn en eiendom som er synlig for og kan settes i Interface Builder. Å erklære en stikkontakt i ViewController klassen, prefiks vi eiendommen, en variabel, medIBOutlet attributtet
klasse ViewController. UIViewController {IBOutlet Var Tableview: UITableView! styre func viewDidLoad () {super.viewDidLoad ()} overstyring func didReceiveMemoryWarning () {super.didReceiveMemoryWarning ()}}

Merk at uttaket er en implisitt pakket valgfritt. En hva? La meg starte med å si at et uttak må alltid være en valgfri type. Grunnen til dette er enkel. Hver egenskap av ViewController klassen må ha en verdi etter initialisering. En stikkontakt, derimot, er bare knyttet til brukergrensesnittet under kjøring etter at ViewController eksempel er initialisert derav valgfri type.

Vent et øyeblikk. Den Tableview uttaket er erklært som en implisitt pakket valgfritt, ikke et valgfritt. Ikke noe problem. Vi kan erklære Tableview uttaket som en valgfri ved å erstatte utropstegn i ovennevnte biten med et spørsmålstegn. Det ville kompilere helt fint. Dette ville imidlertid også bety at vi må eksplisitt pakke eiendommen hver gang vi ønsker å få tilgang til verdien som er lagret i den valgfrie. Dette vil raskt bli tungvint og ordrik.

I stedet erklærer vi Tableview uttaket som en implisitt pakket valgfritt, noe som betyr at vi ikke trenger å eksplisitt pakke valgfri hvis vi trenger å få tilgang til sin verdi. Kort sagt, er en implisitt pakket valgfritt en valgfri, men vi kan få tilgang til verdien som er lagret i den valg som en vanlig variabel. Det viktigste å huske på er at søknaden din vil krasje hvis du prøver å få tilgang til sin verdi hvis ingen verdi er satt. Det er den fikser. Hvis uttaket er riktig tilkoblet, derimot, kan vi være sikker på at uttaket er satt når vi først prøve å få tilgang til det.

Koble Outlets

Med uttaket erklært, er det på tide å koble den i Interface Builder. Åpne Main.storyboard, og velg visningen kontrolleren. Velg Embed I > Navigation Controller fra Editor menyen. Dette vil sette visningen kontrolleren som roten visning kontrolleren av en navigasjonskontrolleren. Ikke bekymre deg for dette for nå.

Dra et UITableView eksempel fra objektbiblioteket til visningen kontrollerens syn, og legge de nødvendige layout begrensninger. Med tabellvisningen valgt, åpner Connections Inspector og dekke bordet vise sin datakilden og delegere uttak til visningen kontrolleren.

Med Tilkoblinger Inspector fortsatt åpen, velger du visningen kontrolleren og koble Tableview utløp til visningen tabellen vi nettopp lagt. Dette vil koble Tableview utløpet av ViewController klassen til tabellvisningen.

5. Protokoller

Før vi kan bygge og kjøre programmet, trenger vi å implementere UITableViewDataSource og UITableViewDelegate protokoller i ViewController klassen. Dette innebærer flere ting

Trinn 1:. Samsvarer Protokoller

Vi må fortelle kompilatoren at ViewController klassen er i samsvar med UITableViewDataSource og UITableViewDelegate protokoller. Syntaksen ser lik som i Objective-C
klasse ViewController. UIViewController, UITableViewDataSource, UITableViewDelegate {...}

Protokollene klassen er i overensstemmelse med, er oppført etter superklassen, UIViewController i eksempelet ovenfor. Hvis en klasse ikke har en superklasse, som ikke er uvanlig i Swift, da protokollene er listet opp umiddelbart etter klassenavnet og tykktarm

Trinn 2:. Implementering
UITableViewDataSource Protocol

Fordi UITableViewDelegate protokollen ikke definere nødvendige metoder, vi bare kommer til å implementere UITableViewDataSource protokollen for nå. Før vi gjør det, la oss lage en variabel egenskap å lagre gjøremål vi skal liste opp i tabellvisningen
klasse ViewController. UIViewController, UITableViewDataSource, UITableViewDelegate {IBOutlet Var Tableview: UITableView! Var elementer: [String] = [] ...}

Vi deklarere en variabel eiendom elementer av typen [String] og angi en tom array, [], som den opprinnelige verdien. Dette bør se kjent nå. Neste, la oss gjennomføre de to nødvendige metoder for UITableViewDataSource protokollen.

Den første nødvendige metode, numberOfRowsInSection (_ :), er enkelt. Vi bare returnere antall elementer som er lagret i elementer eiendom
func Tableview (Tableview: UITableView, numberOfRowsInSection seksjon: Int.) - ≫ Int {return self.items.count}

Den andre nødvendige metoden, cellForRowAtIndexPath (_ :), trenger litt mer forklaring. Bruke senket syntaks, ber vi om riktig element fra tabellen over gjøremål
func Tableview (Tableview: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath.) - ≫ UITableViewCell {//Hente varen la element = self.items [indexPath.row] //dequeue Tabell Cell la tableViewCell = tableView.dequeueReusableCellWithIdentifier ("TableViewCell", forIndexPath: indexPath) som! UITableViewCell //Konfigurer Tabell Cell tableViewCell.textLabel? .text = Varen tilbake tableViewCell}

Vi ber deretter tabellvisningen for en celle med identifikator "TableViewCell", passerer i indeksen bane for gjeldende rad. Merk at vi lagrer cellen i en konstant heter tableViewCell. Det er ingen grunn til å erklære tableViewCell som en variabel

En annen viktig detalj er at vi nedbrutte returverdien av dequeueReusableCellWithIdentifier (_:. ForIndexPath :) til UITableViewCell siden det returnerer et objekt av typen AnyObject, noe som tilsvarer id i Objective-C. Til nedbrutte AnyObject å UITableViewCell, bruker vi som søkeord.

Vi kunne bruke som? variant til nedslått til en valgfri type, men siden vi kan være sikker på at dequeueReusableCellWithIdentifier (_: forIndexPath :) alltid returnerer en riktig initialisert eksempel, vi kan bruke som! nøkkelord, implisitt pakker resultatet av metodekallet.

I neste linje med kode, konfigurere vi tabellvisningen cellen, sette teksten etikettens tekst med verdien av varen. Merk at i Swift den textLabel eiendom UITableViewCell er erklært som en valgfri typen derav spørsmålstegn. Dette kodelinje kan leses som angi tekstetiketten tekst eiendom til sak hvis textLabel er ikke lik null
. Med andre ord, blir teksten etikettens tekst eiendom bare satt dersom textLabel er ikke null. Dette er en veldig praktisk sikkerhets konstruere i Swift kjent som valgfritt kjeding

Trinn 3:. Cell Gjenbruk

Det er to ting vi trenger å sortere ut før bygge programmet. Først må vi fortelle tabellen oppfatning at det er behov for å bruke UITableViewCell klassen til å lage nye tabellen vise celler. Vi gjør dette ved å påkalle Register (_: forCellReuseIdentifier :), passerer i UITableViewCell klassen og gjenbruk identifikator vi brukte tidligere, "TableViewCell". . Oppdatere viewDidLoad metoden som vist nedenfor
styre func viewDidLoad () {super.viewDidLoad () //Register klasse for Cell Gjenbruk self.tableView.registerClass (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")}
Trinn 4: Legge til elementer

Vi har for øyeblikket ikke har noen elementer som kan vises i tabellvisningen. Dette er lett løses ved å fylle ut elementer eiendom med noen gjøremål. Det er flere måter å gjøre dette. Jeg har valgt å fylle elementer eiendom i viewDidLoad metoden som vist nedenfor.
Styre func viewDidLoad () {super.viewDidLoad () //Fylle elementer self.items = ["Kjøp Milk", "Finish Tutorial", "Play Minecraft"] //Register klasse for Cell Gjenbruk self.tableView.registerClass (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")}
6. Bygg og Kjør

Det er på tide å ta vår søknad for et spill. Velg Kjør fra Xcode Product menyen eller trykk Kommando-R. Hvis du har fulgt med og du bruker Swift 1.2, bør du ende opp med følgende resultat.

Merk at jeg har lagt til en tittel, for å gjøre, på toppen av utsikten i navigerings bar. Du kan gjøre det samme ved å sette tittelen eiendommen av ViewController eksempel i viewDidLoad metoden.
Styre func viewDidLoad () {super.viewDidLoad () //Set Tittel self.title = "To Do" //Fylle elementer selv .items = ["Kjøp Milk", "Finish Tutorial", "Play Minecraft"] //Registrer klasse for Cell Gjenbruk self.tableView.registerClass (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")}
Les mer i vår Swift Programmering Course

Hvis du er interessert i å ta din Swift utdanning til neste nivå, kan du ta en titt på vår fulle kurs på Swift utvikling.

Konklusjon

Selv om vi har laget et enkelt program, har du lært ganske mange nye ting. Vi har utforsket arv og overordnede metoder. Vi dekket også protokoller og hvordan å vedta UITableViewDataSource protokoll i ViewController klassen. Det viktigste du har lært, er imidlertid hvordan de skal samhandle med Objective-C APIer.

Det er viktig å forstå at APIene i iOS SDK er skrevet i Objective-C. Swift er designet for å være kompatibel med disse APIer. Basert på tidligere feil, Apple forstått at Swift trengte å være i stand til å koble inn iOS SDK uten å måtte skrive om hver eneste API i Swift.

Kombinere Objective-C og Swift er mulig, men det er noen begrensninger som vi vil utforske nærmere når vi gå videre. På grunn av Swifts ubøyelige fokus på sikkerhet, må vi ta noen hindringer fra tid til annen. Men ingen av disse hindringene er for stor til å ta så vi finner ut i neste artikkel der fortsetter vi å jobbe på vår to-do-programmet.