Protocol Orientert programmering i Swift 2 
 17 
 Del 
 16 
 Del 
 Dette Cyber mandag Envato Tuts + kurs vil bli redusert å bare $ 3. Ikke gå glipp av. 
 
 Innledning 
 
 Med utgivelsen av Swift 2, lagt Apple en rekke nye funksjoner og muligheter til Swift programmeringsspråk. En av de viktigste, men var en overhaling av protokoller. Den forbedrede funksjonaliteten tilgjengelig med Swift protokoller åpner for en ny type programmering, protokoll orientert programmering. Dette er i motsetning til de mer vanlige objektorientert programmering stil mange av oss er vant til. 
 
 I denne opplæringen, skal jeg vise deg det grunnleggende protokollen orientert programmering i Swift og hvordan det skiller seg fra objektorientert programmering. 
 
 Forutsetninger 
 
 Denne opplæringen forutsetter at du kjører Xcode 7 eller høyere, noe som inkluderer støtte for versjon 2 av Swift programmeringsspråk. 
 
 1. Protokoll Basics 
 
 Hvis du ikke allerede er kjent med protokoller, de er en måte å utvide funksjonaliteten til en eksisterende klasse eller struktur. En protokoll kan betraktes som en blåkopi eller grensesnitt som definerer et sett med egenskaper og metoder. En klasse eller struktur som er i samsvar med en protokoll er nødvendig for å fylle ut disse egenskaper og metoder med henholdsvis verdier og implementeringer. 
 
 Det skal også bemerkes at noen av disse egenskaper og metoder kan betegnes som valgfrie, noe som innebærer at samsvar typer er ikke pålagt å gjennomføre dem. En protokoll definisjon og klasse conformance i Swift kunne se slik ut: 
 protokollen Velkommen {var welcomeMessage: String {få satt} valgfritt func velkommen ()} class welcomer: Welcome {var welcomeMessage = "! Hello World" func velkommen () {print (welcomeMessage)}} 
 2. Et eksempel 
 
 For å begynne, åpent Xcode og opprette en ny lekeplass for enten iOS eller OS X. Når Xcode har skapt lekeplassen, erstatte innholdet med følgende: 
 protokollen kjørbar {var TopSpeed: Int { får}} protokollen Vendbar {var reverseSpeed: Int {få}} protokollen Transport {var seatCount: Int {få}} 
 Vi definerer tre protokoller, som hver inneholder en eiendom. Deretter oppretter vi en struktur som er i samsvar med disse tre protokollene. Legg til følgende kode til lekeplassen: 
 struct Bil: kjørbar, Reversibel, Transport {var TopSpeed = 150 Var reverseSpeed = 20 Var seatCount = 5} 
 Du har kanskje lagt merke til at i stedet for å lage en klasse som er i samsvar med disse protokoller, skapte vi en struktur. Vi gjør dette for å unngå en av de typiske problemene som ligger til objektorientert programmering, objektreferanser. 
 
 Tenk deg for eksempel at du har to objekter, A og B. A skaper noen data på egen hånd og holder en referanse til disse dataene. En så deler denne data med B ved referanse, noe som betyr at begge objekter har en referanse til det samme objektet. Uten en megetsigende, B endrer data på noen måte. 
 
 Selv om dette ikke kan virke som et stort problem, kan det være når en ikke forvente dataene som skal endres. Objekt A kan finne data den ikke vet hvordan de skal håndtere eller avtale med. Dette er en vanlig risiko for objektreferanser. 
 
 I Swift, er strukturer vedtatt av verdi heller enn som referanse. Dette betyr at i eksemplet ovenfor, hvis de data som genereres av A ble pakket som en struktur i stedet for et objekt og delt med B, og dataene vil bli kopiert i stedet for å deles ved referanse. Dette vil da resultere i både A og B som har sin egen unike kopi av det samme stykke data. En endring gjort av B ville ikke påvirke kopi administrert av A. 
 
 Bryte opp Kjør, reversibel og transport komponenter i individuelle protokoller gir også mulighet for større grad av tilpasning enn tradisjonell klasse arv. Hvis du har lest min første tutorial om den nye GameplayKit rammeverket i iOS 9, så denne protokollen orienterte modellen er svært lik den Entities og komponenter struktur som brukes i GameplayKit rammeverket. 
 
 Ved å vedta denne tilnærmingen, tilpasset datatyper kan arve funksjonalitet fra flere kilder i stedet for en enkelt superklasse. Med tanke på hva vi har fått så langt, kan vi lage følgende klasser: 
 
 a class med komponenter av Kjør og Vend protokoller 
 
 a class med komponenter i kjørbar og transportable protokoller 
 
 a class med komponenter av den reversible og transportable protokoller 
 
 med objektorientert programmering, ville den mest logiske måten å lage disse tre klassene være å arve fra en super som inneholder komponenter i alle tre protokoller. Denne tilnærmingen resulterer imidlertid i superklassen blir mer komplisert enn den trenger å være, og hver av de underklasser arve mer funksjonalitet enn den trenger. 
 
 3. Protokolltillegg 
 
 Alt jeg viste deg så langt har vært mulig i Swift helt siden det ble lansert i 2014. De samme protokollorienterte konsepter kunne ha selv blitt brukt til Objective-C protokoller. På grunn av de begrensninger som brukes til å eksistere på protokoller, men sant protokoll orientert programmering var ikke mulig før en rekke viktige funksjoner ble lagt til Swift språket i versjon 2. En av de viktigste av disse funksjonene er protokolltillegg, inkludert betingede extensions. 
 
 For det første, la oss utvide kjørbar protokollen og legge til en funksjon for å avgjøre hvorvidt en bestemt kjørbar er raskere enn en annen. Legg til følgende i din lekeplass: 
 forlengelse kjørbar {func isFasterThan (element: kjørbar) - > Bool {return self.topSpeed > item.topSpeed}} la sedan = Car () la Sportscar = Car (TopSpeed: 250, reverseSpeed: 25, seatCount: 2) sedan.isFasterThan (sportsbil) 
 Du kan se at når lekeplassen kode kjøres, det utganger en verdi av falsk som sedan bilen har en standard TopSpeed på 150, noe som er mindre enn sportsbil 
 
