Swift From Scratch Arv og protokoller

Hvis du har lest de forrige leksjonene i denne serien, bør du ha en god forståelse av grunnleggende for Swift programmeringsspråket nå. Vi snakket om variabler, konstanter og funksjoner, og i den forrige leksjonen dekket vi grunnleggende om objektorientert programmering i Swift.

Mens lekeplasser er et flott verktøy for å leke med Swift og lære språket, er det på tide å gå videre og lage vårt første Swift-prosjekt i Xcode. I denne leksjonen skal vi lage grunnlaget for et enkelt å gjøre program ved hjelp av Xcode og Swift. Underveis lærer vi mer om objektorientert programmering, og vi vil også se nærmere på integrering av Swift og Objective-C.

Forutsetninger

Hvis du vil følge med meg, så sørg for at du har Xcode 8.3.2 eller høyere installert på maskinen din. Xcode 8.3.2 er tilgjengelig fra Apples App Store.

1. Prosjektoppsett

Trinn 1: Velg en mal

Start Xcode 8.3.2 eller høyere og velg Nytt> Prosjekt ... fra Fil Meny. Fra iOS delen, velg Enkeltvisningsprogram mal og klikk neste.

Trinn 2: Konfigurer prosjektet

Gi navnet navnet på prosjektet Å gjøre og sett Språk til Fort. Forsikre enheter er satt til iPhone og avmerkingsboksene nederst er ikke merket. Klikk neste å fortsette.

Fortell Xcode hvor du vil lagre prosjektet ditt og klikk Skape nederst til høyre for å lage ditt første Swift-prosjekt.

2. Prosjektanatomi

Før vi fortsetter vår reise til Swift, la oss ta et øyeblikk for å se hva Xcode har skapt for oss. Hvis du er ny i Xcode og iOS-utvikling, vil det meste av dette være nytt for deg. Ved å jobbe med et Swift-prosjekt vil du imidlertid få en bedre følelse av hvilke klasser og strukturer som ser ut og hvordan de oppfører seg i Swift.

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

Hvis du tidligere har jobbet med Objective-C, merker du at prosjektmalen inneholder færre filer. Det er ingen header (.h) eller implementering (.m) filer som finnes i prosjektet vårt. I Swift har klasser ingen egen headerfil der grensesnittet er erklært. I stedet er en klasse erklært og implementert i en enkelt .fort fil.

Prosjektet inneholder for tiden to Swift-filer, en for AppDelegate klasse, AppDelegate.swift, og en annen for ViewController klasse, ViewController.swift. Prosjektet inneholder også to storyboards, Main.storyboard og LaunchScreen.storyboard. Vi vil jobbe med hovedhistoriebrettet litt senere i denne leksjonen. Den inneholder for tiden bare scenen for ViewController klasse.

Det er noen andre filer og mapper som er inkludert i prosjektet, men vi skal ignorere de for nå. De spiller ingen viktig rolle i omfanget av denne leksjonen.

3. Arv

Det første vi skal ta på i denne leksjonen er arv, et felles paradigme i objektorientert programmering. I Swift kan kun klasser arve fra en annen klasse. Med andre ord støtter strukturer og tall ikke arv. Dette er en av de viktigste forskjellene mellom klasser og strukturer.

Åpen ViewController.swift å se arv i aksjon. Grensesnittet og implementeringen av ViewController klassen er ganske bare-bein, noe som gjør det lettere for oss å fokusere på essensielle.

UIKit

På toppen av ViewController.swift, Du bør se en importerklæring for UIKIT-rammen. Husk at UIKit-rammeverket gir infrastrukturen for å skape et funksjonelt iOS-program. Importoversikten øverst gjør denne infrastrukturen tilgjengelig for oss ViewController.swift.

importere UIKit

super~~POS=TRUNC

Under importoversikten definerer vi en ny klasse som heter ViewController. Tykktarmen etter klassenavnet oversetter ikke til er av typen som vi så tidligere i denne serien. I stedet er klassen etter kolonet superklassen til ViewController klasse. Med andre ord kan følgende utdrag leses som vi definerer en klasse som heter ViewController som arver fra UIViewController.

klasse ViewController: UIViewController 

Dette forklarer også tilstedeværelsen av importoppgaven øverst på ViewController.swift siden UIViewController Klassen er definert i UIKit-rammeverket.

Overstyrer

De ViewController klassen inneholder for tiden to metoder, men legg merke til at hver metode er prefiks med overstyring søkeord. Dette indikerer at metodene er definert i klassens superklasse - eller høyere opp arvstreet - og overstyres av ViewController klasse.

klasse ViewController: UIViewController override func viewDidLoad () super.viewDidLoad () overstyre func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()

De overstyring konstruksjon eksisterer ikke i mål-c. I Mål-C implementerer du en overstyrt metode i en underklasse uten å tydeliggjøre at det overstyrer en metode høyere opp over arven. Måltid-C-kjøretiden tar vare på resten.

