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.
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.
Start Xcode 8.3.2 eller høyere og velg Nytt> Prosjekt ... fra Fil Meny. Fra iOS delen, velg Enkeltvisningsprogram mal og klikk neste.
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.
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.
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.
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
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.
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.
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.
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.
Før vi kan bygge og kjøre programmet, må vi implementere UITableViewDataSource
og UITableViewDelegate
protokoller i ViewController
klasse. Dette innebærer flere ting.
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.
UITableViewDataSource
protokollFordi 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.
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")
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")
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")
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!