DANIEL ARMENDARIZ: Hej, alle, velkommen til iOS app udvikling med hurtig. Jeg er Dan Armendariz. Jeg er precepter af computer videnskab her på skolen Teknisk Applied Sciences. Og hurtig er faktisk slags af en virkelig sirlige sprog. Og jeg har nogle planer for i dag. Så over den næste time eller så vi skal hen at se på iOS app udvikling selv hjælp Xcode og faktisk at skabe nogle Meget grundlæggende, meget simple applikationer. Og se på den måde, du faktisk tage disse ansøgninger, og bygge dem, og faktisk læg dem på en iOS-enhed. Nogle af de ting, Vi kommer ikke til at se på vil omfatte ting som faktisk at tage en ansøgning og sætte det på app store. Der er en masse tutorials på nettet, vil hjælpe dig med dette aspekt af det. Men også fordi som del af CS50, får du at slutte sig til Apple udvikling team, CS50 app udviklingsteam. Hvis du ikke har gjort det endnu, og du er tilknyttet CS50, Jeg anbefaler, at du gøre, fordi det er, hvordan du er i stand til at skabe nogle programmer i Xcode, bygge dem, og faktisk lægge dem på nogle af dine iOS-enheder hvis du rent faktisk har en fysisk iOS-enhed. Hvis du ikke har en fysisk iOS enhed, der er mere end fint. Du kan faktisk udvikle til iOS. Og Xcode har en simulator, der giver dig at se din ansøgning i handling på computeren. Men det slags er en pæn ting til rent faktisk at spille og interagere med din ansøgning på en egentlig enhed. Så der er et par krav til rent faktisk gør alt dette udvikling. En af dem er, at du er nødt til at have en Mac. Det skal køre 10.9.4 eller nyere for at gøre udvikling med hurtig. Du kan bruge en tidligere version udvikle med Objective C til iOS og Mac. Men jeg anbefaler, og en masse af det eksempler, vi ser i dag, Brug 10.10 Yosemite. Så hvis du endnu ikke har opgraderet, er det en god undskyldning for at gøre det. Nu Xcode 6.1 er den nyeste version af det integrerede udviklingsmiljø at Apple leverer gratis at du kan hente fra App Store. Og jeg anbefaler, at du også køre den nyeste version. Hvis du tilfældigvis til at køre en tidligere version Xcode 5 og under blot simpelthen ikke understøtter overhovedet hurtigt. Og de betaversioner af seks, som blev løsladt i løbet af sommeren, gøre støtte hurtig, men der er været et enormt antal af ændringer i sproget, nok således at den kode, du er kommer til at se på, og at du kan finde på internettet vil faktisk ikke kompilere korrekt i disse tidligere versioner af Xcode. Så igen, hvis du endnu ikke har en udvikler konto, Jeg vil anbefale dig at gå til developer.apple.com. Tilmeld dig, oprette en udvikler konto, og deltag i CS50 app udvikling team. Det vil give dig en mulighed at kompilere dine programmer og læg dem på din enhed. OK, så lad os komme i gang. Det allerførste vi kommer til at gøre, er til faktisk at skabe en meget simpelt projekt i Xcode der vil give dig mulighed for indgive en ansøgning. Så hvis du endnu ikke har Xcode åben, gå videre og åbne den og oprette et nyt projekt. En særlig splash skærm vil åbne og vil give dig nogle muligheder om, hvad det er, at du ønsker at gøre. Bare sig, at du vil oprette et nyt projekt, en ny ansøgning. Dette vindue vil poppe op, antager du bruger Xcode 6.1. Lige nu, og for varighed dette seminar, vi kommer til at bruge Enkelt billede applikationer, bare sortering af en oprindelig ansøgning at få våde fødder. Og du kan forgrene sig på din egen derfra. Klik på Næste på dette tidspunkt. Nu her er der et par ting at du måske ønsker at komme ind. Produktet hedder det navn på dit projekt. I dette tilfælde er jeg bare vil kalde det Seminar1 fordi det er vores første eksempel. Organisation navn, i denne sag er bare mit navn. Du kan selvfølgelig ændre det til dit eget navn, eller CS50. Organisation id, hvis du tilfældigvis har en hjemmeside bare tage domænenavnet i omvendt, com.yourname. og derefter navnet på produktet vises automatisk efter, som bundtet identifikator. Naturligvis det sprog, vi er skal bruge for i dag er hurtig. Du kan selvfølgelig bruge Objective C for det, men i dag vil være hurtig. Og vi vil nu sige universelle enheder, så at det virker på både iPad og iPhone. Og vi vil forlade kerne data ukontrollerede at holde projektet relativt enkel for tiden. Så lad os gå videre og klik på Næste. Og det kommer til at spørge mig hvor jeg vil gemme det. Jeg vil bare gemme den på mit skrivebord for nu. Okay, så nu det er det, vil ske, når du faktisk åbne Xcode. Og bemærk, at meget første, du ser er dette udråbstegn som siger nej underskrivelsen identitet fundet. Jeg bevidst gjorde det på min computer, og jeg er håber, at jeg har tænkt mig at være i stand til rent faktisk løse det, fordi jeg vil have dig til at se, hvordan dette rent faktisk vil arbejde på din egen maskine. Gå videre og klik fix problem. Den vil spørge dig, hvis du har en eksisterende Apple Developer konto. Det er her at deltage i CS50 app udviklingsteam er vigtigt, så du ikke kun har en app-konto, men du har også evne til at underskrive de apps og læg dem på din iOS-enhed. Dette er not-- klikke fix spørgsmål er ikke nødvendig hvis du bare kommer til at opbygge og udvikle lokalt, helt inden for iOS simulator. Men for nu vil jeg til at udvikle og sætte dem på min iPad, som vil være i stand til at udsende så godt. Så jeg ønsker at faktisk tilføje dette. Og det kommer til at spørge mig for mit Apple-id. Så det vil være dette. Og jeg er nødt til at hente min adgangskode, som er herovre. Så giv mig bare et sekund for at finde det, og kopiere det, og indsæt den herovre. Klik på Tilføj. Det kommer til at spørge mig hvilket hold jeg ønsker at deltage. Jeg har tænkt mig at gøre School of Engineering. Klik Deltag. Ups, det er den forkerte. Lad os gøre denne ene. Forhåbentlig, at man vil arbejde. At man stadig ikke virker. Vi kører ud af gode her. OK, bør denne ene fungere. Luk nu det. Lad os nu gøre skole engineering, klikke på Vælg. Og nu forhåbentlig efter en par sekunder, du can-- OK, Jeg vil tilbagekalde og anmodning. Åh mand, vil dette ikke. OK, jeg vil prøve en anden. Lad os gøre denne ene her. Levende demoer svigter mig. Vi kan have til at vende tilbage til blot bygge helt lokalt, men det ville være OK i dette tilfælde. Så her, mens dette er faktisk arbejdsdag, hvad vi vil gøre, er blot skabe en meget enkel Hello World program. Så dette er Xcode. Og hvis du ikke har set det endnu, det kan være lidt skræmmende i starten. Der er en masse ruder, er der en masse doodads på forskellige områder. Men bare indse, at der er virkelig flere hovedkomponenter til dette udviklingsmiljø. Længst til venstre er alle filerne , der gælder for dit program eller til din projekt. Vi vil klikke rundt på nogle af dem, og vi vil påpege mest vigtigste over tid. På det yderste højre, vi har et sæt af attributter. Og alle disse egenskaber, der er forskellige ruder for attributterne. Ruderne vil ændre sig afhængigt af forbindelse med de vigtigste indhold, som sker i midten. Nu midten kan faktisk vise du en række ting, f.eks din kode selv. Eller du kan faktisk have-- når du klikker på storyboardet som er, ved den måde, bare en grafisk repræsentation af din bruger interface til din application-- derefter attributterne ruden på meget langt til højre faktisk vil ændre sig. Nu er der et par andre ting, som jeg gerne vil pege. Du kan slags udforske omkring i miljøet på egen hånd. Men en af ​​de ting, der har været meget nyttig er denne knap Her øverst til højre i vinduet. Der er denne knap, ser ud på langt forlod det har et afsnit efterfulgt af to cirkler, og sortere af to pile, der peger væk fra hinanden. Hvis du skifter mellem standard editor, som er længst til venstre en, den ene der er valgt som standard, og de to cirkler overlappende hinanden, hvad du rent faktisk får er en dobbelt rude udsigt. Og det er faktisk vil være nyttigt for os når vi har brug for at knytte emner i brugergrænsefladen til koden. Og vi vil tale mere om at på bare et øjeblik. Men indse, at hvis du får endnu flere ruder som denne, du kan forenkle din visning bare en lille smule ved at klikke tilbage på din enkelt editor. Så vidt så godt. Så dybest set har vi koden på venstre attributter til højre, og hvad det er vi arbejder her i centrum. Så her jeg har klikket på de vigtigste storyboard. Og storyboard, igen, er en vej i Xcode at du rent faktisk kan oprette din bruger interface ved hjælp af bare trække og slippe teknikker. Og så for vores meget første ansøgning denne er netop, hvad vi skal gøre. Vi kommer til at gå til meget langt nederste højre del af skærmen, som indeholder en række af brugernes elementer at du derefter kan klikke og trække at oprette din brugergrænseflade. Nu er alle disse elementer kaldes visninger fordi de leverer en slags visning. Der er et billede visning, for eksempel, faktisk at vise et billede på brugergrænsefladen. Der er en tabel for at faktisk viser en tabel. Så videre og så videre. Der er en bred vifte af visninger, som du kan vælge her. Så bare for nu vil vi at søge efter en etiket. Du kan bare rulle gennem alle de lister, der er der. Men der er søgningen bar i bunden der gør det lettere at identificere specifikke synspunkter, som du rent faktisk ønsker at trække ind i din brugergrænseflade. Fundet min etiket. Jeg har tænkt mig at trække det her, direkte på min prøve ansøgning. Lige der i midten ser godt ud. Og jeg har tænkt mig at skrive "Hello World!" Hit Enter. Nu har jeg en etiket. Det ser ikke ud som om det er centreret helt korrekt. Så jeg kan forsøge at re-center det. Heldigvis det giver disse guider til at gøre tingene meget lettere. Jeg har tænkt mig at forsøge at kompilere det. Forhåbentlig vil det rent faktisk arbejder her. Og hvis det ikke i et øjeblik det vil faktisk blive vist på min iPad. Det er lige her. Der er det. OK, så det er det. Vi er færdig. Vi har skabt vores helt første ansøgning. Nu naturligvis dette ikke gør noget. Det er bare et mærke. Der er ingen forbindelse mellem brugergrænsefladen og koden. Så hvis vi faktisk ønskede at skabe denne sammenhæng, hvis vi faktisk ønskede at have en slags af kommunikation mellem elementerne der findes på skærm og den kode, tillader os at styre de elementer, derefter vi faktisk har brug for se på selve koden. Så dette er, hvad der kaldes ViewController.swift. Og for, især for din første par programmer, dette vil være en slags den hovedparten af ​​den kode, du enter-- vil være i dette dokument her. Der er en masse ting der er i her hidtil, ikke? Der er import UI kit klasse, tilsidesætte, [? funk,?] alle disse forskellige ting. Og det er ikke helt klart, hvad det er, at alt dette betyder. Så lad os tage et skridt tilbage væk fra Xcode for en lille smule og se på selve sproget, hurtig. Så med hurtig, det var i design og udvikling hos Apple for omkring fire år til min forståelse. Og der er et par funktioner om det, der er virkelig pæne. Først og fremmest er det kompileret sprog, ligesom C. Så skal du først kompilere det og derefter køre den før du kan faktisk udføre koden, der resulterer. Men der er i modsætning til C, en interaktiv bede, at du rent faktisk kan køre og skriv vilkårlige kommandoer ind. Og meget gerne en JavaScript-konsol, som du kan være bekendt med nu, det faktisk vil vurdere dem kommandoer og leverer til dig outputtet. Og de har selv taget at til det næste niveau og de har skabt noget kaldet legepladser i Xcode der gør det muligt at visuelt arbejde med kode. Og vi vil faktisk se nogle eksempler af, at på bare en lille smule. Det er baseret på C. C ligger til grund det, fordi alle de compilere skabe kode ud af C og oprette objektet kode fra det. Men det virkelig aktier relativt lidt syntaks. Det vil se nogenlunde anderledes. Der vil være nogle ligheder. Men der vil være ganske få forskelle sammenlignet med, siger, JavaScript eller PHP. Og vi vil pege disse ud på bare et øjeblik. Nu er en af ​​de største ting om hurtigt det er rart er, især sammenlignet til C, er det meningen, at være sikker. Alt i det er meningen, at være meget stærkt skrevet i. Faktisk er det næsten irriterende i første omgang, når du først begynde at arbejde med hurtig, præcis hvor meget det håndhæver typer overalt. Alt, hvad der er en streng skal forblive en streng. Det er meget svært at sortere i konvertere det eller tvinge det i en anden form. Og igen, viser vi eksempler på dette. Men i sidste ende indse, at dette menes at beskytte dig, og ved du jeg mener din kode, fra nedbrud i nogle forfærdelige måde, når du har en form for uoverensstemmende type. Og igen, arbejde med det. Fordi det vil være frustrerende først som du forsøger at finde ud af hvorfor netop du får denne usædvanlige error beskæftiger sig med typer. Men det vil være det værd i sidste ende. Det betyder behandle med automatisk hukommelse ledelse, så ikke længere gør du nødt til at beskæftige sig med ting ligesom malloc og fri og alle af den slags ting. Og det er også designet til almindeligheder. Så mens vi kan bruge en Xcode til skabe iOS apps og Mac-programmer, Vi kan også bare bruge det som et scriptsprog. Og så vi kan bruge det sortere af stedet for PHP eller i stedet af Python faktisk hurtigt parse og proces nogle data, som vi har på vores computer. Det har en bred vifte af moderne funktioner, optionals, foranderlighed, generiske lægemidler, lukninger, og en masse af dette ting du måske eller måske ikke genkende. Og det er bare slags en uheldig del af det sprog, at nogle af disse slags futuristisk, moderne elementer, er indeholdt i elementerne er så dybt indgroet, at jeg rent faktisk vil nødt til at lære dig CS50.5 en lille smule. Vi er nødt til at lære lidt mere om nogle af funktionerne i rækkefølge for virkelig at forstå, hvad der foregår på og så du kan se på koden og ikke føle sig helt tabt. Og du vil se hvad jeg mener ved, at på bare et minut. OK, så let's-- nok af dette slags teoretisk ting. Lad os faktisk se på vores allerførste hurtig program. Det er en linje kode. Linje 14 lige her, det siger print l n hej CS50. Så der er et par ting, der er meget anderledes om dette forhold til ting, som du kunne være vant til fra C, for eksempel. En af dem er, at der ikke er nogen intmain, er der ingen inkluderer sektion, der er ingen af ​​denne ekstra ting. Den indbefatter, ligesom standard I / O, som bibliotekerne der faktisk give standard funktioner i sproget, medtages automatisk som del af hurtige standard bibliotek og som importeres automatisk. Du behøver ikke at gøre at importere manuelt. Intmain ikke eksisterer, fordi den vigtigste indgang for koden er faktisk på begyndelsen af ​​koden. Så enhver kode, som du har fra starten rent faktisk vil blive gennemført i starten. Så det virkelig forenkler. Bemærk også, at der ikke er nogen semikolon. Der er ingen semikoloner i dette sprog. Du sætter en erklæring på en individuel linje og derefter den næste linje repræsenterer den anden opgørelse. Hvis du ønsker at sætte mulitiple udsagn online, så har du adskille den af ​​semikolon. Men for det meste, for god stil, er vi aldrig kommer til at se semikoloner for Med henblik på at adskille udsagn i hurtig. Så hvordan gør dette rent faktisk arbejder? Nå meget gerne C vi faktisk nødt til at oversætte dette. Og så vi kan gøre det ved hjælp af hurtig c og derefter 1.swift. Og så efter et par minutter vil kompilere og så kan jeg køre punkt et. Og end det vil bare sige "Hej CS50." Awesome, så der vi gå. Der er vores første hej verden program. Lad os gå videre til nummer to. Nu i denne-- dette har ændret en smule, fordi der normalt du do-- faktisk altid har du at udarbejde en hurtig ansøgning, før du faktisk køre it-- én af de store funktioner at jeg hentydede til før, var, at hurtig faktisk kan bruges i Sort en pseudo-fortolkende funktion, der er i virkeligheden ligesom en tolk. Men hvad det vil gøre, er der er i virkeligheden en hurtig gennemførelse at du kan køre. Så for eksempel, hvis du bare skrive hurtig her, hvad der vil ske er, at du vil få en prompt. Og du kan skrive din hurtige kode, udskrive hej, og køre den. Og det vil faktisk print-- godt, det ikke udskrive i denne sag fordi det udskrives centreret ud, som ikke er synlig her. Men det er faktisk i stand til at fungere. Og så i dette tilfælde, jeg er bare kommer til at bruge dette som et script. Og jeg kan faktisk køre denne kode der. Så den måde, at jeg faktisk køre det vil være lidt anderledes, men du vil se, at på bare et øjeblik. Nu, i dette tilfælde, hvad vi vil at gøre er at først definere en variabel. Så dette er, hvordan vi definerer en variabel i hurtig, er vi bruger lad søgeord, efterfulgt af navnet på den variable, og så giver vi nogle initialisering af data eventuelt. Så dette tilfælde vi definerer en konstant kaldet navn, og vi vil bruge det i produktionen af ​​vores print linje i bunden, hej navn. Bemærk nu, at frem for at bruge% s, vi kan indkapsle navnet på denne variabel i / () og være i stand til sammenkæde i indholdet af denne streng i denne streng. Nu modsætning C, streng er en faktiske real type hurtig. Og så kan den sammenlignes med int'er og sideløbende fordobler meget let og naturligt forhold til nogle af de andre sprog, som vi har set. Så det ville faktisk fungerer ligesom du ville forvente. Jeg kan køre 2.swift. Og vi ser, at mit navn er faktisk splejset i, "Hello Dan." OK, awesome. Flytning til nummer tre. Nu var det en lille smule af en hvid løgn, at jeg sagde, at den måde, at vi erklærer variabler var at bruge lad søgeord. Så mange gange, som du overhovedet kan du gøre ønsker at bruge lade, fordi det, der gør er det definerer en konstant. Og der fortæller hurtigt, at det kan optimere hastigheden på din ansøgning fordi den ved, at der variabel kommer ikke til at ændre sig. Så vurdere omhyggeligt når du kommer til at bruge en variabel for henblik på at ændre det. Og når du kommer til at oprette en variabel bare til at holde nogle data, og det er faktisk ikke kommer til at ændre sig. Så dette begreb uforanderlighed, det er faktisk ikke til at ændre, er en vigtig ligesom langt ned som definerer variabler. Så her har vi defineret et navn, Lad navn, og i dette tilfælde Det er en konstant, der er af typen streng, og den er lig med Dan. Så mens der i tidligere versionen, det infers-- og med "det" Jeg mener swift-- hurtig udleder den type data at vi har indgået variablen. I dette tilfælde kan vi være eksplicit. Så lad derefter navnet på denne variabel er navn og derefter et kolon. Og efter kolon gør vi specificere den type data. Så ikke længere er det int navn eller string navn eller noget lignende. Men i stedet lade mærke, vi er definere, hvorvidt det er konstant eller variabel, efterfulgt af navnet, efterfulgt af typen valgfrit. Så i dette tilfælde, vi definerer dette navn er en streng. Vi siger, er Dan. Og nu har jeg en anden variabel, i dette tilfælde det kaldes etiket. Men bemærk, at det er foranstillet nøgleordet var. Nøgleordet var midler at denne variabel kan ændres på et senere tidspunkt i tid, et eller andet sted nede i koden kan vi faktisk ændre det, og det vil ikke give os nogen bestemt fejl. Vi kan gøre standard concatenating operatør her ved hjælp af plus-symbolet til rent faktisk at tilføje vores navn til denne streng. Og så kan vi udskrive som vi så for et øjeblik siden. Lad os nu sige, at du ønsker at skabe en variabel men du ikke ønsker at initialisere det endnu. Du kan endnu ikke ønsker at sætte alle data i det. Nå du nødt til at fortælle hurtig hvad den type data vil være, før du kan faktisk definere det ordentligt. Så i dette tilfælde, når vi har defineret en variabel kaldet klasse vi skal være eksplicit om dens type, fordi det kan ikke udlede bare at kigge på data med startværdier at du giver den. Det vil give os en fejl, hvis du bare typen var kvalitet, for eksempel, fordi det har ingen type derfor. Så kvalitet = 100. Så 100 er et heltal, er det passer meget fint ind der. Den vil fortsætte med at fungere. Vi kan se, hvor så vi kan sammenkæde dette. Nu kan du blive fristet, hvis du rent faktisk ønskede at sammenkæde den kvalitet i en anden tekststreng ind i en anden streng, at du ville bare bruge den samme concatenating operatør. Og det ville normalt være sandt. Men hurtig vil ikke tillade dig at implicit ændre typen af ​​data. Så i dette tilfælde er line, 25, vil mislykkes fordi kvalitet er en heltal og ikke en streng. Og så der er et misforhold sæt af typer. Så du er nødt til at være eksplicit, når du vil ændre disse data, når du ønsker at tvinge dette data i en anden type og sige, OK, jeg ønsker at tage denne klasse, som er et helt tal, og konvertere den til en streng. Så jeg tager en kapital s String alle typer, vil du bemærke, aktiveres, Int, Dobbelt, String, så videre og så videre. Alle af dem aktiveres bare for at gøre tingene lettere. Og vi vil sige kapitalisere String passere ind i den klasse. Og det vil skabe en streng ud af det heltal. Og så kan vi sammenkæde de to meget pænt. Eventuelle spørgsmål om det her indtil videre? Okay, lad os pløje igennem til nummer fire. Lad os nu tale om nogle mere avancerede strukturer, som arrays og løkker. Og i modsætning til C, arrays i Swift ikke er repræsenteret ved pointere. Pejlemærker i hurtig, selv om de findes, kaldet ligesom usikre pointers eller en lignende type som det, de er ikke udsat for du normalt. Så det bliver meget vanskeligt for dig at manipulere hukommelsen direkte på din computer. Så arrays er bare en datatype. Og de er refereres ved hjælp af denne slags nu standard firkantede beslag notation at du har set før. Men når du rent faktisk ønsker at definere en type variabel som en matrix af nogle bestemt type, så er du sætte denne type i skarp parentes. Så hvad jeg siger her, er, at Jeg skaber en variabel kaldet kvaliteter af typen int matrix. Og jeg sætte det lig med nogle klargjorte data, som i dette tilfælde er 100, 0, 90, 85, som er blot en samling af vilkårlige kvaliteter her. Nu i dette tilfælde jeg kunne, Husk, fjern den type, og det ville være i stand til at udlede det baseret på de klargjorte data. Men hvis jeg fjernede det og Jeg havde brug for at sætte den senere, så ville jeg nødt til at sikre at jeg har den type der. Okay, lad os gå sammen. Så vi can-- arrays giver os en bred vifte af metoder gennem at dot notation ved du sikkert nu kender. Så grades.count, for eksempel, fortæller os netop det antal elementer, som er indeholdt i denne matrix. Hvis jeg ønsker at tilføje additional-- nu mærke til at dette er en var og not-- dette er en variabel og ikke en konstant, som betyder, at jeg kan ændre indholdet af dette array, kan jeg tilføje objekter til det. Men jeg kan ikke bare sige kvaliteter og derefter i skarp parentes fire, fordi det vil være en out of bounds fejl i dette tilfælde. Hvis jeg vil faktisk forandring størrelsen af ​​denne matrix, Jeg er nødt til at bruge dot append metoden til tilføje noget til den bitre ende af det. Jeg kan dog ændre individuelle indekser. Så jeg kunne bruge kvaliteter Og så firkantede parenteser nul til manipulere denne første indeks og så videre, ligesom du normalt ville forvente. Og jeg kan gøre det samme til rent faktisk modtage data fra, at så godt. Nu er der også en slags fancy metode at gøre dette, stilling plus ligemænd og derefter en anden indeks, som vil append-- eller ikke andet index-- men en anden liste, som vil tilføje denne liste på bagsiden af ​​kvaliteter. Og karaktererne vil så indeholder alt det. Men det er slags en ekstra ting at jeg bare har tænkt at vise dig for sjov. Nu er der en for-løkke. Og dette er starten på, hvor tingene begynder at ændre en lille smule. Læg mærke til, hvordan denne for-løkke er forskellig fra efter sløjfer i C. Nu vil jeg bemærke, at efter sløjfer i Swift kan komme til at se ud for sløjfer i C, men der er en masse mere brugbare konstruktioner i det væsentlige eliminere behovet at have for var jeg lig 0 semikolon i er mindre end en vis længde, så videre og så videre, ikke? Og denne konstruktion er kun én af dem. For indeks indeks er nyt variabel, i dette tilfælde i området. Og hvad jeg siger, er, at der er et interval fra 0 hele vejen op til men ikke inklusive grades.count. Så denne prik prik mindre end tegn repræsenterer et interval af værdier startende fra nul hele vejen op til grades.count minus 1. Der er en separat operatør, der eksisterer, der er dot dot dot, hvilket ville betyder, at jeg ønsker, at området fra nul til karakterer tæller inklusive. Men i dette tilfælde, fordi disse arrays er nul indeks, vi selvfølgelig ikke ønsker at gå til maksimale antal karakterer. Jeg kan opsummere karaktererne, som du måske forventer, og output alt dette ting. OK, vi går videre. Lad os nu tale om funktioner. For at definere en funktion du bruger funk søgeord. Og igen, i Swift du nødt til at være meget forsigtig med de typer. Du giver det parametre ved at definere, for eksempel, navn parameter og så i colin, den type data at du forventer, at parameter at acceptere. Så i dette tilfælde har vi en funktion kaldet print kvalitet tæller. Det accepterer en variabel kaldet gradebook, eller snarere en parameter kaldet Karakterbog. Og vi forventer, at gradebook at være et array af heltal. Hvis det gradebook er tom, vi vil printe en ting. Ellers vil vi udskrive nummeret af kvaliteter, at dette faktisk er. Nu, hvis vi ønsker at vende tilbage en vis værdi, så den måde, at vi ændre denne definition er til rent faktisk at bruge denne pil søgeord, eller for at bruge denne pil signifier. Så her vil vi definere en funktion kaldet gennemsnit. Vi kommer til at acceptere en liste over numre. Og vi kommer til at returnere en dobbelt, som forhåbentlig er gennemsnittet af dette array. Og for at gøre det, for til rent faktisk at beregne dette gennemsnit, Vi vil tage en sum, og vi vil på kursus opsummere alle de objekter inden for dette array. Bemærk, at der er en ny stil for løkke her. Vi behøver ikke at være eksplicit om iteration over hver enkelt element, men vi kan i stedet sige til klasse og gradebook, mening at for hver enkelt element, vi har i dette, bestemme, at produkt i dette variabel kaldet klasse. Og jeg ønsker at gøre noget med det. Så jeg har tænkt mig at opsummere alt dette data og faktisk returnere dobbelt division. Nu opdager igen her er der Begrebet heltalsdivision i Swift. Hvis du ønsker at fordoble division fordi du vil have decimaler, så har du til at være eksplicit, ikke kun om den ene side, fordi det ikke kommer til at give dig at tvinge data på begge sider af denne, du er nødt til rent faktisk kurs begge sider i double så du er meget eksplicit om at sikre at du laver dobbelt division. Lad os gå videre. Så hvis jeg rent faktisk ønsker at accept-- så i dette særlige eksempel, det er stadig en kommando line baseret applikation. Og vi er begyndt at se nogle af begrænsningerne i den unge sprog ved, at selv om vi kan adgang argumenter ved hjælp dette process.arguments, det er stadig ikke nødvendigvis den reneste ting, som vi nogensinde har set. Men dybest set vil jeg opfordre dig at slags se på denne kode og forsøge at finde ud hvad der foregår. Væsentlige, hvad der sker, er, at vi tager en liste med argumenter og blev tvinge dem ind heltal, og så er vi vil bruge det som en måde at udskrive ud gennemsnittet af alle vores kvaliteter. Bevæger sig på. Nu er der en anden type data-- anden data type i stedet for arrays kaldet ordbøger, som er meget ligner hash tabeller eller hash kort og ligner også PHP er associative arrays. Så de har den opfattelse af nøgler og værdier. Og de er defineret også med dette torv beslag notation, men forskellen er at ordbøger har indersiden af ​​firkantede beslag, et kolon. Og kolon adskiller data skriv det er nøglen, og værdien. Så i dette tilfælde, vil jeg skabe en ordbog til at acceptere nogle kvaliteter. Og det vil være snor seværdighed: int, hvilket betyder, at alle de nøgler vil være strenge, og alle værdierne af disse nøgler vil være heltal. Hvad dette betyder er, at jeg kan derefter henvise til specifikke data at jeg ønsker at bruge disse nøgler snarere end at bruge numeriske indeks ligesom jeg ville have for en standard array. Lad os nu se, er der en vigtig ting at jeg vil også gerne nævne om denne særlige sekvens kode. Og det er, at der er en anden type data, eller rettere der er denne idé om data, der er indeholdt i Swift kaldet optionals. Og hvad optionals betyder at det anerkender, at nogle gange er du ikke kommer til at få de data, du rent faktisk forventer. Og så hvad jeg mener med det is-- lad os tage et kig på denne sekvens af kode som gentager over hele den argumenter, der blev videregivet til denne kode og forsøger at konvertere dem, forsøger at opdele i en række strenge, fordi den accepterer en meget bestemt type argument. Og så er det vil forsøge at tvinge strengene, der repræsenterer tal i hele tal, der er kvaliteter, at jeg så kan beregne. Så dybest set jeg har tænkt mig at bruge denne split funktion, findes inden for Swift standard bibliotek. Jeg har tænkt mig at gå ind i det streng, som jeg vil opdele. Og så i at bruge dette slags funky syntaks, som Jeg ved ikke, om vi får komme til, men måske, vi rent faktisk vil angive den præcise tegn, som vi ønsker at splitte på. Så hvad betyder det egentlig ud? Lad os tage et kig på faktisk kører denne kode. Så for eksempel, lad os sige, at jeg har en quiz og jeg fik 50 på det. Og jeg har en PSETs og Jeg fik en hundrede på det. Og jeg got-- der er en anden quiz og jeg fik en 40 på det. Jeg trykker på Enter, og i sidste ende, hvad vil ske er, at hvad det gør tager disse parametre, opsplitning strengene på disse koloner, erkender, at der er to elementer i hver enkelt, og det er det væsentlige holde styr på hver. Så jeg har i min ordbog en quiz, hvis værdi er repræsenteret ved tallet 50, Jeg har en Pset der har værdi på 100, og en quiz en, der har en værdi på 40. Derefter senere i koden I faktisk gennemsnit alle disse værdier og liste alle nøglerne til at særlig ordbog. Men det er vigtigt så du kan mærke hvad der sker, er, at det, vi ønsker at gøre, er at tage denne streng og opdele det på denne karakter, som vi kan gøre igen med denne split funktion ved hjælp af denne slags interessant syntaks, der eksisterer her. Bare for nu, at det er OK. Vi ser mere på dette på bare et lille stykke tid. Men nu er der en interessant aspekt, at vi faktisk vil forsøge at konvertere dette streng til et heltal. Men på andre sprog hvad der kan ske, er at vi ville sandsynligvis forsøge at gøre det, og enten komme tilbage en slags sentinel værdi som negativ eller måske et nul eller noget lignende. Eller måske ville det bare forårsaget en fejl. Og vi skulle derefter fange denne fejl og derefter forsøge at gøre noget, der bygger på det faktum, at denne omdannelse til et heltal mislykkedes. Det er, hvor denne idé af optionals kommer ind. Du kan faktisk lave en datatype, er en int spørgsmålstegn, f.eks. Det betyder, at denne heltal er i virkeligheden, valgfrit. Og hvad vil der ske, er, at det kan indeholde et heltal, eller den kan ikke. Det kan faktisk være denne anden idé, helt kaldet nill. I hvilke det betyder, at der er ingen overhovedet i denne værdi. Det er ikke engang nul, der er bare ingen værdi. Der er absolut ingen værdi repræsenteret. Og det er det, denne linje 71 gør. At det er at sige, at jeg vil prøve at sætte en værdi, en variabel kaldet klasse, svarende til omdannelse af denne streng i en int. Så jeg har taget denne streng, denne første komponenter, eller rettere den anden komponenter, fordi dette er nul indekseret af denne streng, som jeg har delt. Og jeg ønsker at konvertere at til et heltal. Men det kan ikke altid gå normalt, fordi forestille hvad der ville ske, hvis i stedet for typen et nummer, jeg skriver selvfølgelig gerne asdf. Det kommer til at mislykkes. Det er faktisk ikke til at være i stand til at konvertere det til et heltal som jeg ville forvente. Så i stedet for at sparke en slags fejl, vi har denne idé om en valgfri. Og det betyder, at brugen af dette spørgsmålstegn, jeg kan sige, OK, er det muligt, at jeg kan tage dette konverteres til en int, og sætte det ind i en variabel, der vil også være en int. Hvis ja, så det betyder at dette var vellykket og denne første del af blokken kan fortsætte. Ellers det mislykkedes. Der er ingen værdi i grade-- eller snarere er der ingen værdi i eksisterende, og jeg faktisk nødt til at prøve at håndtere denne fejltilstand. Du kommer til at se denne spørgsmålstegn hele tiden i Swift og i eksempel kode til Swift. Og faktisk nill operatør denne slags af spørgsmålstegn, den optionals del, bliver sandsynligvis en af de mere vanskelige ting at slags wrap dit hoved omkring som du rent faktisk arbejder med det. Det kan være fornuftigt nu. Og i virkeligheden, da jeg var skriftlig prøve kode til dette, sikkert jeg forstod hvad der foregik, men stadig fanget mig ved overraskelse alle så ofte når jeg ville finde, nogle data var faktisk en nul-version, en valgfri udgave af de data, jeg forventede. Så bare indse, at hvis du har en valgfri udgave du er nødt til at pakke det data fra denne boks. Så det er lidt ligesom I-- forestille mig, hvis du har en kasse, og det indeholder noget. Og hvad du skal gøre er at stille spørgsmålet, er det muligt, at denne boks faktisk indeholder de data, jeg leder efter? Hvis ja, så træk at data ud og sætte det ind i denne variabel eksisterende. Hvis ikke, så jeg bare nødt til at se bort fra indholdet af denne boks helt, fordi det bogstaveligt indeholder ingenting. Eventuelle spørgsmål vedrørende denne? OK, lad os gå væk fra dette slags kommandolinjen baseret ting og begynde at kigge på nogle af teknologi at Xcode giver til os i form af legepladser. Så der er en masse kapacitet her med Swift. Og hvis du åbner op Xcode og det spørger dig, hvad du vil gøre, du kan åbne op på legepladsen og bare lege med en masse forskellige strukturer og aspekter af sproget før du selv begynder at røre iOS SDK eller Mac SDK. Så denne sag, lad os sige, at jeg have-- Jeg har en forholdsvis konstruerede eksempel her, men bær over med mig som vi sortere af arbejde gennem dette eksempel. Lad os sige, at vi er nødt til at gøre en masse eksponenter med en fast værdi, ligesom vi ved, at vi får brug for gøre en masse firkantede beføjelser, f.eks. Så vi kommer til at tage en vis værdi x, vi vil firkantet det, vi kommer til at tage en vis værdi y og vi vil square. Så videre og så videre. Nu kan vi faktisk bare oprette en effekt på 2 funktion for dette, ikke? Så vi ville skabe en effekt på 2 funktion. Vi vil acceptere en dobbelt. Vi output-- eller vi vil returnere en dobbelt type. Vi tager dette resultat og derefter til to gange hvad vi faktisk tage de resultater, som blev initialiseret til værdien af ​​en, og gange det med x. Så i det væsentlige, vi har x gange x her. Og så så jeg kan så, som vi måske forventer, tage, køre magt 2, leverer til det nogle data, jeg kan lide 2.0. Og vi får at se resultaterne her 4,0. Kør magt 2 på 3,2, og vi får at se vores resultat, 10,24. Så langt så godt, ikke? Nu er vi tænker, ja, OK. Nu har jeg faktisk nødt til at gøre en masse kræfter på 3. Så jeg vil kopiere indsætte alt dette kodeks, ændre navnet på den funktion fra potens af 2 til effekt på 3, og alt vil være den samme bortset fra denne værdi her, dette interval, 1 ... 2. Så i stedet for at gentage denne løkke to gange, Jeg ønsker at gentage denne løkke tre gange. Så jeg bare ændre denne værdi fra 1 til 3-- eller snarere fra 2 til 3. Så igen, den samme kode, det er den eneste ændring. Nu er dette også virker. Power of 3 tilvejebragt i en vis værdi på 2. Vi får 8. Så 2 kubik. Og 3,2 kubik er 32,768. Og så langt så godt, ikke? Men forhåbentlig er lidt lidt af et rødt flag for dig i, at vi nu har dobbeltarbejde af kode bortset fra nogle meget mindre skifte fra den ene til den næste. Så er der nogen måde at vi måske være i stand til at forenkle dette problem, hvor vi rent faktisk kan, under kørslen, finde ud af nogle, giver os nogle funktion, der har netop magt, at vi ønsker. Og der er denne idé om lukninger, som er virkelig, virkelig vigtigt i forbindelse med Swift, og i mange andre sprog. Men sandsynligvis vil du se det brugt mere i Swift fordi det er indlejret i sprog end du vil i andre også moderne sprog. Så ideen om en lukning er det, at vi kan have en funktion, der er beregnet til at være en generisk funktion, en generisk magt funktion. Og denne funktion vil acceptere denne eksponent, at vi faktisk vil oprette. Så for eksempel den allerførste Eksempelvis vi ønskede en potens af 2. Så vi ville give magt og derefter i parentes 2. Og nu mærke til hvad dette rent faktisk vender tilbage. Dette tager en indgang af en primer kaldet y, der er et heltal, og den returnerer denne vanvittige leder ting i parentheses-- parentes dobbelt og derefter pil dobbelt. Hvad dette betyder, er, at jeg er vil returnere en funktion. Jeg er ikke returnere en anden type data, er jeg faktisk returnere en funktion der har denne parameter, at accepterer en dobbelt som input og udgange en dobbelt som en returværdi. Og som et resultat, for nu har jeg kaldt magt, der passerer i en vis værdi for y, og jeg er ved at oprette denne anden function-- meddelelse, at der er en anden funktion, der bliver skabt indersiden af ​​denne-- hvad jeg gør er jeg så ændre denne værdi, at man værdi, som jeg havde ændret fra 2 til 3, jeg gør det nu y. Og det fortsætter. Så hver gang jeg kalder magt af væsentlige, hvad der sker er, at jeg får returneret en funktion. Bemærk, at her har jeg defineret en ny variabel kaldet firkant. Jeg har sat det lig magt, forudsat denne værdi 2 til magt. Og hvad det returnerede er den funktion. Så firkantet, den variable firkantet, nu er af typen funktion der har denne-- Ups, skal du rulle op en lille bit-- der har denne signatur, acceptere en dobbelt og output en dobbelt. Så nu, hvad jeg har gjort er jeg har i det væsentlige oprettet en funktion kaldet firkant, påtager sig noget værdi og vil square. Vi kan se, hvad der sker hernede. Square 3 for eksempel betyder, at jeg har tænkt mig at tage værdien 3 og kvadreret det. Så hvordan præcist gør dette arbejde? Når jeg passerer magt 2-- når jeg pass 2 ind i denne magt funktion, denne variabel y er befolket med at værdien 2. Og det er slags gemt i hukommelsen. Det er lidt ligesom afholdt i tilstand eller andet sted i computeren, vi ikke rigtig pleje hvordan eller hvor på dette punkt. Men jeg vender tilbage denne funktion kaldet exponentiate. Og igen, det er faktisk ligegyldigt hvad denne funktion kaldes, vi virkelig kan kalde det noget, at accepterer en dobbelt og returnerer en dobbelt, men anvender denne værdi y inde i den. Så selv om det er denne funktion, denne exponentiater funktion, der er blevet returneret tilbage til mit variabel, jeg kaldte firkantet, det har indeholdt i den denne opfattelse af, hvad y var. Og det husker det. Så hver gang jeg kalder denne funktion, som kaldes nu firkantet, bruger det. Men det betyder også, at jeg kan oprette en anden variabel ved hjælp en anden magt. Så jeg kan lave en terning variabel, for eksempel give den magt 3. Nu terning vil faktisk tage nogle værdi og kube, og returnere det. Så vi kan se, at jeg får en værdi på 8 ud af det. Men denne værdi y har ikke ændret, fordi de er afholdt i slags uafhængige variable. De slags holdes i uafhængige rum i hukommelsen. Så terning vil altid have x til potensen af ​​3. Og pladsen vil altid have x til potensen af ​​2, som betyder, at pladsen vil altid firkantede numre, som jeg forventer. Og terning vil altid kubik numre, som jeg forventer. Det betyder også, at nogle gange kan man få en slags funky ud syntaks hvor du har magt i det nederst på skærmen her, på mindst 5. Og du passerer ind i resultatet. Kalder du det funktion, der er blevet returneret med nummer 4. Og så hvad det væsentlige dette er 4 til den femte strøm, Vi kan se resultaterne der. Med mig indtil videre? Så denne idé kaldes en lukning, fordi det, vi dybest set gør er vi indkapsler nogle data into-- slags omslutte disse data ind i en funktion, og vi er være i stand til at genbruge denne funktion. Nu er denne syntaks selv kan faktisk forenkles et stort beløb. Og der er masser af mulighed i Swift for denne forenkling. Og det er, hvad slags det efterfølgende dem, der faktisk se på. Så i 7b f.eks vi tage netop dette samme kode. Men nu i stedet faktisk definere en funktion indersiden af ​​denne beføjelse fungere og give den et navn, og derefter returnere navnet af denne funktion, som derefter anvendes som en del af denne lukning, i stedet er vi bare at forenkle det. Vi har ikke brug for denne funktion, der skal navngives. Så dette er begrebet anonym funktion, hvor vi kan så accepterer som input i parentes her, variablen x, der er af typen double. Vi kommer til at returnere typen double. Og derefter nøgleord, n, er begyndelsen af ​​denne funktion. Så bemærke, at alt dette er inden krøllede parenteser og vi definerer en Anonym funktion her. Bare en enklere måde at definere præcis det samme. OK? Men hold fast, Swift faktisk tillader os at gå videre og forenkle endnu mere, fordi virkelig vi ikke pleje, at denne parameter er navngivet nogen særlig ting. Det kan virkelig blive kaldt noget og vi kan stadig bruge denne første parameter. Så i virkeligheden er der denne særlige type data i anonym funktioner, der er denne særlige navn variabler i anonyme funktioner at starte med dollartegn og repræsenterer numre parameteren, nul indekseret til denne funktion. Så der er et par ting foregår. Her vil jeg vende tilbage, og derefter en krøllet klammeparentes repræsenterer en funktion, ret? Bemærk, at jeg ikke har defineret parameter typer eller afkastet type. Det kan faktisk udledes på grund af signaturen af denne oprindelige funktion. Så vi kan eliminere det som en mulighed. Men også jeg kan bruge dollartegn nul til repræsentere denne første parameter, der er ledes ind i denne anonyme funktion. Så forenkle det endnu mere. OK? Så vidt, så godt? Nu er det denne Motortype- gøre dig huske denne dollartegn nul at vi så i denne krøllede klammeparentes at vi så bare lidt siden her i Swift seks eksempel? Det var lige her. Bemærk det er præcis hvad vi kigger på, er, at vi har passeret ind i dette split funktion en anonym funktion, kontrollerer den første parameter for at se om det er lig tyktarmen symbol. Og det er præcis, hvad der er sker, er, at alle vi doing-- tilbagevenden søgeord er underforstået i denne case-- vi vender tilbage denne værdi, hvor vi sammenligner den første parameter mod denne karakter colon. Og så den slags afmystificerer dette. Og du kommer til at se denne konstruktion meget i Swift syntaks, så gør holde det i tankerne, når du er tage et kig på dette. Nu kan vi komme i gang skinnerne lidt og gå virkelig dekorativ, der viser selv nogle flere af Swift magt. Du kan endda se nogle af disse i prøven koder. Så det er derfor, jeg har tænkt mig at vise det til dig. Dybest set, hvad vi kan gøre, er, at det første af alt, det var slags overflødigt for mig at gennemføre alt dette magt kode, fordi hvis du importerer Darwin bibliotek, det faktisk indeholder en funktion kaldet pow, der gør dette for dig. Så vi kan forenkle det endnu mere og har vores magt up funktion nu blot være en vidunderlig én liner, hvor vi bare returnere dette anonyme funktion, accepterer dollartegn 0 som sin base og y som sin eksponent. Men vi kan blive rigtig, virkelig dekorativ når vi indse, at Swift har en meget strøm under kølerhjelmen. En masse af de aktører, der Vi har været der beskæftiger sig med, plus tegn og division symboler og alle disse ting, som du normalt operere med med datatyper i et programmeringssprog, faktisk strækbare i Swift. Så hvad det betyder i, at vi kan definere vores egne aktører. Så nu er jeg træt af at skrive i alt dette pow og derefter en parentes, og derefter basen. Jeg ønsker ikke at gøre det. Jeg rent faktisk ønsker at have en operatør, der tillader mig at gøre det. Så jeg kan fortælle Swift, som jeg vil at skabe en operatør, stjerne star-- ved den måde, jeg kan ikke bruge karat fordi karat er en operatør, der gør noget helt andet. Så jeg ønsker ikke at sortere af kollidere med det. Og så det, du ser i en række af sprog, herunder Python, er ligesom star star operatør at repræsentere eksponenter. Så det er den eneste grund hvorfor jeg har gjort det. Og det kommer til at blive en Infix typen operatør. Og jeg nødt til at give til det nogle oplysninger om forrang for denne operatør, så det er venstre associativ. Det er ligesom relativt høj forrang i forhold summation eller formering. Det er højere forrang end alle dem. Så videre og så videre. Og så jeg definere funktion, der faktisk dikterer, hvad denne operatør gør. Så antager, at jeg har en venstre side og højre side, hvilket ville være måske en bedre variabelnavn for dette. Venstre side og højre side. Jeg kan derefter tage denne magt venstre side til højre side og returnere denne værdi. Så nu er det super søde. Alt, hvad vi skal gøre, er 2 star star 3 og der er 2 til tredje potens, og vi får en værdi på 8. 2 star star 10 er 2 til 10. magt, får vi 1.024. Så nu vores magt for funktion, som igen er forskellige, fordi hele idéen bag dette var, at vi har en funktion, som altid tager en vis værdi, og multiplicerer det-- eller rettere tager eksponenten til samme effekt. Så nu er det endnu enklere. Så nu er det bare dollar underskrive 0 star star y. Vi behøver ikke engang at bruge pow længere. OK, der har mistet? Gør vi OK? Eventuelle spørgsmål vedrørende denne ting? Ja? PUBLIKUM: Når du-- [uhørligt] funk magt y dobbelt. Så når du returnerer en funktion. DANIEL ARMENDARIZ: Funk magt y dobbelt. Oh yeah, jeg ved ikke hvad y numre. Undskyld. PUBLIKUM: Hvorfor er du vender tilbage en funktion [uhørligt] kabinet. Er ikke dollar nul stjerne stjerne y [uhørligt] finder, at operatøren med at returnering dobbelt [uhørligt] Dobbelt? DANIEL ARMENDARIZ: Så lad mig besvare dit spørgsmål hvordan jeg forstår det, og du kan fortælle mig hvis jeg ikke forstår dit spørgsmål. Så denne konstruktion, den krøllede klammeparentes dollar tegn nul star star y, er en funktion. Og det accepterer en parameter, der er repræsenteres af denne dollartegn nul. Afkastet søgeord antydes i denne meget kort, anonym funktion syntaks. Hvilket betyder, at væsentlige hvad det siger er, at jeg definerer en function-- og så vil jeg bare kalde det something-- hvor jeg har en vis værdi y. Jeg har y, hvilket er dobbelt. Og jeg vender tilbage en dobbelt. Og jeg har inden for denne tilbagevenden y-- sorry, Jeg skulle ikke have kaldt denne y-- x. Oh dear, oh dear, oh kære. X-- nope-- star star y. Så dette er blot en forenklet version af dette. Og så grunden til, at jeg har dollar tegn nul er, at ved hjælp af denne kabinet betyder, at jeg ikke længere har at skrive pow, eller ikke længere gøre Jeg er nødt til at gøre noget som 3 star star 2. Jeg kan bare have en enkelt funktion kaldet firkant der vil altid tage vis værdi som input og faktisk returnere kvadratet på denne. Så hele formålet med lukningen er bare slags indkapsle den kendsgerning at jeg altid vil bruge y når Jeg kalder denne funktion som magt når du tager denne eksponent. Så vender derefter, en funktion, der accepterer en dobbelt, som er basen, og returnerer resultatet af denne eksponent er nøglen her. Og det er den største forskel. Der var bare lidt af en blomstre. Dette er ikke anderledes sammenlignet med den kendte eksempler men det var bare en smule en blomstre, vi kan faktisk oprette en operatør i Swift og faktisk gøre ting med det, der er lidt af en cool ting. Har jeg besvare dit spørgsmål? Sød. Alt andet før vi går videre? OK. Nu er dette slags rejser Spørgsmålet er at-- godt OK, nu har vi mulighed for funktioner, der skal returneres. Kan vi også forbi fungerer som data eller som parametre til andre funktioner? Og faktisk, vi kan. Så lad os sige, at vi har alle af den samme kode. Vi har pladsen variabel der vil firkantet denne kode. Og vi har terningen variabel der vil terning nogle data. Og vi faktisk ønsker at anvende til en bred vifte af numre. Så det, vi kunne blive fristet til at gøre, selvfølgelig, hvilket bestemt er gyldig, at gentage over denne liste over numre og anvende mine funktioner firkantet og terning og få to nye lister som resultater der er denne oprindelige liste kvadreret og kubik hhv. Helt acceptabel. Men hvad er det, der vi ser her, er, at vi har, igen, dobbeltarbejde vores kode. Og der er måske en mulighed for os at forenkle denne en lille smule. Hvad hvis der var en måde for os at faktisk altid gentage over nogle liste og bare gå til denne magiske fungere en variabel, repræsenterer en funktion at vi ønsker at anvende at hver enkelt post på denne liste. Dette bringer op begrebet hvad kaldes højere ordens funktioner. Og det er væsentligt, hvad dette er, at vi kan skabe en funktion. Og i dette tilfælde det kaldes en mapper, bare for at give den et navn, bare kortlægning over hver enkelt punkt på en liste. Hvor jeg tager en liste og jeg tager en funktion. Og denne funktion, selvfølgelig, har en vis signatur. Det accepterer som en parameter dobbelt og det vil output er en dobbelt. Og hele resultatet af denne funktion går at være en ny liste, der er af typen double. OK? Og hvad jeg har tænkt mig at gøre er at anvende denne funktion f til hvert element i min liste. Og reply-- og hellere returnere dette nye liste som et resultat, som er virkelig cool. Nu kan jeg videregive funktioner rundt. Og denne idé om højere orden funktioner er virkelig vigtigt. Og dette mapper er egentlig bare den fattige mands implementering en funktion, der er bygget i Swift kaldet kort. Og det gør netop dette, måske endda en lille smule bedre. Dette er blot en slags generisk, forenklet version, tillader os at se koncept, der gælder her. Se nu på den måde, at jeg kan faktisk anvende min firkant og min terning funktioner til denne liste af tal. Jeg køre min mapper. Jeg giver det min liste over numre. Jeg giver dem de den funktion, der kommer skal gælde for hver af disse indeks. Og det vil være output som et resultat. Og jeg vil få at se, at jeg har kvadreret og kubik mine tal som resultat. Og selvfølgelig mapper vil tage nogen form for anonym funktion. Vi kan endda se, at jeg har oprettet en ny anonym funktion, bare tager nogle parameter og deler det med 2. Og vi kan se, at jeg har, i virkeligheden, divideret min liste med 2 i stedet. Cool? Så vidt, så godt? Okay, lad os nu vende tilbage til denne idé. Lad os gennemføre dette tilbage i forbindelse med en Karakterbog. Og hvis jeg gør det, kan vi se, at jeg kan anvende en bred vifte af disse options-- eller en bred vifte af disse højere ordens funktioner til rent faktisk at forenkle min evne til at gøre en forskellige ting på lister med tal. Så for eksempel, hvis jeg tage en liste af tal, en af ​​de højere ordens funktioner der eksisterer kaldes reducere. Hvad reducere gør snarere end kort, reduceres vil tage to elementer i listen, vil tage nogen funktion, sammenligner de to elementer listen, og det vil så slags output-- den output af denne funktion vil være et andet element, som du derefter sammenligne med andre. Så du kan bruge dette til rent faktisk summen af ​​tallene på din liste. For eksempel, hvis du havde en liste over 1, 2, 3, 4, 5, du tager de første elementer, 1 og 2. Du kan finde anvendelse på den en tilføjelse funktion, der tager disse to elementer og spytter et af de elementer, hvilket ville være værdien 3. Så tager vi den værdi 3 med den næste element i listen, opsummere de to, og derefter holde gå ned på listen. Vi reducerer listen til en enkelt værdi. Og det bare så sker at plus-symbolet er en operatør, ligesom vi lige har set. Denne operator er faktisk en funktion, har netop denne liste, som vi ønsker, snarere disse egenskaber at vi ønsker. Så jeg opfordre dig til at tage et kig på dette. Jeg vil sortere i træk på fra nogle af denne kode således at vi rent faktisk kan se på nogle faktiske, reelle, ægte Swift i Xcode, i iOS udvikling. Men tag et kig på dette og se om du kan parse igennem, hvad der foregår med nogle af disse højere orden funktioner, herunder filter, reducere, og du vil endda se et eller andet sted herinde kort så godt. Det er lige her. Hvor det vil tage en sekvens af kvaliteter og det vil faktisk kortlægge dem med kontakten konstruktion, som du måske genkender fra C, men det er faktisk meget mere kraftfuld end kontakten konstrukt at vi har i C. Og vi vil anvende denne til hvert element i listen og rent faktisk giver bogstavet kvalitet af hver af disse kvaliteter ved hjælp af alle disse begreber at vi lige har talt om før. Lad os nu undvige for blot et minut og snak om structs. Og så structs er en Vent i C, som vi var i stand til at definere en ny type af data. Structs eksistere inden Swift. Og så gøre en masse andre konstruktioner kaldet Gentagelsestyper og klasser, der virkelig tage denne idé til en helt andet niveau. Og dybest set er det bare en måde at definere en ny type af data. Så hvis du get-- hvis du kommer tværs klasse eller structs eller Gentagelsestyper, ikke får forvirret af det. Det er bare den måde at definere nogle nye bestemt type data. Og det er virkelig vigtigt, når vi taler om iOS app udvikling fordi alt, hvad der findes inden for iOS app er i det væsentlige et objekt af en slags. Og en genstand er dybest set en klasse eller en enum eller en struct. Så i dette tilfælde er jeg at definere en ny type data at jeg ringer vurdering det er nogle egenskaber, herunder et navn og en sekvens af karakterer. Så en form for vurdering at jeg måske har i tankerne ville være quizzer, f.eks. Jeg vil gerne have en vurdering, der var en quiz og som havde en række kvaliteter forbundet med, for quiz en, quiz to, så videre og så videre. Eller jeg kunne have en anden type af vurdering af problematiske sæt. Og jeg kan gøre ting. Jeg kan faktisk have funktioner i denne type af data, som nu kaldes metoder. Så hvis du nogensinde ser den Ordet metode, det virkelig er blot en funktion, der gælder til en meget specifik klasse, eller til en meget specifik type data. Det giver os mulighed for at ændre data i. Så med andre ord, hvis jeg ønsker at føje en karakter til min vurdering, så alt hvad jeg behøver at gøre er at tilføje den score, der var input til denne funktion til min indre egenskab. Der er en anden pæn konstruktion her i Swift, som er denne dot dot dot operatør, hvilket betyder, at resultater kan nu accepterer et vilkårligt antal heltal. Og score vil være en array af heltal, er blevet videregivet til min funktion, som betyder, at jeg kan gøre ting som dette. Jeg kan gøre tilføje karakterer og bare give vilkårlige antal heltal i det og faktisk tilvejebringes et array af disse værdier i min funktion eller i min metode, som det er tilfældet. Nu er det vigtigt, fordi alt i Xcode, alt i iOS, er i virkeligheden et objekt. Så husk at på når vi buste åbne Xcode og springe ud over iOS versioner to og tre og faktisk gå til version fire. Og igen, alt dette vil blive offentliggjort på seminaret siden. iOS fire er sortering af en fuldstændig blæst gennemførelse af en meget grundlæggende app. Og hvad denne app gør, er det indlæser et UI, der ser sådan ud. Igen, hvis vi klikker på storyboard vi kan se, at dette er, hvad det ser ud. Det er den UI. Det har en titel øverst. Jeg har kaldt det web galleri. I midten er der et element kaldet UI billedvisningen. Og i bunden er der en værktøjslinje med en enkelt knap, har elastiske rum, der gør det muligt at center i midten af ​​denne værktøjslinje. Og hvad der sker, er, at når dette belastninger det henter en JSON-fil, der er indeholdt på en server andetsteds, analyserer det JSON fil, og JSON fil ligner lidt dette. Den JSON fil ser sådan ud. Der er det. Det har et albumnavn og Det har en bred vifte af billeder. Hvert af disse billeder har et navn og også en URL selv der repræsenterer jpeg-version af, at de enkelte foto. Så hvad sker er, at når dette program belastninger, det henter den JSON fil, analyserer det, sætter alt dette i hvad der svarer til et array i iOS app udvikling, som er en nsarray. Og så kan jeg derefter indlæse disse data i et program og indlæse det på min skærm. Der er et billede, der blev indlæst med knappen i bunden. Hvis jeg klikker Få Næste billede, det så trækker det billede fra internettet og erstatter det billede i UI billedvisningen. Så du kan hente denne og faktisk tage et kig på det på din computer. Og bygge det og faktisk kompilere det på din enhed. Men det væsentlige processen var dette, skal du oprette storyboard-- eller rettere ikke create-- men vælg storyboard. Og faktisk we'll--, hvis du ikke mind-- vi vil tage blot et par sekunder til rent faktisk at vise dig, hvordan det blev gjort. Lige så, hvordan vi rent faktisk kan opnå dette er lavet en lille smule mere synlige. Enkelt billede ansøgning, er jeg vil kalde dette seminar fire repræsenterer denne bestemt nummer. Gem det på skrivebordet. OK, vil klikke på storyboardet. Og hvad jeg har tænkt mig at gøre er at finde min billedvisning, trække den ind på min bruger interface og center det. Nu bare centrering det desværre kommer ikke til at gøre en hel masse, bortset fra en skærm der er nøjagtig denne størrelse. Så vi kan overbevise os selv om, at ved klikke på dette dobbelte cirkel ting, nedbringe denne pop up menu her og skiftende for at få vist, hvor vi vil faktisk får en chance for at få vist, hvordan dette vil faktisk se på andre enheder. Som vi kan se, har vi ikke engang se det på dette særlige tilfælde. Så jeg har tænkt mig at lukke dette for nu. Og jeg har tænkt mig at vælge dette ikon nede i det nederste del af skærmen. Den siger Løse Auto layout spørgsmål. Beklager, det er afskåret i bunden. Men hvis jeg klikker på det, hvad jeg få denne pop up-- gå væk. Hvad jeg får, er denne pop up, der tillader mig at tilføje manglende begrænsninger. Og ved at gøre det vil så slags låse den i den centrale del af den skærm som jeg kunne forvente. Nu for at få denne knap på toppen af ​​det, jeg har brug for at gå til Editor. Gå til Embed I og klik Navigation Controller. Hvad det vil gøre, er, der vil tilføje hele denne anden komponent til det, men det vil faktisk forbinde det tilbage til mit oprindelige UI. Og detaljerne, igen, gør vi ikke virkelig brug for at bekymre sig om lige nu. Men jeg ønsker at have en værktøjslinje i bunden. Så jeg vil tjekke Shows Toolbar. Og det giver i min mening, som nu er et andet sted, vi kan se det er forbundet herovre. Det giver nu en værktøjslinje på bunden af ​​mit UI. Så nu, i stedet for at vælge et billedvisningen, kan jeg finde et mærke, eller snarere en toolbar-- lad os se, hvor er det? Hvad kaldes det? En button-- element bar-- item-- sorry-- bar knap element. Plop, at der og anvende et par af fleksible rum på begge sider faktisk center,. Så nu har jeg lavet min UI, dybest set. Og jeg kan give den et navn ved dobbeltklikke på toppen her og siger web galleri og så videre. Nu igen, disse er elementer der eksisterer i sig selv. Og jeg er nødt til at forbinde dem til min kode, som Jeg kan gøre ved igen at bringe op denne dobbelte cirkel ikon, skifter fra preview. Som ved den måde, nu kan vi se, er pænt centreret og vil se godt ud på en række forskellige enheder. Skift til automatisk, hvilket vil hente viewcontroller kode. Og nu denne del er vigtig. For at du kan forbinde disse to elementer, din kode til UI, du vælge det element, du vil tilslutte. Så i dette tilfælde, vi faktisk ønsker at indkode ændre billedet, der er indeholdt inden for denne UI billedvisningen. Så hvis du styrer klik fra billedvisningen og træk, du vil opdage, at du får en lille bar, når du giver slip på alt dette pop op vil forekomme. Og det siger, at vi vil oprette en forbindelse. Og herfra vil jeg give det et navn, noget som galleri. Hit Enter. Og det faktisk giver en variabel kaldet galleri at jeg så kan referere i min kode at ændre billedet, f.eks. Så hvordan gør at koden faktisk ser? Nå igen, jeg ønsker ikke at bruge for meget tid på det. Og jeg opfordre dig til at downloade den og tage et kig. Men en af ​​de mest vigtigt aspekt er koden der faktisk henter et billede. Så i dette tilfælde vil jeg at få inden mine fotos array, som er indeholdt inden min klasse. Jeg vil definere navn og URL der er blevet parset ud af denne JSON. Faktisk bede enheden til at få den URL, at hente webadressen fra dette, og derefter hente data fra indholdet af denne URL. Derefter konvertere denne data i et billede ved at føre det ind i UI billedet. Så igen, disse er alle forskellige typer af objekter, forskellige typer af klasser. Og så kan jeg da sætte min gallery.image lig med data. Og det er slags kød af det, der rent faktisk er så i stand til at ændre data from-- forandring billedet fra den ene til den næste. Så igen, forhåbentlig nu en masse af konstruktionerne vil gøre lidt mere mening. Bemærk, at der er nogle udråbstegn her. De udråbstegn er væsentlige relateret til optionals. Hvad jeg dybest set siger, er at uden selv at kontrollere at se, om der er data inden for denne valgfri, Jeg har tænkt mig at gå videre og antager at der er og pakke det. Husk, at vi brugte analogien sortering af en pakke til optionals og vi er nødt til at udpakke pakke og trække data ud. Udråbstegnet kræfter, der rent faktisk sker. Men jeg ved, at dette er sikkert, fordi jeg kontrolleres at se, om billedet data er lig til nul, har jeg faktisk kontrollere at se, om det valgfri var faktisk, mislykkedes. Hvis der havde faktisk ikke allerede. Og så er jeg sikker på, at når jeg kommer til dette punkt, jeg kan roligt pakke disse data. Du kan også se det i i form af et spørgsmålstegn. Så hvis vi rulle ned til hvor jeg brug for rent faktisk parse data. Så du skal ikke blive afskrækket af disse slags lange navne. Du kan finde i Apple Udvikler websted meget henvisninger til alle de objekter og alle de processer, der faktisk gør dette muligt. Men se, at det er væsentligt en funktion, hvor jeg passerer det nogle data. Og jeg kommer tilbage en slags data. Og jeg har brug for at bruge dette som søgeord til konvertere det til denne nsdictionary? Hvilket er igen, en valgfri nsdictionary. Hvilket jeg så nødt til at kontrollere, om den eksisterer. Så jeg kan bruge, at hvis lad succesfulde ligemænd parset, så jeg ved, at det valgfri faktisk indeholder nogle data. Eller hvad jeg gjorde her, var at bare antage, at hvis der var ingen fejl, det er faktisk sikker. Okay, jeg vil gerne takke jer alle meget for at komme. Jeg ved, det var en masse, men det var kun en time at tale om nogle temmelig avancerede ting. Og så forhåbentlig får du en chance for at hente hele koden og tage et bedre, mere grundig kig på det. Sort of overbevise dig selv om alle af de ting, der foregår. Og jeg vil gerne takke dig alt, igen, for at komme. Og held og lykke med din endelige projekter. Har du en god dag.