Mens det samme gjelder i Swift, er overstyring søkeord legger til sikkerhet for overordnet metode. Fordi vi har prefixed the viewDidLoad () metode med overstyring søkeord, swift forventer denne metoden i klassens superklasse eller høyere opp arvstreet. Enkelt sagt, hvis du tilsidesetter en metode som ikke finnes i arvstreet, vil kompilatoren kaste en feil. Du kan teste dette ved å stave feilen viewDidLoad () metode som vist nedenfor.

4. Brukergrensesnitt

Deklarere Outlets

La oss legge til en tabellvisning til visningsregulatoren for å vise en liste over gjøremål. Før vi gjør det, må vi opprette et uttak for tabellvisningen. Et uttak er ikke noe mer enn en eiendom som er synlig for og kan settes i Interface Builder. Å erklære et uttak i ViewController klasse, prefikser vi eiendommen, en variabel, med @IBOutlet Egenskap.

klasse ViewController: UIViewController @IBOutlet var tableView: UITableView! overstyr func viewDidLoad () super.viewDidLoad () overstyre func didReceiveMemoryWarning () super.didReceiveMemoryWarning ()

Merk at uttaket er en implisitt uåpnet valgfrihet. En hva? La meg begynne med å si at et uttak alltid må være en valgfri type. Årsaken er enkel. Hver eiendom av ViewController klassen må ha en verdi etter initialisering. Et uttak er imidlertid bare koblet til brukergrensesnittet ved kjøretid etter ViewController forekomsten er initialisert og dermed valgfri type.

Vent litt. De Tableview uttak er erklært som en implisitt uåpnet valgfri, ikke en valgfri. Ikke noe problem. Vi kan erklære Tableview uttak som valgfritt ved å erstatte utropstegnet i den ovennevnte koden med et spørsmålstegn. Det ville kompilere helt fint. Dette vil imidlertid også bety at vi må eksplisitt pakke ut eiendommen hver gang vi ønsker å få tilgang til verdien som er lagret i valgfritt. Dette ville raskt bli tungvint og verbose.

I stedet erklærer vi Tableview uttak som en implisitt uåpnet tilleggsutstyr, noe som betyr at vi ikke trenger å eksplisitt pakke ut tilleggsutstyret hvis vi trenger tilgang til verdien. Kort sagt, en implisitt uåpnet tilleggsutstyr er en valgfri, men vi kan få tilgang til verdien som er lagret i valgfriheten som en vanlig variabel. Det viktige å huske på er at søknaden din vil krasje hvis du prøver å få tilgang til verdien hvis ingen verdi er angitt. Det er gotchaen. Hvis uttaket er riktig tilkoblet, kan vi imidlertid være sikker på at uttaket er satt når vi først prøver å få tilgang til det.

Tilkobling av uttak

Med stikkontakten erklært, er det på tide å koble den til i Interface Builder. Åpen Main.storyboard, og velg visningsregulatoren. Velge Integrer inn> Navigasjons kontroller fra Redaktør Meny. Dette setter visningsregulatoren som rotningsvisningskontrollen til en navigasjonsregulator. Ikke bekymre deg for dette for nå.

Dra a UITableView eksempel fra Objektbibliotek til visningskontrollørens visning, og legg til de nødvendige layoutbegrensningene. Når tabellvisningen er valgt, åpner du Tilkoblingsinspektør og sett tabellvisningen datakilde og delegat uttak til visningskontrolleren.

Med Tilkoblingsinspektør fortsatt åpen, velg visningskontrollen og koble til Tableview uttak til bordvisningen vi nettopp har lagt til. Dette kobler til Tableview uttak av ViewController klassen til tabellvisningen.

5. protokoller

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

Trinn 1: I samsvar med protokoller

Vi må fortelle kompilatoren at ViewController klassen stemmer overens med UITableViewDataSource og UITableViewDelegate protokoller. Syntaxen ligner den i Mål-C.

klasse ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate ...

Protokollene klassen overholder er oppført etter superklassen, UIViewController i eksempelet ovenfor. Hvis en klasse ikke har en superklasse, noe som ikke er uvanlig i Swift, er protokollene oppført umiddelbart etter klassenavnet og kolon.

Trinn 2: Implementere UITableViewDataSource protokoll

Fordi det UITableViewDelegate protokollen definerer ikke nødvendige metoder, vi skal bare implementere UITableViewDataSource protokoll for nå. Før vi gjør det, la oss opprette en variabel egenskap for å lagre de oppgitte elementene vi skal liste i tabellvisningen.

klasse ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate @IBOutlet var tableView: UITableView! var elementer: [String] = [] ...

Vi erklærer en variabel eiendom elementer av type [String] og sett inn en tom rekkefølge, [], som den opprinnelige verdien. Dette burde se kjent ut nå. Deretter la vi implementere de to nødvendige metodene til UITableViewDataSource protokollen.

