DANIEL Armendáriz: Hej alla, Välkommen till iOS applikationsutveckling med snabba. Jag är Dan Armendariz. Jag är precepter av dator vetenskapen här på skolan för ingenjörsvetenskap och yrkeshögskola. Och snabba är faktiskt snäll av ett riktigt snyggt språk. Och jag har några planer för idag. Så under nästa timme eller så ska vi att titta på iOS applikationsutveckling själv använder Xcode och faktiskt skapa något mycket grundläggande, mycket enkla tillämpningar. Och titta på det sätt som du faktiskt ta dessa program, och bygga dem, och faktiskt sätta dem på en iOS-enhet. Några av de saker som Vi kommer inte att titta på kommer att innehålla saker som faktiskt ta en ansökan och sätta den på App Store. Det finns en hel del tutorials på nätet som hjälper dig med denna aspekt av det. Men också eftersom som del av CS50 får du att ansluta sig till Apples utveckling laget, CS50 App utvecklingsteam. Om du inte har gjort det ännu, och du är affiliate CS50, Jag rekommenderar att du göra det eftersom det är hur du kan skapa Vissa program i Xcode, bygga dem, och faktiskt sätta dem på några av dina iOS-enheter Om du faktiskt har en fysisk iOS-enhet. Om du inte har ett fysiskt iOS enhet som är mer än bra. Du kan faktiskt utvecklas för iOS. Och Xcode har en simulator som låter dig att se din ansökan åtgärd på din dator. Men det slags är en snygg sak att faktiskt spela och interagera med din ansökan på en faktisk enhet. Så det finns ett par krav faktiskt göra allt detta utveckling. En av dem är att du måste ha en Mac. Det måste vara igång 10.9.4 eller senare För att göra utvecklingen med snabba. Du kan använda en tidigare version för att utveckla med mål C för iOS och Mac. Men jag rekommenderar, och en hel del av exempel som vi ska se i dag, använda 10,10 Yosemite. Så om du ännu inte har uppgraderat, det är en bra ursäkt för att göra det. Nu Xcode 6.1 är den senaste versionen av den integrerade utvecklingsmiljö att Apple ger gratis att du kan ladda ner från App Store. Och jag rekommenderar att du också köra den senaste versionen. Om du råkar köra en tidigare versionen, Xcode 5 och under bara helt enkelt inte stöder snabba helst. Och betaversioner av sex, vilket släpptes under sommaren, gör stödja snabb, men det finns varit ett enormt antal av förändringar i språket, tillräckligt så att den kod som du är kommer att titta på och att du kanske hitta på internet kommer faktiskt inte kompilera ordentligt i dessa tidigare versioner av Xcode. Så återigen, om du gör ännu inte ha en utvecklarkonto, Jag rekommenderar att du går till developer.apple.com. Anmäl dig, skapa ett utvecklarkonto, och gå med i CS50 appen utvecklingsteam. Det kommer att ge dig en möjlighet att sammanställa dina program och lägg dem på enheten. OK, så låt oss komma igång. Det allra första vi ska göra är att faktiskt skapa en mycket enkla projekt i Xcode som gör att du kan göra en ansökan. Så om du ännu inte har Xcode öppen, gå vidare och öppna den och skapa ett nytt projekt. En särskild stänkskärm öppnas och ger dig några alternativ om vad det är som du vill göra. Bara säga att du vill skapa ett nytt projekt, en ny ansökan. Detta fönster visas, förutsatt att du använder Xcode 6.1. Just nu, och för det varaktighet detta seminarium, vi kommer att använda Enkelvy applikationer, precis slags ursprunglig ansökan att få dina fötter är våta. Och du kan filial ut på egen hand därifrån. Klicka på Nästa på denna punkt. Nu här finns det ett par saker att du kanske vill komma in. Produktnamnet är namn på ditt projekt. I det här fallet, jag är bara kommer att kalla det Seminar1 eftersom det är vårt första exempel. Organisation namn, i detta fall är bara mitt namn. Du kan givetvis ändra det till ditt eget namn, eller att CS50. Organisation identifierare, om du råkar ha en hemsida bara ta domännamnet i omvänt, com.yourname. och sedan namnet på produkten bör visas automatiskt efter det som bunten identifierare. Uppenbar det språk som vi är kommer att använda för idag är snabb. Du kan givetvis använda Objective C för det, men i dag kommer att vara snabb. Och vi kommer nu att säga universella enheter, så att det fungerar på både iPad och iPhone. Och vi kommer att lämna kärn uppgifter okontrollerade att hålla projektet relativt enkelt för tillfället. Så låt oss gå vidare och klicka på Nästa. Och det kommer att fråga mig där jag vill spara det. Jag ska bara spara den på mitt skrivbord nu. Okej, det är så nu vad som kommer hända när du faktiskt öppna Xcode. Och märker att allra första du ser är denna utropstecken som säger nej tecknandet identitet hittas. Jag gjorde avsikt här på min dator och jag är hoppas att jag kommer att kunna faktiskt fixa det, eftersom jag vill att du ska se hur detta kommer faktiskt arbetar på din egen maskin. Gå vidare och klicka fix fråga. Det kommer att fråga dig om du har en befintligt äpple utvecklarkonto. Det är där att gå med i CS50 app utvecklingsteam är viktigt så att du inte bara har en app-konto, men du har också förmåga att skriva apps och sätta dem på din iOS-enhet. Detta är inte-- klick fix frågan är inte nödvändigt om du bara kommer att bygga och utveckla lokalt, helt inom iOS simulatorn. Men nu ska jag att utveckla och sätta dem på min iPad, som kommer att vara kunna sända också. Så jag vill verkligen lägga detta. Och det kommer att fråga mig för min Apple-ID. Så det kommer att vara så här. Och jag måste hämta min lösenord, som är här borta. Så ge mig bara en sekund för att finna att, och kopiera det, och klistra in den här. Klicka på Lägg till. Det kommer att fråga mig vilket lag jag vill gå. Jag kommer att göra Högskolan. Klicka på Delta. Hoppsan, det är fel. Låt oss göra det här. Förhoppningsvis att man kommer att fungera. Att man fortfarande inte fungerar. Vi kör ut ur goda här. OK, bör detta fungera. Nu stänger den. Nu gör skola engineering, klicka väljer. Och nu förhoppningsvis efter en några sekunder du can-- OK, Jag ska återkalla och förfrågan. Oh man, det här kommer att inte fungerar. OK, jag ska prova en annan. Låt oss göra detta här. Live demos misslyckas mig. Vi kanske måste återgå till just bygga helt lokalt, men det skulle vara OK i det här fallet. Så här, medan detta är faktiskt arbetsmiljö, vad vi ska göra är bara skapa en mycket enkel Hello World-program. Så det här är Xcode. Och om du inte har sett det ännu, det kan vara lite skrämmande i början. Det finns en hel del rutor, det finns en massa doodads inom olika områden. Men bara att inse att det finns verkligen flera huvudkomponenter till denna utvecklingsmiljö. Längst till vänster är alla filer som är tillämpliga på ditt program eller till just ditt projekt. Vi kommer att klicka runt på några av dem och vi kommer påpeka det mest viktiga sådana över tiden. Längst till höger, vi har en uppsättning attribut. Och alla dessa attribut, det finns olika rutor för attributen. Rutorna kommer att ändras beroende på ramen för det huvudsakliga innehållet, vilket råkar vara i mitten. Nu i mitten kan faktiskt visa du en mängd olika saker, till exempel din kod själv. Eller du kanske faktiskt have-- när du klickar på storyboard som är, förresten, bara en grafisk representation av ditt användarnamn gränssnitt för din application-- sedan panelen attributen på mycket långt till höger faktiskt kommer att förändras. Nu finns det ett par andra saker som jag vill peka. Du kan sorts utforska runt i miljön på egen hand. Men en av de saker som har varit till stor nytta är den här knappen här, upp till höger i fönstret. Det finns den här knappen som ser ut på den bortre lämnat den har en punkt följt av två cirklar och sortera av två pilar som pekar bort från varandra. Om du växlar mellan standard editor, vilket är längst till vänster en, den som som är valt som standard, och de två cirklarna överlappar varandra, vad du faktiskt får är en dubbel fönsterruta vy. Och detta är faktiskt kommer att vara användbart för oss när vi behöver länka objekt i användargränssnittet till koden. Och vi ska prata mer om att på bara ett ögonblick. Men inser att om du får ännu fler rutor som denna, du kan förenkla din syn bara lite genom att klicka tillbaka på din enda editor. Så långt så bra. Så i princip har vi koden på vänster, attribut till höger, och vad det är vi jobbar om här i själva centrum. Så här har jag klickat på huvudstoryboard. Och storyboard, igen, är ett sätt i Xcode att du faktiskt kan skapa ditt användarnamn gränssnitt med bara dra och släppa tekniker. Och så för vår mycket första ansökan här är precis vad vi ska göra. Vi kommer att gå ner till mycket långt nedre högra delen av skärmen, som innehåller en mängd användarelement som du sedan kan klicka och dra att skapa ditt användargränssnitt. Nu alla dessa element kallas vyer eftersom de levererar någon form av uppfattning. Det finns en bild view, för exempel att faktiskt visa en bild på användargränssnittet. Det finns en tabell för att faktiskt visar en tabell. Så vidare och så vidare. Det finns en mängd olika vyer som du kan välja här. Så bara för att nu ska vi för att söka efter en etikett. Du kan bara bläddra igenom alla de listor som finns där. Men det finns sökningen bar längst ner som gör det lättare att identifiera specifika vyer som du faktiskt vill dra in i din användargränssnitt. Hittade mitt skivbolag. Jag kommer att dra det här, direkt på min exempelprogrammet. Just där i mitten ser bra ut. Och jag ska skriva "Hello World!" Hit Enter. Nu har jag en etikett. Det ser inte ut som det är centrerad ganska ordentligt. Så jag kan försöka åter centrera den. Lyckligtvis erbjuder dessa guider för att göra saker och ting mycket lättare. Jag ska försöka att kompilera det. Förhoppningsvis det faktiskt kommer att arbeta här. Och om det inte gör det på bara ett ögonblick Det kommer faktiskt att visas på min iPad. Det är just här. Där är det. OK, så det är det. Vi är klar. Vi har skapat vår mycket första ansökan. Nu naturligtvis detta inte göra någonting. Det är bara en etikett. Det finns inget samband mellan användargränssnittet koden. Så om vi verkligen ville ha att skapa denna förbindelse, om vi ville verkligen ha någon form av kommunikation mellan elementen som finns på skärm och den kod som tillåter oss att kontrollera dessa delar, sedan vi faktiskt behöver titta på själva koden. Så detta är vad som kallas ViewController.swift. Och för, särskilt för dina första program, detta kommer att vara typ av Huvuddelen av den kod som du enter-- kommer att vara i det här dokumentet här. Det finns en massa saker det är här inne så länge, eller hur? Det finns import UI sats klass, åsidosätta, [? funk,?] alla dessa olika saker. Och det är inte helt klart vad det är att allt detta innebär. Så låt oss ta ett steg tillbaka bort från Xcode för lite och titta på själva språket, snabbt. Så med snabba, det var i design och utveckling på Apple för ungefär fyra år till min förståelse. Och det finns ett par funktioner om det som är riktigt snyggt. Först av allt, det samman språk, precis som C. Så måste du först kompilera den och sedan köra den innan du kan faktiskt köra koden som resulterar. Men det finns, i motsats till C, ett interaktivt uppmanas att du faktiskt kan köra och skriv godtyckliga kommandon till. Och så mycket som en JavaScript-konsol, som ni kanske känner till nu, det faktiskt kommer att utvärdera de kommandon och ge dig utgången. Och de har även tagit att till nästa nivå och de har skapat något kallade lekplatser i Xcode som gör att du kan arbetar visuellt med kod. Och vi kommer faktiskt se några exempel av att på bara en liten bit. Den är baserad på C. C ligger bakom det, eftersom alla kompilatorer skapa kod ur C och skapa objektkoden från den. Men det verkligen aktier relativt lite syntax. Det kommer att se ganska annorlunda. Det kommer att finnas vissa likheter. Men det kommer att bli en hel del skillnader jämfört med, säg, JavaScript eller PHP. Och vi kommer att peka dessa i ett ögonblick. Nu en av de största sakerna om snabba som är trevligt är att, särskilt jämfört till C, det tänkt att vara säker. Allt i det är tänkt att vara mycket starkt skrivit i. I själva verket är det nästan irriterande i början, när du först börja arbeta med snabba, hur mycket det upprätt typer allt. Allt som är en sträng måste förbli en sträng. Det är väldigt svårt att sortera i omvänd det eller tvinga in den i någon annan form. Och återigen visar vi exempel på detta. Men i slutändan inser att Detta är tänkt att skydda dig, och genom dig jag menar din kod, från kraschar på något hemskt sätt när du har någon form av inkompatibla typ. Och återigen, arbeta med det. Eftersom det kommer att bli frustrerande i början som du försöker lista ut varför just du får denna ovanliga fel att göra med olika typer. Men det kommer att vara värt det i slutändan. Det tar upp automatiskt minneshantering, så inte längre göra dig måste ta itu med saker och ting som malloc och gratis och alla av dessa möjliga saker. Och det är också utformat för generaliseringar. Så medan vi kan använda en Xcode till skapa iOS appar och Mac-program, Vi kan också använda den som ett skriptspråk. Och så att vi kan använda den sorts av istället för PHP eller istället Python faktiskt snabbt analysera och bearbeta vissa uppgifter som vi har på vår dator. Den har ett brett utbud av moderna funktioner, optionals, föränderlighet, generika, nedläggningar och en hel del av detta saker du kan eller inte kan känna igen. Och det är bara typ av en olycklig del av språket som en del av dessa slags futuristiska, moderna element som är inneslutna elementen är så djupt inrotat att jag faktiskt kommer att måste lära dig CS50.5 lite. Vi måste lära lite mer om några av funktionerna för att verkligen förstå vad som händer vidare och så att du kan titta på koden och inte känna sig helt förlorad. Och ser du vad jag menar genom att på bara en minut. OK, så let's-- nog av detta sorts teoretisk grejer. Låt oss faktiskt titta på vår mycket första snabb programmet. Det är en rad kod. Linje 14 här, det säger utskrifts l n hello CS50. Så det finns ett par saker som är mycket annorlunda om detta förhållande till saker som du kan vara van vid från C, till exempel. En av dem är att det finns ingen intmain, det finns ingen inkluderar avsnitt, det finns inget av detta extra grejer. Den omfattar, liksom standard I / O, som biblioteken som faktiskt ger den standardfunktioner i språket, automatiskt ingår som del av SWIFT: s standardbibliotek och som importeras automatiskt. Du behöver inte göra att importera manuellt. Intmain existerar inte eftersom den viktigaste inkörsporten för koden är faktiskt på början av koden. Så någon kod som du har med start från början faktiskt kommer att utföras vid starten. Så detta förenklar verkligen kraftigt. Lägg märke till också, att det finns ingen semikolon. Det finns inga semikolon i detta språk. Du sätter ett uttalande på individuell linje och sedan nästa rad representerar den andra uttalandet. Om du vill sätta mulitiple uttalanden på nätet, så har du separera det med semikolon. Men för det mesta, för god stil, är vi aldrig att se semikolon för Vid tillämpning av separerande uttalanden i snabb. Så hur går detta egentligen? Väl mycket likt C vi faktiskt måste sammanställa denna. Och så att vi kan göra det genom att använda snabb c och därefter 1.swift. Och sedan efter ett par minuter kommer detta att sammanställa och då kan jag köra punkt ett. Och än det kommer bara säga "Hej CS50." Awesome, så det går vi. Det är vår första Hello World. Låt oss gå vidare till nummer två. Nu i this-- detta har förändrats något, eftersom medan normalt du do-- faktiskt alltid har du att sammanställa en snabb program innan du faktiskt köra det-- en av de stora dragen att jag nämnt innan var att swift kan faktiskt användas i sorterings av en pseudo-tolkande läge finns är i själva verket som en tolk. Men vad detta kommer att göra är det är i själva verket en snabb ansökan att du kan köra. Så till exempel om du bara skriver snabbt här, vad kommer att hända är att du kommer att få en snabb. Och du kan skriva ditt snabba kod, skriva ut hej, och kör det. Och det kommer faktiskt print-- väl, gjorde det inte ut i det här fallet eftersom det skrivs till centrerad ut, som inte syns här. Men det är faktiskt kan fungera. Och så i detta fall, jag är bara kommer att använda detta som ett manus. Och jag kan faktiskt köra denna kod där. Så det sätt som jag faktiskt kör det kommer att vara något annorlunda, men du ser att på bara ett ögonblick. Nu, i detta fall vad vi ska göra är att först definiera en variabel. Så detta är hur vi definierar en variabel i snabb, är använder vi låt nyckelordet, följt med namnet på variabeln, och sedan ger vi några initiering uppgifter valfritt. Så här fallet vi definierar en konstant som heter namn, och vi kommer att använda det i utsignalen från vår skrivrad längst ner, hej namn. Nu märker att istället för att använda% s, Vi kan kapsla in namnet på denna variabel i / () och kunna concatenate i innehållet i denna sträng till denna sträng. Nu skillnad C, är sträng ett faktiska verkliga typ i snabb. Och så den sitter vid sidan ints och vid sidan fördubblar mycket lätt och naturligt jämfört till några av de andra språk som vi har sett. Så detta skulle faktiskt fungera precis som du förväntar dig. Jag kan köra 2.swift. Och vi ser att mitt namn är faktiskt skarvas in, "Hej Dan." OK, awesome. Går vidare till nummer tre. Nu var det lite av en vit lögn som jag sade att det sätt som vi deklarerar variabler var att använda låt nyckelordet. Så många gånger som du eventuellt kan du göra vill använda låta, eftersom vad det gör är den definierar en konstant. Och som berättar snabbt att det kan optimera hastigheten på din ansökan eftersom den vet att det variabel kommer inte att förändras. Så noggrant utvärdera När du ska använda en variabel för syfte att ändra det. Och när du ska skapa en variabel bara att hålla vissa uppgifter och det är faktiskt inte kommer att förändras. Så här begreppet oföränderlighet, det faktiskt inte kommer att förändras, är viktig även som långt ner som definiera variabler. Så här har vi definierat ett namn, låt namn, och i detta fall det är en konstant, är det av typen sträng, och är det lika med Dan. Så medan i den tidigare kända versionen, infers-- och genom "det" Jag menar swift-- swift härleder den typ av data att vi har ingått variabeln. I det här fallet kan vi vara explicit. Så låt sedan namnet på detta variabel är namnet och sedan ett kolon. Och efter kolon gör vi specificera typen av data. Så inte längre är det int namn eller string namn eller något liknande. Men i stället låta etiketten är vi definiera huruvida det är konstant eller variabel, följt av namnet, följt av typen valfritt. Så i detta fall vi definierar detta namn är en sträng. Vi säger är Dan. Och nu har jag en annan variabel, i detta fall det kallas etikett. Men märker att det är prefixet med nyckelordet var. Nyckelordet var medel att denna variabel kan ändras vid ett senare tillfälle i tid, någonstans i koden kan vi faktiskt förändra det och det kommer inte att ge oss något särskilt fel. Vi kan göra standard Concatenating Operatören här med plussymbolen att faktiskt lägga till vår namn in i denna sträng. Och då kan vi skriva ut som vi såg bara en stund sedan. Låt oss nu säga att du vill skapa en variabel men du vill inte initiera det ännu. Du ännu inte vill sätta några data i den. Jo du har att berätta swift vad den typ av data kommer att vara innan du kan faktiskt definiera det ordentligt. Så i det här fallet, när vi har definierat en variabel som heter klass måste vi vara explicit om dess typ, eftersom det kan inte sluta att bara titta vid det initierade uppgifter som du lämnar till den. Det kommer att ge oss ett fel om du bara typ var klass, till exempel, eftersom den inte har någon typ därför. Så grad = 100. Så att 100 är ett heltal, det passar väldigt fint in i det. Den kommer att fortsätta att fungera. Vi kan se hur då vi kan sammanfoga detta i. Nu kanske du frestad, om du faktiskt ville sammanfoga den klass till en annan textsträng, in i en annan sträng, att du skulle bara använda samma konkatenering operatör. Och det normalt skulle vara sant. Men snabba inte tillåter dig att implicit ändra typ av data. Så i det här fallet, det här line, 25, kommer att misslyckas eftersom lönegrad är en heltal och inte en sträng. Och så finns det en obalans inställd typer. Så du måste vara explicit när du vill ändra dessa data, när du vill tvinga detta data till en annan typ och säger, OK, jag vill ta denna klass, som är ett heltal, och konvertera det till en sträng. Så jag tar ett kapital s String alla typer, kommer du att märka, aktiveras, Int, Dubbel, String, så vidare och så vidare. Alla av dem aktiveras bara för att göra saker och ting lättare. Och vi ska säga kapitalisera String passera in det betyget. Och det kommer att skapa en sträng ur denna heltal. Och då kan vi slå samman två mycket snyggt. Eventuella frågor om denna grejer hittills? Okej, låt oss plöja genom till nummer fyra. Nu ska vi prata om några mer avancerade strukturer, som arrayer och loopar. Och till skillnad från C, arrayer i snabb inte företräds av pekare. Pekare i snabba, trots att de existerar, som kallas som osäkra pekare eller någon liknande typ som den här, de är inte utsatta för du normalt. Så det blir mycket svårt för dig att manipulera minnet direkt i din dator. Så arrayer är bara en datatyp. Och de är refererade använder denna typ nu standard hakparentes notation när du har sett förut. Men när du faktiskt vill definiera en typ av en variabel som en array av något viss typ, då du sätta den typen inom hakparenteser. Så vad jag säger här är att Jag skapar en variabel som heter kvaliteter av typen int array. Och jag ställer den lika med en del initialiserade data, som i detta fall är 100, 0, 90, 85, som är bara en samling godtyckliga kvaliteter här. Nu i detta fall jag kunde, minns, ta bort typ, och det skulle kunna sluta sig till det baserat på det initierade data. Men om jag tog bort detta och Jag behövde ställa in den senare, då skulle jag måste se till att att jag har typ där. Okej, låt oss gå tillsammans. Så vi can-- arrayer tillhandahåller oss en mängd metoder genom att punktnotation på dig är förmodligen nu bekant med. Så grades.count, till exempel, berättar exakt hur många av element som är på denna matris. Om jag vill lägga additional-- Nu märker att detta är en var och inte-- detta är en variabel och inte en konstant, vilken betyder att jag kan ändra innehållet av denna array, kan jag lägga till objekt i den. Men jag kan inte bara säga kvaliteter och sedan i hakparenteser fyra, eftersom det kommer att vara en out of bounds fel i det här fallet. Om jag vill faktiskt förändring storleken på denna samling, Jag måste använda punkt append metod för att lägga något på till slutet av den. Jag kan dock förändras individuella index. Så jag kunde använda betygen och sedan hakparenteser noll för att manipulera detta första index och så vidare, som du normalt skulle förvänta sig. Och jag kan göra samma sak att faktiskt ta emot data från det också. Nu finns det också en slags fantasi metod att göra detta, kvaliteter plus jämlikar och sedan ett annat index, vilket kommer append-- eller inte annat index-- men en annan lista som kommer bifoga denna förteckning på baksidan av betyg. Och betygen kommer då innehålla allt det. Men det blir liksom en extra sak att jag bara visar dig för skojs skull. Nu finns det en for-loop. Och det här är början på där saker börjar ändra lite. Lägg märke till hur detta för slingan är annorlunda för slingor i C. Nu kommer jag att konstatera att för slingor i Swift kan göras för att se ut efter loopar i C, men det finns en hel del mer användbara konstruktioner som i huvudsak eliminera behovet att få för var i lika 0 semikolon i är mindre än en viss längd, så vidare och så vidare, eller hur? Och denna konstruktion är bara en av dem. För index, är index nytt variabel, i detta fall, inom räckhåll. Och vad jag säger är att det finns ett område från 0 hela vägen upp till men inte grades.count. Så här dot dot mindre än tecken representerar ett intervall av värden som börjar från noll hela vägen upp till grades.count minus ett. Det finns en separat operatör som existerar, vilket är dot dot dot, vilket skulle menar att jag vill intervallet noll till betygen räknas inclusive. Men i detta fall, eftersom dessa arrayer är noll index, vi naturligtvis vill inte gå till maximalt antal kvaliteter. Jag kan summera betygen, som du kanske förväntar sig, och utgång allt det här. OK, vi går vidare. Nu ska vi prata om funktioner. För att definiera en funktion du använder funk nyckelordet. Och återigen, i Swift måste man vara mycket försiktig med de typer. Du ger till det parametrar genom att definiera, till exempel, namnet på parametern och sedan i colin, vilken typ av data att du förväntar dig att parameter att acceptera. Så i det här fallet har vi en Funktionen kallas utskriftskvalitet räknas. Den accepterar en variabel som heter betygsbok, eller snarare en parameter kallad betygsbok. Och vi förväntar oss att betygsbok att vara en array av heltal. Om detta betygsbok är tomt, vi ska skriva ut en sak. Annars kommer vi att skriva ut numret kvaliteter som detta faktiskt har. Om vi ​​nu vill återvända något värde, då vägen att vi ändrar denna definition är att faktiskt använda den här pilen nyckelordet, eller att använda den här pilen signifier. Så här ska vi definiera en funktion som kallas genomsnitt. Vi kommer att acceptera en lista med tal. Och vi kommer att återvända en dubbel, vilket förhoppningsvis vara medelvärdet av denna matris. Och för att göra det, för att faktiskt beräkna detta genomsnitt, Vi kommer att ta en summa och vi kommer Kursen sammanfatta alla objekt inom denna matris. Lägg märke till att det finns en ny stil för loop här. Vi behöver inte vara explicit om iterera över varje enskilt element, men vi kan i stället säga klass och betygsbok, mening att för varje enskild objekt som vi har i det här, föreskriva att objektet i detta variabel som heter klass. Och jag vill göra något med det. Så jag ska summera allt detta uppgifter och faktiskt returnera dubbel delning. Nu märker igen här finns det Begreppet heltalsdivision i Swift. Om du vill dubbla division eftersom du vill decimaler, då måste man vara tydlig, inte bara om den ena sidan, eftersom det inte kommer att låta dig att tvinga uppgifter på vardera sidan av detta, du måste faktiskt kursen båda sidor i dubbel så att du är väldigt explicit om att se att du gör dubbel delning. Låt oss gå vidare. Så om jag vill verkligen att accept-- så i detta speciella exempel, detta är fortfarande ett kommando line baserad applikation. Och vi börjar se några av begränsningarna i den unga språket i att även om vi kan åtkomst argumenten genom att använda detta process.arguments, det fortfarande inte nödvändigtvis den renaste sak som vi någonsin har sett. Men i grund och botten jag uppmuntrar dig att sorts titta på denna kod och försöka lista ut vad exakt som händer. I huvudsak det som händer är att vi tar en lista med argument och var tvinga dem in heltal, och då är vi kommer att använda det som ett sätt att skriva ut ut genomsnittet av alla våra kvaliteter. Går vidare. Nu finns det en annan typ av data-- annan datatyp stället arrayer kallade ordböcker, som är mycket liknar hashtabeller eller hash kartor och liknar också PHP: s associativa arrayer. Så de har uppfattningen av nycklar och värden. Och de är definierade också med denna hakparentes notation, men skillnaden är att ordböcker har insidan av klammer, ett kolon. Och kolon separerar datan typ som är nyckeln och värdet. Så i det här fallet, kommer jag att skapa en ordbok för att acceptera vissa kvaliteter. Och det kommer att bli av typen string: int, vilket innebär, att alla av nycklar kommer att vara strängar, och alla av värdena på de nycklar kommer att vara heltal. Vad detta betyder är att jag kan sedan referera till specifika uppgifter att jag vill använda dessa nycklar snarare än att använda numeriska index som jag skulle ha för en vanlig array. Nu ska vi se, det finns en viktig sak att jag också vill nämna om denna speciella kodsekvens. Och det är att det finns annan typ av data, eller snarare finns det här idé om uppgifter som är innesluten i Swift kallas optionals. Och vad optionals betyder är att den erkänner det faktum som ibland du inte kommer att får de data som du faktiskt förväntar sig. Och så vad jag menar med det är-- låt oss ta en titt på denna sekvens av kod vilka itererar över alla de argument som skickas till den här koden och försöker konvertera dem, försöker att delas upp i en mångfald av strängar, eftersom det accepterar en mycket viss typ av argument. Och då kommer det att försöka tvinga strängarna som representerar siffror i heltal som är kvaliteter, att jag då kan beräkna. Så i princip jag ska använda denna split funktion som finns inom Swift standardbibliotek. Jag kommer att passera in det sträng som jag vill dela. Och sedan använda detta sorts funky syntax, vilket Jag vet inte om vi ska komma till, men kanske, vi kommer faktiskt specificera exakt karaktär som vi vill dela på. Så vad innebär det egentligen ut? Låt oss ta en titt på faktiskt kör den här koden. Så till exempel, låt oss säga att jag har en frågesport och jag fick 50 på det. Och jag har en PSETs och Jag fick en hundra på det. Och jag got-- det finns en annan quiz och jag fick en 40 på det. Jag slog Enter, och så småningom vad kommer att hända är att vad den gör tar dessa parametrar, delning strängarna på dessa kolon, erkänner att det finns två element i var och en, och det är i huvudsak hålla reda på varje. Så jag har i min ordbok en frågesport, vars värdet representeras av antalet 50, Jag har en PSET som har värde av 100, och en frågesport en som har ett värde på 40. Sen senare i koden jag faktiskt genomsnittliga alla dessa värden och lista alla nycklar att särskild ordbok. Men detta är viktigt så att du kan märka vad som händer, det är vad vi vill göra är att ta den här strängen och dela den på denna karaktär, som vi kan göra igen med denna uppdelning funktionen med denna typ av intressant syntax som finns här. Just nu antar att det är OK. Vi ska titta mer på detta på bara en liten stund. Men nu finns det en intressant aspekt som vi faktiskt vill försöka omvandla detta sträng till ett heltal. Men i andra språk vad som kan hända är att vi skulle förmodligen försöka att göra det och antingen få tillbaka något slags sentinel värde som negativ eller kanske en null eller något liknande. Eller kanske det skulle bara orsakat ett fel. Och vi skulle behöva sedan fånga felet och sedan försöka göra något bygger på det faktum att denna omvandling till ett heltal misslyckades. Det är där denna idé av optionals kommer in. Du kan faktiskt skapa en datatyp som är en int frågetecken, till exempel. Det betyder att denna heltal är, i själva verket, valfritt. Och vad kommer att hända är att det kan innehålla ett heltal, eller det kanske inte. Det kan i själva verket vara så här andra idé, helt kallas nill. I vilket det betyder att det finns inget värde alls i detta. Det är inte ens noll, det finns bara inget värde. Det finns absolut inget värde representerade. Och det är vad denna linje 71 gör. Är att det är att säga att jag vill försöka ställa in ett värde, en variabel kallad grad, som är lika med den omvandling av denna sträng till en int. Så jag har tagit denna sträng, denna första komponenter, eller snarare den andra komponenter, eftersom detta är noll indexerad, om detta sträng som jag har delat. Och jag vill konvertera att till ett heltal. Men det kan inte alltid gå vidare normalt, eftersom föreställa vad skulle hända om, snarare än typ ett nummer, jag skriver ju som asdf. Det kommer att misslyckas. Det är inte faktiskt kommer att bli kan konvertera det till ett heltal som jag förväntar mig. Så i stället för att sparka igång någon form av ett fel, Vi har denna idé om en valfri. Och det betyder att du använder Detta frågetecken kan jag säga, OK, är det möjligt att jag kan ta detta, omvandlade det till en int, och lägg den i en variabel, vilket kommer också att vara en int. Om så, det betyder att detta var lyckat och denna första del av blocket kan fortsätta. Annars misslyckades det. Det finns inget värde i grade-- eller snarare finns det inget värde i befintliga, och jag har faktiskt försöka hantera detta feltillstånd. Du kommer att se det här frågetecken hela tiden i Swift och exempelkod för Swift. Och i själva verket den nill operatören, denna typ av frågetecken, den optionals delen, kommer att vara förmodligen en av de svårare sakerna att sorts linda huvudet runt som du faktiskt arbetar med det. Det kan vara meningsfullt nu. Och faktiskt, när jag var skriva exempelkod för detta, säkert jag förstod vad som pågick, men ändå fångade mig överraskning varje så ofta när jag skulle finna att vissa uppgifter var faktiskt en nollversion, en valfri version av de data som jag hade förväntat mig. Så bara att inse att om du ha en valfri version du måste packa upp den data från den här rutan. Så det är ungefär som I-- tänk om du har en låda och den innehåller något. Och vad du behöver göra är att ställa frågan, är det möjligt att denna låda faktiskt innehåller uppgifter som jag letar efter? Om så är fallet, dra sedan dessa data ut och lägg den i denna variabel befintliga. Om inte, då jag måste bara bortse från innehållet i denna ruta helt och hållet eftersom det bokstav innehåller ingenting. Eventuella frågor om detta? OK, låt oss gå bort från detta sorts kommandoraden baserade sak och börja titta på en del av tekniken att Xcode ger till oss i form av lekplatser. Så det finns en hel del kapacitet här med Swift. Och om du öppnar upp Xcode och det frågar dig vad du vill göra, du kan öppna upp lekplatsen och bara leka med en mängd olika strukturer och aspekter av språket innan du ens börjar röra iOS SDK eller Mac SDK. Så här fallet, låt oss säga att jag have-- Jag har en relativt krystat exempel här, men bär med mig som vi sorterar av arbete genom detta exempel. Låt oss säga att vi måste göra en hel del av exponenter med ett fast värde, som vi vet att vi kommer att behöva göra en hel del kvadrat befogenheter, till exempel. Så vi kommer att ta lite värde x, vi kommer till torget den, vi ska ta lite värde y och vi kommer att torget den. Så vidare och så vidare. Nu kanske vi faktiskt bara skapa en makt 2 funktion för detta, eller hur? Så vi skulle skapa en effekt av 2-funktionen. Vi ska acceptera en dubbel. Vi ska output-- eller vi ska returnera en dubbel typ. Vi tar det här resultatet och sedan för två gånger vad vi faktiskt ta resultaten, vilket var det initieras till värdet av en, och multiplicera det med x. Så i huvudsak har vi x gånger x här. Och så då kan jag då, som vi kanske förväntar, ta detta, kör makt 2, tillhandahåller det några uppgifter, jag gillar 2.0. Och vi får se resultatet här 4,0. Kör makt 2 på 3,2 och vi får se vårt resultat, 10,24. Så långt så bra, eller hur? Nu vi tänker, ja, OK. Nu har jag faktiskt behöver göra en hel del befogenheter 3. Så jag ska kopiera klistra in alla här koden, ändra namnet på funktionen från makt 2 till makten av 3, och allt kommer att vara samma utom för detta värde Här, detta intervall, 1 ... 2. Så i stället för att upprepa denna slinga två gånger, Jag vill upprepa denna loop tre gånger. Så jag ändrar bara det värdet från 1 till 3-- eller snarare från 2 till 3. Så återigen, samma kod, det är den enda förändringen. Nu fungerar även. Power of 3 ges i något värde 2. Vi får 8. Så två i kubik. Och 3,2 kubik är 32.768. Och så långt så bra, eller hur? Men förhoppningsvis är lite lite av en röd flagga för dig i att vi nu har visst dubbel kod undantag för vissa mycket små ändras från ett till nästa. Så finns det något sätt att Vi skulle kunna förenkla detta problem, där vi kan faktiskt, vid körning, räkna ut en del, lämnar till oss någon funktion som har just kraften i att vi vill. Och det är denna idé om nedläggningar, vilket är riktigt, riktigt viktigt i samband med Swift, och på många andra språk också. Men förmodligen kommer du att se det brukade mer så i Swift eftersom det är inbäddade inom det språk än du kommer i andra även moderna språk. Så idén om en nedläggning är detta, är att vi kan ha en funktion som är tänkt att vara en generisk funktion, en generisk makt av funktion. Och denna funktion kommer att acceptera denna exponent som vi faktiskt vill skapa. Så till exempel, den allra första Exempelvis ville vi en effekt av 2. Så vi skulle ge makt och sedan inom parentes 2. Och nu märker vad detta faktiskt återvänder. Detta tar en ingång av en primer kallas y som är ett heltal, och den återvänder denna galna ser sak i parentheses-- parentes dubbel och sedan pil dubbelt. Vad detta betyder är att jag är kommer att återvända en funktion. Jag är inte återvänder annan typ av data, är jag i själva verket återvänder en funktion som har denna parameter, att accepterar en dubbel som indata och avger en dubbel som ett returvärde. Och som ett resultat, för nu har jag kallat makt, passerar ett visst värde för y, och jag skapar denna andra function-- märker att det finns en annan funktion som är som skapat insidan av this-- vad jag gör är jag kan sedan ändra detta värde, att en värde som jag hade förändrats från 2 till 3, jag nu göra det y. Och detta är bestående. Så varje gång som jag kallar makten av, i huvudsak vad som händer är att jag får tillbaka en funktion. Lägg märke till att här har jag definierat en ny variabel som kallas torget. Jag har satt det lika med makt, under förutsättning att detta värde 2 till makt. Och vad detta åter är funktionen. Så kvadrat, variabeln kvadrat, är nu av typen funktion som har this-- oops, rulla upp en lite bit-- som har denna signatur, acceptera en dubbel och utgång en dubbel. Så nu vad jag har gjort är jag har i grunden skapat en funktion som heter torg som accepterar något värde och kommer torget den. Vi kan se vad som händer här nere. Square 3 till exempel, betyder att jag tänker att ta värdet 3 och kvadrat det. Så hur exakt gör detta arbete? När jag passerar makt 2-- när jag passera 2 i denna makt av funktion, denna variabel y är befolkat med det värdet 2. Och det är typ av rum i minnet. Det är ungefär som hålls i stat någonstans i datorn, Vi vet inte riktigt bryr sig om hur eller där vid denna punkt. Men jag återvänder denna funktion kallas exponentiate. Och återigen, det spelar egentligen ingen roll vad denna funktion kallas, Vi kan verkligen kalla det något, att accepterar en dubbel och returnerar en dubbel, men använder detta värde y inne i den. Så även om det är denna funktion, denna exponentiater funktion som är returnerats tillbaka till min variabel som jag kallade torget, Det har innesluten i det denna föreställning om vad y var. Och det kommer ihåg det. Så varje gång jag kallar den funktionen som kallas nu torg, använder det så. Men det betyder också att jag kan skapa en annan variabel med en annan makt. Så jag kan skapa en kub variabel, för exempel ge den makt 3. Nu kub kommer faktiskt ta lite värde och kub som och returnera den. Så vi kan se att jag får ett värde 8 av detta. Men det värdet y har inte ändras eftersom de är hölls i form av oberoende variabler. De är typ av rum i oberoende utrymmen i minnet. Så kuben kommer alltid att ha x upphöjt till 3. Och torget kommer alltid att ha x upphöjt till 2, vilket innebär att torget kommer alltid kvadrat siffror, som jag förväntar mig. Och kuben kommer alltid kubik siffror, som jag förväntar mig. Detta innebär också att du ibland kan få något slags funky ser syntax där du har makt åtmin längst ned på skärmen här, kraften i 5. Och du passerar in i resultatet. Kallar du det funktionen som är returnerats med nummer 4. Och så vad huvudsak detta är 4 till den femte makten, Vi kan se resultatet där. Med mig så långt? Så denna idé kallas en förslutning, eftersom vad vi i grund och botten gör är vi kapsla vissa uppgifter into-- sorterar att innesluta dessa data in i en funktion och vi är att kunna återanvända denna funktion. Nu är denna syntax men kan faktiskt förenklas en stor mängd. Och det finns massor av möjligheter i Swift för denna förenkling. Och det är vad slags av därpå följande faktiskt titta på. Så i 7b vi till exempel ta detta exakt samma kod. Men nu i stället faktiskt definiera en funktion insidan av denna makt fungera och ge den ett namn, och sedan tillbaka namnet av denna funktion, som sedan används som en del av denna stängning, i stället är vi bara kommer att förenkla det. Vi behöver inte den här funktionen att nämnas. Så detta är begreppet anonym funktion där vi kan då acceptera som indata, inom parentes här, variabeln x som är av typen dubbel. Vi kommer att återvända typen dubbel. Och sedan nyckelordet, n, är början av denna funktion. Så märker att allt detta är inom klammer och vi definierar en anonym fungera här. Bara ett enklare sätt att definiera exakt samma sak. OK? Men hålla på, Swift faktiskt tillåter oss att gå längre och förenkla ännu mer, eftersom verkligen gör vi inte vård att denna parameter är namngav någon särskild sak. Det kan verkligen kallas något och Vi kan fortfarande använda den första parametern. Så i själva verket finns det denna speciella typ av data i anonyma funktioner, det är denna speciella namn variabler i anonyma funktioner som börjar med dollartecken och representerar parameternumren, noll indexeras, för denna funktion. Så det finns ett par saker som pågår. Här kommer jag att återvända, och sedan en klammerparentes representerar en funktion, rätt? Observera att jag inte har definierat parametertyper eller returtypen. Det kan faktiskt utläsas på grund av signaturen av denna ursprungliga funktion. Så vi kan eliminera att som en möjlighet. Men också kan jag använda dollartecken noll till representera denna första parameter som är passera in denna anonym funktion. Så förenkla det ännu mer. OK? Så långt är allt väl? Nu är det här Motortyp- gör du minns denna dollartecken noll som vi såg i denna klammerparentes att vi såg bara en liten stund sedan i denna Swift sex exempel? Det var precis här. Lägg märke det är precis vad vi tittar på, är att vi har passerat in i denna split funktion en anonym funktion som kontrollerar den första parametern för att se om det är lika med kolonsymbolen. Och det är precis det som är händer, det är allt vi doing-- returen sökord är underförstått i detta case-- vi tillbaka detta värde där vi jämföra den första parametern mot denna karaktär kolon. Och så den sortens demystifies detta. Och du kommer att se denna konstruktion mycket i Swift syntax, så gör hålla det i åtanke när du är ta en titt på detta. Nu kan vi gå av skenorna lite och gå riktigt snygga att shows även några fler av Swift makt. Du kan även se några av dessa i urval koder. Så det är därför jag kommer att visa detta för dig. I grund och botten vad vi kan göra är att, först av allt, det var typ av onödigt för mig att genomföra allt detta makt kod för om du importerar Darwin bibliotek, det faktiskt innehåller en funktion kallas pow som gör detta åt dig. Så vi kan förenkla det ännu mer och har vår uppstart fungerar nu bara vara en underbar en liner där vi bara returnera denna anonym funktion som accepterar dollartecken 0 som dess bas och y som dess exponent. Men vi kan bli riktigt, riktigt snygga när vi inse att Swift har en mycket makt under huven. En hel del av de operatörer som vi har att göra med, plus tecken och divisionssymboler och alla dessa saker som du normalt arbeta med med datatyper i ett programmeringsspråk, är faktiskt töjbara i Swift. Så vad det betyder i att vi kan definiera våra egna operatörer. Så nu är jag trött på att skriva i allt detta pow och sedan en parentes och sedan basen. Jag vill inte göra det. Jag vill faktiskt ha en operatör som tillåter mig att göra det. Så jag kan säga Swift som jag vill ha att skapa en operatör, stjärna star-- förresten jag kan inte använda karat eftersom karat är en operatör som gör något helt annat. Så jag vill inte sortera av kolliderar med det. Och så vad du ser i en mängd av språk, däribland Python, är som star star operatör för att representera exponenterna. Så det är den enda anledningen varför jag har gjort det. Och det kommer att bli en infix typ operatör. Och jag måste ge till det lite information om företräde för detta operatör så det är vänster associativ. Det är som relativt hög företräde jämfört att summering eller multiplikation. Det är högre prioritet än alla dem. Så vidare och så vidare. Och då jag definiera funktion som faktiskt dikterar vad denna operatör gör. Så antar att jag har en vänster sida och höger sida, vilket skulle vara kanske en bättre variabelnamn för detta. Vänster och höger sida. Jag kan sedan ta denna makt vänster till höger sida och returnera det värdet. Så nu är det super söt. Allt vi behöver göra är 2 star star 3 och det är 2 till den tredje kraften, och vi får ett värde på 8. 2 star star 10 är 2 till 10th makt, vi får 1.024. Så nu vår makt för funktion, som återigen är olika, eftersom hela idén bakom detta var att vi har en funktion som alltid tar lite värde och multiplicerar det-- eller snarare tar exponenten till samma effekt. Så nu är det ännu enklare. Så nu är det bara dollarn underteckna 0 star star y. Vi behöver inte ens använda pow längre. OK, vem förlorade? Gör vi bra? Eventuella frågor om det här? Yeah? PUBLIK: När du-- [OHÖRBAR] funk makt y dubbel. Så när du returnerar en funktion. DANIEL Armendáriz: Funk makt y dubbel. Åh ja, jag vet inte vad y nummer. Ledsen för det. PUBLIK: Varför är du återvänder en funktion [OHÖRBAR] kapsling. Är inte dollarn noll stjärna stjärniga y [OHÖRBAR] finna att operatören med det vänder dubbel [OHÖRBAR] fördubblas? DANIEL Armendáriz: Så låt mig besvara din fråga hur jag förstår det och du kan berätta för mig om jag inte förstår din fråga. Så denna konstruktion, den lockiga stag dollartecken noll star star y, är en funktion. Och det accepterar en parameter som är representeras av denna dollartecken noll. Retur nyckelordet antyds i detta mycket kort, anonym funktion syntax. Vilket betyder att i huvudsak vad detta säger är att jag definierar en function-- och sedan ska jag bara kalla det something-- där jag har lite värde y. Jag har y, vilket är dubbelt. Och jag återvänder en dubbel. Och jag har inom denna avkastning y-- sorry, Jag borde inte ha kallat detta y-- x. Åh kära, Åh kära, Åh kära. X-- nope-- star star y. Så det här är bara en förenklad version av detta. Och så på grund av att jag har dollarn sign noll är att använda denna kapsling betyder att jag inte längre har skriva pow, eller inte längre göra Jag måste göra något som 3 star star 2. Jag kan bara ha en enda Funktionen kallas torget som alltid kommer att ta något värde som indata och faktiskt tillbaka kvadraten på det. Så hela syftet med nedläggningen är att bara sorts kapsla det faktum att jag alltid vill använda y när Jag kallar det fungerar som kraft när du tar denna exponent. Så återvänder sedan, en funktion som accepterar en dubbel, som är basen, och returnera resultatet av denna exponent är nyckeln här. Och det är den stora skillnaden. Det var bara lite av en blomstra. Detta är inte annorlunda jämfört med de tidigare exemplen, men det var bara lite en blomstra kan vi faktiskt skapa en operatör i Swift och faktiskt göra saker med det, som är typ av en cool grej. Har jag besvara din fråga? Sweet. Något annat innan vi går vidare? OK. Nu är detta slags tigger Frågan är that-- väl OK, Nu har vi möjligheten för funktioner som ska returneras. Kan vi passerar även fungerar som uppgifter eller som parametrar till andra funktioner? Och faktum är att vi kan. Så låt oss säga att vi har alla av samma kod. Vi har torget variabeln som kommer torget denna kod. Och vi har kuben variabeln som kommer kub vissa uppgifter. Och vi faktiskt vill tillämpa till ett brett intervall av tal. Så vad vi kan frestas att göra, naturligtvis som visserligen giltigt, är att iterera över denna lista med tal och tillämpa mina funktioner torget och kub och få två nya listor som resultat som är denna ursprungliga listan kvadrat och kubik, respektive. Helt acceptabelt. Men vad är det som vi ser här är att vi har, igen, dubbel vår kod. Och det finns kanske en möjlighet för oss att förenkla denna lite. Tänk om det fanns ett sätt för oss att faktiskt alltid iterera över en viss lista och bara övergå till denna magiska fungera en variabel som representerar en funktion att vi vill tillämpa till varje enskild post i den här listan. Detta tar upp begreppet vad kallas högre ordningens funktioner. Och det är i huvudsak vad detta är, är att vi kan skapa en funktion. Och i det här fallet det kallas en mapper, bara för att ge den ett namn, precis kartläggning över varje enstaka objekt i en lista. Där jag tar en lista och jag tar en funktion. Och denna funktion, naturligtvis, har en viss signatur. Den accepterar som en parameter dubbel och det kommer produktionen är en dubbel. Och hela resultatet av denna funktion kommer att vara en ny lista som är av typen double. OK? Och vad jag ska göra är att tillämpa denna funktion f till varje element i min lista. Och reply-- och ganska returnera denna nya Listan som resultat, vilket är riktigt coolt. Nu kan jag passerar funktioner runt. Och denna idé om högre ordning funktioner är verkligen viktigt. Och detta mapper är egentligen bara den stackars mannens genomförande av en funktion som är byggd in Swift kallade kartan. Och det gör just detta, kanske till och med lite bättre. Detta är bara en slags generisk, förenklad version som tillåter oss att se koncept som gäller här. Titta nu på det sätt som jag kan faktiskt använda min torget och min kub funktioner till denna lista med tal. Jag kör min mapper. Jag ger min lista över nummer till den. Jag ger till det den funktion som händer att gälla för var och en av dessa index. Och det kommer att bli matas ut som ett resultat. Och jag kommer att få se att jag har kvadrat och kubik mina nummer som följd. Och naturligtvis mapper tar någon form av anonym funktion. Vi kan även se att jag har skapat en ny anonym funktion som bara tar någon parameter och delar upp den i två. Och vi kan se att jag har, faktiskt, dividerat min lista med 2 istället. Cool? Så långt är allt väl? Okej, nu ska vi komma tillbaka till denna idé. Låt oss genomföra detta tillbaka samband med en betygsbok. Och om jag gör det, kan vi se att jag kan tillämpa en bred variation av dessa options-- eller en bred variation av dessa högre ordningens funktioner att faktiskt förenkla min förmåga att göra en olika saker på listor med siffror. Så till exempel, om jag ta en lista med tal, ett av de högre ordningens funktioner som existerar kallas minska. Vad minska gör snarare än kartan, reduceras kommer ta två element i listan, kommer att ta lite funktion som jämför de två elementen i listan, och det kommer sedan sorts output-- den utmatning av den funktionen kommer vara en annan faktor som du sedan jämföra med andra. Så du kan använda detta för att verkligen summan av talen i listan. Till exempel, om du hade en lista med en, två, tre, fyra, fem, du tar de första delarna, 1 och 2. Du kan ansöka till den ett tillägg funktion som tar dessa två element och spottar ut en av dessa delar, vilket skulle vara värdet 3. Sedan tar vi det värdet 3 med nästa element i listan, summera dessa två, och sedan fortsätta nedåt i listan. Vi minska lista till ett enda värde. Och det råkar vara så att plustecken är en operatör, precis som vi såg bara. Denna operatör faktiskt en funktion som har just den här listan som vi vill, snarare dessa egenskaper att vi skulle vilja. Så jag uppmuntrar dig att ta en titt på detta. Jag vill sortera om flytten på från några av denna kod så att vi faktiskt kan titta på några faktiska, verkliga, sanna Swift i Xcode, i iOS utveckling. Men ta en titt på detta och se om du kan analysera igenom vad som händer med några av dessa högre ordning funktioner inklusive filter, minska, och du kommer även se någonstans här kartan också. Det är just här. Om det kommer att ta en sekvens av kvaliteter och det kommer faktiskt mappa dem med strömbrytaren konstruktionen, som ni kanske känner igen från C, men det är faktiskt mycket mer kraftfull än omkopplaren konstruktionen som vi har i C. Och vi ska tillämpa det till varje element i listan och faktiskt ge bokstaven betyget för varje av dessa kvaliteter som använder alla dessa begrepp att vi bara har pratat om tidigare. Nu ska kringgå för bara en minut och prata om structs. Och så structs är en väntan i C som vi kunde definiera en ny typ av data. Structs finns inom Swift. Och så gör en massa andra konstruktioner kallade enums och klasser, som verkligen ta denna idé till en helt annan nivå. Och i grunden är det bara ett sätt att definiera en ny typ av data. Så om du get-- om du kommer över klass eller structs eller enums, inte får förväxlas med den. Det är precis som att definiera någon ny särskild typ av data. Och detta är verkligen viktigt när vi pratar om iOS applikationsutveckling eftersom allt som finns inom iOS-appen är i huvudsak ett föremål av något slag. Och ett objekt är i grunden en klass eller en enum eller en struct. Så i det här fallet är jag definierar en ny typ av data att jag ringer bedömning det är vissa egenskaper, inklusive ett namn och en sekvens av betyg. Så en slags bedömning att jag kan ha i åtanke skulle vara frågesporter, till exempel. Jag skulle vilja ha en bedömningen som var en frågesport och som hade en mängd olika kvaliteter associerad med den, för frågesport en, frågesport två, så vidare och så vidare. Eller jag kanske har en annan typ bedömning för problemsamlingar. Och jag kan göra saker. Jag kan faktiskt ha funktioner inom denna typ av data, som nu kallas metoder. Så om du någonsin ser Ordet metod, det är verkligen är bara en funktion som är tillämplig till en mycket specifik klass, eller till en mycket specifik typ av data. Det ger oss möjlighet att ändra data inom. Så med andra ord, om jag vill lägga till en klass till min bedömning, så allt jag behöver göra är att bifoga betyget som matades in till denna funktion min interna egendom. Det finns en annan snygg konstruktion här i Swift, som är här dot dot dot operatör, vilket innebär att poängen kan nu acceptera någon antal heltal. Och poängen kommer att bli en array av heltal som har gått till min funktion, vilket betyder att jag kan göra saker som denna. Jag kan göra lägga kvaliteter och bara ge godtyckliga nummer av heltal in i den och faktiskt tillhandahållas en array av dessa värden i min funktion eller i mitt förfarande, såsom är fallet. Nu är detta viktigt eftersom allt i Xcode, allt i iOS, är i själva verket ett objekt. Så ha det i åtanke när vi byst öppen Xcode och hoppa framåt bortom iOS versioner två och tre och faktiskt gå vidare till version fyra. Och återigen, allt detta kommer läggas ut på seminariet sidan. iOS fyra är slags ett fullskaligt genomförande av en mycket grundläggande app. Och vad denna app gör är det laddar ett UI, som ser ut så här. Återigen, om vi klickar på storyboard kan vi se att detta är vad det ser ut. Detta är UI. Den har en titel högst upp. Jag har kallat det webbgalleri. I mitten finns det ett element kallas UI bild vyn. Och i botten finns det en verktygsfält med en enda knapp som har stretch utrymmen som gör att den centrum mitt i detta verktygsfält. Och vad som händer är att när detta laster det hämtar ett JSON fil som är som finns på en server på andra håll, tolkar att JSON fil, och JSON-filen ser lite ut så här. JSON-filen ser ut så här. Där är det. Den har ett albumnamn och den har en rad bilder. Var och en av dessa bilder har ett namn och även en webbadress själva som representerar jpeg version av den individuella foto. Så vad händer är att när det här programmet laster, hämtar det JSON fil, tolkar det, sätter allt detta i motsvarigheten till en array i iOS app utveckling, vilket är en nsarray. Och då kan jag sedan ladda dessa data till ett program och ladda den på min skärm. Det är en bild som lästs med knappen längst ner. Om jag klickar på Hämta Nästa bild, det då drar den bilden från internet och ersätter den bilden i UI bild vyn. Så du kan ladda ner och faktiskt ta en titt på det på din dator. Och bygga den och faktiskt sammanställa den på din enhet. Men i grunden processen var detta, skapa storyboard-- eller snarare inte create-- men välj storyboard. Och faktiskt we'll-- om du inte mind-- vi tar bara ett par sekunder att faktiskt visa dig hur detta gjordes. Bara så att hur vi kan faktiskt uppnå detta är gjort lite mer uppenbara. En bild ansökan, jag är kommer att kalla detta seminarium fyra representerar denna särskilt nummer. Spara den på skrivbordet. OK, kommer att klicka på storyboard. Och vad jag ska göra är att hitta min bild uppfattning, drar den till mitt användarnamn gränssnitt och centrera den. Nu är det bara centre det tyvärr kommer inte att göra en hel del, med undantag för en skärm som är denna specifika storlek. Så vi kan övertyga oss själva om att genom klicka på denna dubbla cirkeln sak, att få ner det här pop menyn här och ändra att förhandsgranska, där vi ska faktiskt får en chans att förhandsgranska hur Detta kommer faktiskt titta på andra enheter. Som vi kan se har vi inte ens se det på detta fall. Så jag kommer att stänga detta för nu. Och jag kommer att välja denna ikon nere vid mycket nedre delen av skärmen. Den säger Lösa Auto Layout Frågor. Tyvärr, det avskurna i botten. Men om jag klickar på det, vad jag får denna pop up-- försvinna. Vad jag får är denna pop up som gör att jag kan lägga saknade begränsningar. Och genom att göra att det kommer då sorts lås in i centrumdelen av skärm som jag kan förvänta sig. Nu för att få den här knappen på ovanpå det, jag behöver gå till redaktören. Gå till Bädda in och klicka Navigation Controller. Vad det kommer att göra är som kommer att lägga Detta helt annan komponent till den, men den kommer faktiskt att länka det tillbaka till min ursprungliga UI. Och detaljerna, återigen, gör vi inte verkligen behöver bry sig om just nu. Men jag vill ha en verktygsfältet längst ner. Så jag ska kolla Shower Toolbar. Och detta ger i min mening, som nu är någon annanstans, Vi kan se det länkas hit. Den ger nu ett verktygsfält i botten av mitt UI. Så nu, istället för att välja en bild uppfattning kan jag hitta en etikett, eller snarare en toolbar-- låt oss se, var är det? Vad kallas det? En button-- post bar-- item-- sorry-- bar knappen post. Plop att det och tillämpa ett par av flexibla utrymmen på vardera sidan att faktiskt centrera det. Så nu har jag skapat min UI, i princip. Och jag kan ge det ett namn genom att dubbelklicka högst upp här och säga webbgalleri och så vidare. Nu igen, dessa är element som existerar av sig själva. Och jag måste ansluta dem till min kod som Jag kan göra genom att återigen föra upp denna dubbla cirkel ikon, byte från förhandsgranskningen. Vilket, förresten, nu kan vi se är fint centrerad och kommer att se bra på en mängd olika enheter. Växla till automatiskt, vilket kommer få upp ViewController koden. Och nu denna del är viktig. För att ansluta dessa två element, din kod till UI, du välja det objekt som du vill ansluta. Så i det här fallet, vi faktiskt vill koda ändra bilden som är inne inom denna UI bild uppfattning. Så om du styra klicka från bild vyn och dra, du kommer att märka att du får en liten bar, när du släpper allt detta pop upp kommer att inträffa. Och det står att vi kommer skapa en anslutning. Och härifrån jag vill ge det ett namn, något som galleri. Hit Enter. Och detta faktiskt ger en variabel som kallas galleri att jag sedan kan referera i min kod ändra bilden, till exempel. Så hur den koden egentligen ser? Tja igen, jag vill inte att spenderar för mycket tid på det. Och jag uppmuntrar dig att ladda ner den och ta en titt. Men en av de mest viktig aspekt är koden som faktiskt hämtar en bild. Så i det här fallet vill jag att komma inom mina foton array, som finns inom min klass. Jag vill ange namn och URL som blivit analyserad ur denna JSON. Egentligen be enheten för att få URL, att hämta webbadressen från detta, och sedan hämta data från innehållet i den webbadressen. Konvertera sedan dessa data till en bild genom att den leds in i UI bilden. Så återigen, dessa är alla olika typer av föremål, olika typer av klasser. Och då kan jag sedan ställa min gallery.image lika med uppgifter. Och det är typ av kött av det som faktiskt är sedan kunna ändra data from-- förändring bilden från ett till nästa. Så återigen, förhoppningsvis nu en hel del av konstruktionerna kommer att göra en lite mer meningsfullt. Lägg märke till att det finns en del utropstecken här. De utropstecken är huvudsak relaterade till optionals. Vad jag i grunden säger är att utan att även kontrollera för att se om det finns data som inom detta valfria, Jag ska gå vidare och anta att det finns och packa det. Kom ihåg att vi använde analogi typ av en förpackning för optionals och vi måste packa upp paketet och dra ut data. Utropstecknet krafter som faktiskt händer. Men jag vet att det här är säker eftersom jag kollade för att se om bilddata är lika till noll, har jag faktiskt kolla att se om det valfria var i själva verket misslyckades. Om det hade faktiskt misslyckats redan. Och så jag är säker på att när jag kommer till detta punkten kan jag säkert packa dessa data. Du kan även se det i i form av ett frågetecken. Så om vi bläddra ner till där jag behöver verkligen analysera data. Så bli inte avskräckt av denna typ av långa namn. Du kan hitta i Apple utvecklare webbplats mycket av referenser till alla de objekt och alla processer som faktiskt gör detta möjligt. Men märker att detta är i huvudsak en funktion där jag ge det några uppgifter. Och jag får tillbaka något slags uppgifter. Och jag behöver använda detta som sökord för att omvandla den till denna nsdictionary? Vilket återigen, en valfritt nsdictionary. Vilket jag behöver sedan kontrollera om den finns. Så jag kan använda att om låt framgångsrika jämlikar tolkas, då vet jag att det valfria innehåller faktiskt en del data. Eller vad jag gjorde här var att bara anta att om det fanns inga fel att det är faktiskt säker. Okej, jag vill tacka er alla så mycket för att ni kom. Jag vet att detta var en hel del, men det var bara en timme att tala om några ganska avancerad grejer. Och så förhoppningsvis får du en chans att hämta all kod och ta en bättre, mer grundlig titt på det. Sorts övertyga dig själv om alla av de saker som händer. Och jag vill tacka er allt, återigen, för att ni kom. Och lycka till med dina slutprojekt. Ha en bra dag.