Swift fra Scratch: En introduksjon til klasser og Structures

Swift fra Scratch: En introduksjon til klasser og Structures
37
Del
10
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. ClosuresSwift fra Scratch: Arv og protokoller

I tidligere artikler i denne serien, vi dekket grunnleggende i Swift programmeringsspråk. Hvis du har fulgt med, bør du nå ha en solid forståelse av variabler, konstanter, funksjoner og nedleggelser. Det er nå på tide å bruke det vi har lært så langt, og bruke denne kunnskapen til de objektorienterte konsepter tilgjengelig i Swift.

For å forstå begrepene som diskuteres i denne opplæringen, er det viktig at du har en grunnleggende forståelse av objektorientert programmering. Hvis du ikke er kjent med klasser, objekter og metoder, så anbefaler jeg at du først lese opp om disse emnene før du fortsetter med denne artikkelen.

1. Introduksjon til

I denne artikkelen skal vi utforske de grunnleggende byggesteinene i objektorientert programmering i Swift, klasser og strukturer. I Swift, klasser og strukturer føler og oppfører seg svært like, men det finnes en rekke viktige forskjeller som du må forstå for å unngå vanlige fallgruver.

I Objective-C, klasser og strukturer er svært forskjellige. Dette er ikke sant for Swift. I Swift, for eksempel, kan begge klasser og strukturer har egenskaper og metoder. I motsetning til C strukturer, kan strukturer i Swift bli utvidet og i samsvar med protokoller.

Spørsmålet er "Hva er forskjellen mellom klasser og strukturer?" Vi vil se på dette spørsmålet senere i denne artikkelen. La oss først undersøke hva en klasse ser ut i Swift.

2. Terminologi

Før vi begynner å arbeide med klasser og strukturer, jeg ønsker å avklare noen vanlig brukte begreper i objektorientert programmering. Begrepene klasser, objekter og instanser ofte forvirre folk som er nye i objektorientert programmering, og det er derfor viktig at du vet hvordan Swift bruker disse begrepene.

Objekter og forekomster

En klasse er en blåkopi eller mal for en forekomst av denne klassen. Uttrykket objekt blir ofte brukt for å referere til en forekomst av en klasse. I Swift imidlertid klasser og strukturer er svært like, og det er derfor lettere og mindre forvirrende å bruke begrepet eksempel for begge klasser og strukturer.

Metoder og funksjoner

Tidligere i denne serien, vi jobbet med funksjoner. I sammenheng med klasser og strukturer, vi vanligvis refererer til funksjoner som metoder. Med andre ord, fremgangsmåter er funksjoner som hører til en bestemt klasse eller struktur. I sammenheng med klasser og strukturer, kan du bruke begge begrepene om hverandre, siden hver metode er en funksjon.

3. Definere en klasse

La oss få våre føtter våt ved å definere en klasse. Fyr opp Xcode og opprette en ny lekeplass. Fjern innholdet i skolegården og legg til følgende klassedefinisjonen.
Class Person {}

Klassen nøkkelord indikerer at vi definerer en klasse kalt Person. Gjennomføringen av klassen er innpakket i et par klammeparentes. Selv om personen klassen er ikke veldig nyttig i sin nåværende form, er det en skikkelig, funksjonell Swift klasse.

Egenskaper