Den første nødvendige metoden, numberOfRows (inSection :), det er lett. Vi returnerer bare antall gjenstander som er lagret i elementer eiendom.

func tableView (_ tableView: UITableView, numberOfRowsInSection seksjon: Int) -> Int return items.count

Den andre nødvendige metoden, cellForRow (ved :), trenger en forklaring. Ved hjelp av abonnementssyntax spør vi elementer for elementet som tilsvarer gjeldende rad.

func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell // Hente element let element = elementer [indexPath.row] // Dequeue Cell lar celle = tableView.dequeueReusableCell (withIdentifier: "TableViewCell", for: indexPath ) // Konfigurer Cell cell.textLabel? .Text = gjenopprettingscelle

Vi ber deretter tabellvisningen for en celle med identifikator "TableViewCell", passerer i indeksbanen for den nåværende raden. Legg merke til at vi lagrer cellen i en konstant, celle. Det er ikke nødvendig å erklære celle som en variabel.

I neste linje med kode konfigurerer vi tabellvisningen celle, setter tekstetikettens tekst med verdien av punkt. Legg merke til at i Swift the textLabel tilhører UITableViewCell er erklært som en valgfri type dermed spørsmålet. Denne linjen med kode kan leses som sett inn tekstetiketten tekst eiendom til punkt hvis textLabel er ikke lik nil. Med andre ord, tekstetiketten er tekst Eiendommen er kun satt hvis textLabel er ikke nil. Dette er en veldig praktisk sikkerhetskonstruksjon i Swift kjent som valgfri kjetting.

Trinn 3: Cell gjenbruk

Det er to ting vi må sortere ut før du bygger applikasjonen. Først må vi fortelle tabellvisningen at den trenger å bruke UITableViewCell klassen for å lage nye tabellvisning celler. Vi gjør dette ved å påkalle Register (_: forCellReuseIdentifier :), passerer i UITableViewCell klassen og gjenbrukskoden vi brukte tidligere, "TableViewCell". Oppdater viewDidLoad () metode som vist nedenfor.

overstyr func viewDidLoad () super.viewDidLoad () // Registrer klasse for Cell Reuse tableView.register (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")

Trinn 4: Legge til elementer

Vi har for øyeblikket ingen elementer å vise i tabellvisningen. Dette løses lett ved å fylle ut elementer eiendom med noen få ting å gjøre. Det er flere måter å oppnå dette på. Jeg har valgt å fylle ut elementer eiendom i viewDidLoad () metode som vist nedenfor.

overstyr func viewDidLoad () super.viewDidLoad () // Populere elementer elementer = ["Kjøp melke", "Avslutt opplæring", "Spill Minecraft"] // Registrer Klasse for Cell Reuse tableView.register (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")

6. Bygg og kjøre

Det er på tide å ta vår søknad om et spinn. Å velge Løpe fra Xcode er Produkt meny eller hit Kommando-R. Hvis du har fulgt sammen, bør du ende opp med følgende resultat.

Legg merke til at jeg har lagt til en tittel, Å gjøre, øverst i visningen i navigeringsfeltet. Du kan gjøre det samme ved å sette inn tittel eiendom av ViewController forekomst i viewDidLoad () metode.

overstyr func viewDidLoad () super.viewDidLoad () // Sett tittel title = "Å gjøre" // Populere elementer elementer = ["Kjøp melk", "Avslutt opplæring", "Spill Minecraft"] // Registrer Klasse for Cell Reuse tableView.register (UITableViewCell.self, forCellReuseIdentifier: "TableViewCell")

Konklusjon

Selv om vi nettopp har opprettet et enkelt program, har du lært ganske mange nye ting. Vi har utforsket arv og overordnede metoder. Vi har også dekket protokoller og hvordan å adoptere UITableViewDataSource protokoll i ViewController klasse. Det viktigste du har lært, er imidlertid hvordan du kommuniserer med Objective-C APIer.

Det er viktig å forstå at APIene i iOS SDK er skrevet i Objective-C. Swift ble designet for å være kompatibel med disse APIene. Basert på tidligere feil, forsto Apple at Swift trengte å kunne koble seg til iOS SDK uten å måtte omskrive hver enkelt API i Swift.

Kombinering av Objective-C og Swift er mulig, men det er noen advarsler som vi vil utforske nærmere etter hvert som vi beveger oss fremover. På grunn av Swift sin ubøyelige fokus på sikkerhet, må vi ta noen forhindringer fra tid til annen. Imidlertid er ingen av disse hindrene for store som vi finner ut i neste leksjon der vi fortsetter å jobbe med vår gjøremål.

I mellomtiden kan du sjekke ut noen av våre andre kurs og opplæringsprogrammer om swift språk iOS-utvikling!