. Du har kanskje lagt merke til at vi ga en funksjonsdefinisjon snarere enn en funksjon erklæring. Dette virker merkelig, fordi protokoller er bare ment å inneholde erklæringer. Høyre? Dette er en annen svært viktig funksjon i protokolltillegg i Swift 2, default atferd. Ved å utvide en protokoll, kan du gi en standard implementering for funksjoner og beregnede egenskaper slik at klassene i samsvar med protokollen ikke må. 
 
 Deretter skal vi definere en annen kjørbar protokollen forlengelse, men denne gangen vi vil bare definere det for verdityper som også er i samsvar med Reversibel protokollen. Denne utvidelsen vil da inneholde en funksjon som avgjør hvilke objekt har bedre turtallsområdet. Vi kan oppnå dette med følgende kode: 
 forlengelse kjørbar der Selv: Reversibel {func hasLargerRangeThan (element: Selv) - > Bool {return (self.topSpeed + self.reverseSpeed) > (item.topSpeed + item.reverseSpeed)}} sportsCar.hasLargerRangeThan (sedan) 
 The Self søkeord, stavet med en kapital "S", brukes til å representere klassen eller struktur som er i samsvar med protokollen. I eksempelet ovenfor, representerer Selv søkeord Bil struktur. 
 
 Etter å ha kjørt på lekeplassen kode, Xcode vil utgang resultatene i sidepanelet til høyre, som vist nedenfor. Merk at Sportscar har en større rekkevidde enn sedan. 
 
 4. Arbeide med Swift Standard Library 
 
 Mens definere og utvide dine egne protokoller kan være svært nyttig, den sanne kraft av protokolltillegg viser når du arbeider med Swift standard bibliotek. Dette gjør at du kan legge til egenskaper eller funksjoner til eksisterende protokoller, som CollectionType (brukt for ting som arrays og ordbøker) og equatable (å være i stand til å avgjøre når to objekter er like eller ikke). Med betinget protokolltillegg, kan du også gi svært spesifikk funksjonalitet for en bestemt type objekt som er i samsvar med en protokoll. 
 
 I vår lekeplass, vi kommer til å utvide CollectionType protokollen og opprette to metoder, en å få gjennomsnittlig toppfart på biler i en bil matrise og en annen for den gjennomsnittlige omvendt hastighet. Legg til følgende kode til din lekeplass: 
 forlengelse CollectionType hvor Self.Generator.Element: kjørbar {func averageTopSpeed () - > Int {var total = 0, teller = 0 for elementet i selv {total + = item.topSpeed teller ++} avkastning (total /count)}} func averageReverseSpeed < T: CollectionType der T.Generator.Element: Vendbar > (eks: T ) - > Int {var total = 0, teller = 0 for elementet i elementer {total + = item.reverseSpeed teller ++} avkastning (total /count)} la biler = [Car (), sedan, Sportscar] cars.averageTopSpeed () averageReverseSpeed (biler ) 
 Protokollen utvidelse som definerer averageTopSpeed metode utnyttet betingede utvidelser i Swift 2. I motsetning til dette averageReverseSpeed funksjon vi definerer rett under det er en annen måte å oppnå et lignende resultat benytte Swift generiske. Jeg personlig foretrekker renere utseende CollectionType protokollen forlengelse, men det er opp til personlige preferanser. 
 
 I begge funksjonene, iterere vi gjennom utvalget, legge opp det totale beløpet, og returnere den gjennomsnittlige verdien da. Merk at vi manuelt holde en telling av elementene i matrisen, fordi når du arbeider med CollectionType snarere enn vanlige Array type elementer, er tellingen eiendommen en Self.Index.Distance typeverdi fremfor en Int. 
 
 Når lekeplassen har utført alt av denne koden, skal du se en utgang gjennomsnittlig toppfart på 183 og en gjennomsnittlig revers hastighet på 21. 
 
 5. Viktigheten av klasser 
 
 Til tross protokoll orientert programmering være en svært effektiv og skalerbar måte å administrere din kode i Swift, er det fortsatt helt gyldige grunner til å bruke klasser når utviklings i Swift: 
 
 Bakoverkompatibilitet 
 
 De fleste av iOS, watchOS, og tvOS SDK er skrevet i Objective-C, ved hjelp av et objekt-orientert tilnærming. Hvis du trenger å samhandle med noen av APIer som inngår i disse SDK, er du tvunget til å bruke de klassene er definert i disse SDK. 
 
 Referanse en ekstern fil eller Varen 
 
 Swift kompilatoren optimaliserer levetiden av objekter basert på når og hvor de brukes. Stabiliteten i klassebaserte gjenstander betyr at dine referanser til andre filer og elementer vil forbli konsekvent. 
 
 Objekt Referanser 
 
 Objektreferanser er akkurat det du trenger til tider, for eksempel, Hvis du mater informasjon til et bestemt objekt, for eksempel en grafikk renderer. Ved hjelp av klasser med implisitt deling er viktig i situasjoner som dette, fordi du må være sikker på at renderer du sender dataene til er fortsatt den samme renderer som før. 
 
 Konklusjon 
 
 Forhåpentligvis slutten av denne opplæringen kan du se potensialet i protokollen orientert programmering i Swift og hvordan den kan brukes til å effektivisere og utvide koden din. Selv om denne nye metodikken for koding vil ikke helt erstatte objektorientert programmering, gjør det bringe en rekke svært nyttige, nye muligheter. 
 
 Fra standard atferd til protokolltillegg, er protokollen orientert programmering i Swift kommer til å være adoptert av mange fremtidige APIer og vil fullstendig endre måten vi tenker utvikling av programvare. 
 
Som alltid, sørg for å la dine kommentarer og tilbakemeldinger i kommentarfeltet nedenfor.