Som i de fleste andre objektorienterte programmeringsspråk, kan en klasse har egenskaper og metoder. I den oppdaterte eksempelet nedenfor, definerer vi tre egenskaper:?

  • fornavn, en variabel egenskap av typen String

    lastname, en variabel egenskap av typen String

    kjønn: en konstant egenskap av typen String
    class person {var fornavn: String? Var lastname: String? la kjønn = "hunn"}

    Som eksemplet viser, å definere egenskapene i en klassedefinisjon er svært lik definere regulære variabler og konstanter. Vi bruker VaR nøkkelord for å definere en variabel eiendom og utleid nøkkelord for å definere en konstant eiendom.

    De ovennevnte egenskaper er også kjent som lagres
    egenskaper. Senere i denne serien, vil vi lære om beregnet
    egenskaper. Som navnet tilsier, er lagret egenskaper er egenskaper som er lagret av klassen forekomst. De er svært lik eiendommer i Objective-C.

    Det er viktig å merke seg at hver lagret egenskapen må ha en verdi etter initialisering eller bli definert som en valgfri type. I eksempelet ovenfor, gir vi kjønns eiendommen en initial verdi på "kvinnelige". Dette forteller Swift at kjønns Eiendommen er av typen String. Senere i denne artikkelen vil vi ta en titt på initialisering i mer detalj og utforske hvordan den fungerer med initialisere egenskaper.

    Selv om vi definerte kjønns eiendommen som en konstant, er det mulig å endre verdien under initialisering av en person eksempel. Når forekomsten er initialisert, kan kjønns eiendommen ikke lenger kan modifiseres siden vi definert eiendommen som en konstant eiendom med utleid søkeordet. Dette blir klarere senere i denne artikkelen når vi diskuterer initialisering.

    Metoder

    Vi kan legge atferd eller funksjonaliteten til en klasse gjennom funksjoner eller metoder. I mange programmeringsspråk, er begrepet metode brukt i stedet for funksjon i forbindelse med klasser og eksempler. Å definere en metode er nesten identisk til å definere en funksjon. I det neste eksempelet definerer vi fullt navn metoden i Person klassen
    class Person {var fornavn. String? Var lastname: String? la kjønn = "kvinnelige" func fullt navn () - > String {VAR deler: [String] = [] hvis la fornavn = self.firstName {deler + = [fornavn]} hvis la lastname = self.lastName {deler + = [lastname]} return "" .join (deler)} }

    metoden fullt navn er nestet i klassedefinisjonen. Det aksepterer ingen parametere og returnerer en String. Gjennomføringen av fullt navn metoden er grei. Gjennom valgfri binding, som vi diskuterte tidligere i denne serien, får vi tilgang til verdiene som er lagret i fornavn og etternavn egenskaper.

    Vi lagrer den første og siste navnet på personen eksempel i en matrise og bli med de deler med en rom. Grunnen til dette litt vanskelig implementering bør være opplagt, den første og siste navn kan være blank, noe som er grunnen til at begge eiendommene er av type String ?.

    forekomsten

    Vi har definert en klasse med noen egenskaper og en metode. Hvordan skaper vi en forekomst av Person-klassen? Hvis du er kjent med Objective-C, så du kommer til å elske det knapphet av følgende tekstutdrag.
    La john = Person ()

    Instantiating en forekomst av en klasse er svært lik påkalle en funksjon. For å opprette en forekomst, er navnet på klassen, etterfulgt av et par av parentes, er returverdien tilordnet en konstant eller variabel.

    I vårt eksempel, den konstante john nå peker til en forekomst av Person klasse. Betyr dette at vi ikke kan endre noen av sine eiendommer? Neste eksempel svarer på dette spørsmålet.
    John.firstName = "John" john.lastName = "Doe" john.gender = "mannlig"

    Vi kan få tilgang til egenskapene til en forekomst med bekvemmeligheten av dot syntaks. I eksemplet setter vi fornavn til "John", lastname til "Doe", og kjønn til "mannlig". Før vi trekke noen konklusjoner basert på eksempelet ovenfor, må vi se etter eventuelle feil i skolegården.

    Angi fornavn og etternavn synes ikke å skape noen problemer. Tildeling av "male" med kjønns eiendom, men resulterer i en feil. Forklaringen er enkel. Selv om john er deklarert som en konstant, som ikke hindre oss fra å endre Person eksempel. Det er en påminnelse om, kan bare variable egenskaper endres etter initialisering en forekomst. Egenskaper som er definert som konstant kan ikke endres etter
    initialisering.

    Legg merke til at jeg understreket etter
    i forrige punktum. En konstant egenskap kan modifiseres under initialisering en forekomst. Mens kjønns eiendommen ikke skal endres når en person forekomst er opprettet, ville klassen ikke være veldig nyttig hvis vi bare kunne instantiate Kvinne Person tilfeller. La oss gjøre Person klassen litt mer fleksibel.

    Initialisering

    initialisering er et skritt i levetiden til en forekomst av en klasse eller struktur. Under initialisering, forbereder vi forekomsten til bruk ved å fylle sine eiendommer med startverdier. Initialisering av en instans kan tilpasses ved å implementere en initializer, en spesiell type metode. La oss legge til en initializer til personen klassen
    class Person {var fornavn. String? Var lastname: String? la kjønn = "kvinnelige" init () {kjønn = "mannlig"}}

    Legg merke til at navnet på initializer, init, er ikke innledes med func søkeord. I motsetning til initializers i Objective-C, en initializer i Swift kommer ikke tilbake forekomsten som blir initialisert.

    En annen viktig detalj er hvordan vi setter kjønns eiendommen med en startverdi. Selv om kjønn eiendom defineres som en konstant eiendom, kan vi sette verdien i initializer. Vi setter kjønn egenskapen ved hjelp av eiendommen navn, men det er også greit å være mer eksplisitt og skrive følgende:
    init () {self.gender = "mannlig"}

    I eksempelet ovenfor, refererer selv til forekomsten som blir initialisert. Dette betyr at self.gender refererer til kjønn eiendom forekomsten. Vi kan utelate selv, som i første eksempel, fordi det er ingen forvirring hva eiendommen vi henviser til. Dette er ikke alltid tilfelle skjønt. La meg forklare hva jeg mener.

    Parametere

    I mange situasjoner, vil du passere startverdier til initializer å tilpasse forekomsten du forekomster. Dette er mulig ved å opprette en tilpasset initializer som aksepterer ett eller flere argumenter. I følgende eksempel lager vi en spesial initializer som godtar ett argument, kjønn, av type String
    init. (Kjønn: String) {self.gender = kjønn}

    Det er to ting å merke seg. Først er vi pålagt å få tilgang til kjønn eiendommen gjennom self.gender å unngå tvetydighet siden den lokale paramater navn er lik kjønn. For det andre, selv om vi ikke har angitt et eksternt parameternavn, Swift som standard skaper en ekstern parameternavn som er lik den lokale parameternavnet. Resultatet er det samme som om vi skulle prefiks kjønns parameter med en # symbol.

    I følgende eksempel, instantiate vi en annen person eksempel ved å påberope skikken initializer vi bare definert.
    La bart = person (kjønn: "mannlig") println (bart.gender) //Utganger "mannlig"

    Selv om den opprinnelige verdien av kjønns eiendommen er satt til "kvinnelige" i klassen definisjonen, ved å sende en verdi for kjønn parameter vi kan tilordne en egendefinert verdi til konstant kjønn eiendom under initialisering.

    flere initializers

    Som i Objective-C, en klasse eller struktur kan ha flere initializers. I det følgende eksemplet oppretter vi to Person tilfeller. I den første linjen, bruker vi standard initializer. I den andre linjen, bruker vi den tilpassede initializer vi definert tidligere
    la p1 = Person () la p2 = Person (kjønn: "mannlig").
    4. Definere en struktur

    Strukturer er overraskende lik klasser, men det er noen viktige forskjeller. La oss starte med å definere en grunnleggende struktur
    struct lommebok. {VAR dollar: Int Var cents: Int init () {dollar = 0 cents = 0}}

    Ved første øyekast, er den eneste forskjellen bruk av struct søkeord i stedet for klassen søkeordet. Eksemplet viser oss også en alternativ tilnærming til å levere opprinnelige verdier for egenskaper. I stedet for å sette en startverdi for hver egenskap, kan vi gi egenskaper en utgangsverdi i den initializer av strukturen. Swift vil ikke kaste en feil, fordi det også inspiserer initializer å bestemme startverdi og type av hver eiendom.

    5. Klasser og konstruksjoner

    Du kan begynne å lure på hva forskjellen er mellom klasser og strukturer. Ved første øyekast ser de identiske i form og funksjon, med unntak av klassen og struct søkeord. Det finnes en rekke viktige forskjeller skjønt.

    Arv

    Klasser støtte arv mens strukturer ikke. Det følgende eksempel illustrerer dette. Arven design mønster er uunnværlig i objektorientert programmering, og i Swift, er det en viktig forskjell mellom klasser og strukturer
    class Person {var fornavn. String? Var lastname: String? la kjønn = "kvinnelige" init (kjønn: String) {self.gender = kjønn}} class Student: Person {var skolen: String} la student = Student (kjønn: "mannlig")

    I eksempelet ovenfor, person-klassen er forelder eller super av Student klassen. Dette betyr at Student klassen arver egenskaper og oppførsel av Person-klassen. Den siste linjen illustrerer dette. Vi initial en Student eksempel ved å påberope skikken initializer vi definert tidligere i Person-klassen.

    Kopiere og Referanse

    Følgende konseptet er trolig den viktigste konseptet i Swift du vil lære i dag, forskjellen mellom verdi og referansetyper. Strukturer er verdityper, noe som betyr at de er vedtatt av verdi. Et eksempel illustrerer dette konseptet beste
    struct Point. {Var x: Int Var y: Int init (x: Int, y: Int) {self.x = x self.y = y}} Var point1 = Point (x : 0, y: 0) Var poeng2 = point1point1.x = 10println (point1.x) //Utganger 10println (point2.x) //Utganger 0

    Vi definerer en struktur, Point, for å kapsle dataene til å lagre en koordinat i et to-dimensjonalt rom. Vi instantiate point1 med x lik 0 og y lik 0. Vi tildeler point1 til poeng2 og sette x koordinat for point1 til 10. Hvis vi sende ut x-koordinat for både poeng, oppdager vi at de ikke er like.

    Structures er vedtatt av verdi, mens klassene er vedtatt av referanse.
    Hvis du har tenkt å fortsette å arbeide med Swift, må du forstå den forrige setningen. Når vi tildelt point1 til poeng2, Swift laget en kopi av point1 og tildelt den til poeng2. Med andre ord, point1 og poeng2 hvert punkt til et annet forekomst av Point struktur.

    La oss nå gjenta denne øvelsen med Person-klassen. I følgende eksempel, instantiate vi en person eksempel angi egenskapene, tildele person1 til person2 og oppdatere fornavn eiendom person1. For å se hva som passerer ved henvisning betyr for klasser, vi produksjonen verdien av fornavn tilhører begge Person tilfeller
    Var person1 = Person (kjønn: "kvinnelige"). Person1.firstName = "Jane" person1.lastName = "Doe «var person2 = person1person1.firstName =" Janine "println (person1.firstName) println (person2.firstName)

    eksempelet viser at klasser er referansetyper. Dette betyr at person1 og person2 henvise til eller referere til samme Person eksempel. Ved å tildele person1 til person2, betyr Swift ikke lage en kopi av person1. Den person2 variable peker
    til samme Person eksempel person1 peker til. Endre fornavn eiendom person1 påvirker også fornavn eiendom person2, fordi de refererer til samme person instans.

    Som jeg nevnt flere ganger i denne artikkelen, klasser og strukturer er svært like. Hva skiller klasser og strukturer er svært viktig. Hvis de ovennevnte begrepene er ikke klart, så jeg oppfordrer deg til å lese artikkelen en gang til for å la konseptene vi dekket synke inn.

    Les mer i vår Swift Programmering Course

    Hvis du 're interessert i å ta din Swift utdanning til neste nivå, kan du ta en titt på våre hele kurset på Swift utvikling.

    Konklusjon

    i denne utgaven av Swift fra Scratch, har vi begynte å utforske det grunnleggende objektorientert programmering i Swift. Klasser og strukturer er de grunnleggende byggesteinene i de fleste Swift prosjekter, og vi vil lære mer om dem i de neste par timene av denne serien.

    I neste artikkel vil vi fortsette vår utforskning av klasser og strukturer ved å ta en nærmere titt på eiendommer og arv.