>> [MUSIK SPELA]
>> DAN AMRMENDARIZ: Alla, välkommen till CS50 seminariet
iOS App utveckling med Swift.
Jag är Dan Armendariz, och jag är en handledare datavetenskap här på Harvard.
>> Och nästa timme kommer att vara en virvelvind rundtur i så mycket grejer
om detta ämne som vi kan passa.
Jag kommer att lägga all källkod att du kommer att se i dag på nätet.
Vi kanske inte kunna faktiskt gå över allt
att jag är att jag är visar dig i denna stund.
Men åtminstone förhoppningsvis genom kommentarerna från källkoden,
du kommer att kunna försöka räkna ut vad exakt händer med dessa saker
att vi inte riktigt får till.
>> Sammantaget struktur dagens föredrag kommer att vara följande.
Vi kommer att börja göra vissa grundläggande syntax med Swift språket,
gå in i några av de mer avancerade syntax Swift språket.
Eftersom språket är verkligen moderna och det
har mycket hög nivå funktioner, saker som vi har inga
sett i C hela CS50, eller även några andra språk
att vi har börjat använder i CS50 som PHP,
så jag kommer att behöva försöka introducerar också några ämnen som
är relaterade till språk högre nivå att du inte kan se i djup i CS50,
men du kommer att se senare datavetenskap klasser.
Så det kommer att bli en tätt packade timme.
Och är du välkommen att låta mig vet om du har några frågor.
Så om du är intresserad att göra utveckling
med Swift, eller egentligen alla iOS applikationsutveckling,
Det finns ett par krav.
Först av allt måste du använda en Mac som kör i exemplen
att vi kommer att använda i dag, en relativt ny version av operativsystemet
X. I det här fallet, jag kör X 10.5.
Du kan köra 10.11 om du vill.
Men allt som du kommer att se är involverar Xcode 7 och senare,
som har den senaste versionen Swift, som är Swift 2.0.
Detta är faktiskt en ganska viktig skillnad.
En hel del av syntaxen har förändrats ganska signifikant
i vissa fall från Swift 1.0, som släpptes förra året,
Swift 2,0, vilket bara kom ut i höst.
Så vi kommer att visa Swift 2.0.
En hel del av de saker som du söker efter på nätet
när du försöker att få ytterligare information om en mängd olika saker,
du kanske vill uttryckligen Sök efter Swift 2
snarare än bara vanliga gamla Swift att göra Se till att du får syntaxen korrekt.
>> I själva verket är detta generellt sant.
Det finns en snabb mängd utveckling händer i Swift språk
ända sedan Apple släppte det, tror jag vad, det har varit lite över ett år
nu.
Och saker har förändrats dramatiskt under den tiden.
Och så bli inte frustrerad om, när du tittar runt
för ämnen på Swift eller hur man åstadkomma något med hjälp av några exempel kod
eller något som den inte faktiskt arbetar på Swift 2.0.
Se till att du söker specifikt för den versionen
att försöka minimera effekterna av olika versioner och den sortens saker.
>> Jag ska försöka att peka ut bara några saker som skiljer sig från äldre versioner.
Men det är något att se upp för.
Det är antagligen kommer att bli en av de största huvudvärk
att du kommer att ha med Swift är att hitta exempelkod som är äldre, även bara
med några månader, försöker använda den i mer moderna projektet.
Och det helt enkelt inte fungerar.
Du får kompileringsfel, syntax fel, alla typer av galna grejer.
Så bara ha tålamod med det, och du kommer förhoppningsvis
har en ganska trevlig upplevelse med Swift totalt.
>> Nu kan du faktiskt join-- och jag hoppas vi faktiskt fortfarande har denna denna year--
CS 50 Apple App utvecklingsteam, som
gör att du kan installera några appar som du skapar på dina iOS-enheter.
Så ta en titt på den här webbadressen om du är intresserad av att göra det.
>> Så bara ett par saker om Swift själv.
Det är en kompilerad språk.
Men du kommer att se att vissa av de funktioner som vi använder
tillåta att den kan användas även i en bit som en tolkad sätt också.
>> En hel del av syntaxen är lånad från C. Den är baserad och skriven i C.
Och så kommer vi att se till att Det finns en hel del takeaways
från befintlig kunskap från C som vi kan port till Swift.
>> Men det finns saker som göra det mycket annorlunda från C.
Det är mycket starkt skrivit.
Det finns automatisk minneshantering.
Du kommer inte att behöva använda malloc eller fri någonstans.
Den är utformad för generalitet.
Så med andra ord kan du använda den i alla typer av sammanhang, från Apple Watch
till iPhone hela vägen upp till OS X, och även vissa servrar, även några skript.
Men vi får se att stöd för skript
är inte riktigt där ännu som det är i andra språk.
Så mest troligt att du kommer att använda detta enbart för utveckling
på din Mac eller din iPhone.
>> Och det har en hel del moderna funktioner.
Och en hel del av dessa saker är saker som vi kommer att försöka ta itu med i dag,
men även våra ämnen som uppriktigt sagt, vi kan ägna hela kurser.
I själva verket, CS 51, som är erbjuds nästa termin,
fokuserar mycket på dessa frågor som beskrivs nedan.
Så du kan spendera en hel termin förstå dessa saker.
Men vi ska försöka att få igenom dem
åtminstone nog att du kan förstå vad som är
händer när du ser vid en Swift program
och kunna hacka din väg genom det för det slutliga projektet.
>> Nu en av de bästa sätten att du kan få ytterligare information om detta
är ärligt talat bara via Apples lämnat dokumentation för Swift.
Det finns en hel del API som finns tillgängliga.
Och detta är en bra bas för dig för att leta efter specifika saker som du
vill göra med ett API som involverar iOS.
Om du vill använda kameran för Exempelvis kan du börjar leta här,
och även använda Google och Stack Overflow som vanligt.
>> Eventuella frågor om denna innan vi hoppa rätt in?
Okej.
Låt oss gå vidare.
>> Så först, har jag en antal exempelfiler.
Och jag kommer att försöka steg genom dem relativt snabbt.
Detta är Hello World-fil för Swift.
Det är väldigt enkelt.
Det finns sätt fler kommentarer än det finns faktiska koden.
Lägg märke till den faktiska koden är på allra längst ner på ledningen 14.
Det säger print.
Och då är det ett funktionsanrop.
Vi passerar in i den en sträng som kallas Hej CS50.
Lägg märke till att det inte finns några semikolon.
Lägg märke till att det inte finns någon int main.
Det finns ingen av de cruft som vi hade med C.
När vi använder Swift på detta sätt, som bara är skriven i en textfil
och lagras på min dator, sedan Jag kan kompilera den och köra den.
>> Lägg märke till att här är jag inte använder CS50 IDE.
Detta förutsätter att jag är igång och att jag är på OS X,
och att jag har Xcode redan installerat på den här datorn för att detta
att faktiskt funktion.
Men detta är bara en vanlig textfil att vi då kan sammanställa och redigera.
Så låt oss se hur det faktiskt fungerar.
Vad gör jag om jag vill kompilera det?
swiftc 1.swift.
Efter en stund eller två, det kommer att se att vi har nu
sammanställt detta i en fil som heter 1.
Och nu har vi tryckt vår CS50, vår Hello World-programmet i stället.
>> Lägg märke till en annan sak som bra är att som standard,
vi inte behövde input a / n för att skriva ut en ny linje.
Som standard utskriftsfunktionen i Swift kommer att skriva en ny linje för dig.
Du kan skicka en eventuell ytterligare parameter för att tala om den inte att göra detta.
Men Google för mer information om detta.
Som standard kommer den göra skrivraden.
>> Okej, så låt oss gå vidare sedan till några andra saker.
Så hur kan vi faktiskt definiera variabler?
Vi kan göra det är att använda en av två metoder.
Och det som jag vill berätta om första är denna låt definition.
Och detta är viktigt eftersom ett effektivt
vad vi gör är att definiera en konstant.
Vi ska skapa en variabel, eller snarare ett konstant kallas namn,
förse det några data-- i detta fall strängen Dan.
Men genom att använda denna låt nyckelord, säger vi
att detta variable-- eller igen constant-- kallas
Namnet kommer aldrig att ändras.
Det kommer att vara oföränderliga i hela varaktigheten av detta program
eller genom hela varaktighet av sammanhanget
att denna variabel är tillgänglig.
>> Detta är verkligen viktigt att när du har någon information som inte är
kommer att förändras i ditt program, och du kommer att se en mängd olika exempel
om när vi vill använda låt kontra andra syntaxen,
Det är viktigt att du använder låter där så är möjligt eftersom detta meddelar
språket som det är inte kommer att ändras,
och det kan faktiskt göra en massa optimeringar
för att förbättra hastigheten och säkerheten för ditt program.
Och säkerhet, menar jag inte låta IT-kraschen med galna fel
att vi kan vara vana vid att se i C.
>> Då kan vi använda sträng interpolation att kapsla in detta inom en sträng.
Så vi kan se i denna utskrifts linje, skriva hej,
och sedan använda omvända snedstreck öppna parens, och sedan namnet på min variabel,
i detta fall konstant, stänga parentes.
Jag huvudsak sedan sätta Innehållet i denna variabel som heter namn
insidan av strängen och sedan utskrift resultatet där.
>> Det finns en annan förändring till den här filen vilket är att jag har, högst upp,
sätta i en Shebang linje, som i princip bara anger
som jag vill använda Swift tolk, som
innebär att jag inte längre behöver sammanställa detta program.
Jag kan bara köra det som sitt eget manus.
Men detta är, i det här fallet, bakom kulisserna sammanställs och sedan
körs.
Det är bara osynlig för oss.
>> Okej, så låt oss gå vidare.
Så det finns lite knep som just hänt förut.
Jag visade att jag skulle kunna definiera en konstant.
Och jag kunde ge några uppgifter att göra det.
Men i det här fallet, märker att jag inte faktiskt ange vilken typ av uppgifter
att det är.
Och det beror på att kompilator, Swift kan
härleda vilken typ av data som bara baseras på de uppgifter som jag lagt ned på det.
Eftersom det vet att genom att utvärdera detta variabel här, denna data direkt
här, vet den att det är en sträng.
Och så denna ständiga namn är därför kommer att vara en sträng liksom.
>> Men vi kan också vara explicit om den typ som är
vi kommer att använda för konstanter eller variabler
genom att använda denna syntax instead-- låt namn kolon Sträng lika
Dan, som i detta fall innebär att vi är kommer att definiera en konstant som heter namn.
Det kommer att vara av typen String.
Och värdet kommer att vara Dan.
Nu den andra vägen som vi kan skapa variables--
och dessa är föränderliga variabler, som innebär att vi i själva verket gå
att ändra deras innehåll gång i varaktigheten av sammanhang
att den variabeln defined-- vi Använd nyckelordet var i stället för låt.
Men återigen, som standard, om du inte vet att du måste manipulera dessa data,
försöker använda låt för prestandaförbättringar.
>> I det här fallet kan jag då ange vilken typ av uppgifter
att vi räknar med att vara inne i denna nya variabel kallad etikett.
Det kommer att vara en sträng.
Och vi kommer att sedan slå samman två strängar tillsammans, strängen hej,
och strängen som representeras av variabel, eller snarare den ständiga namn.
>> Så det här är trevligt eftersom detta är något PHP liknande genom att vi
har mycket lätt strängsammanfogning.
Vi behöver inte automatiskt använda någon form av minneshantering
för att öka storleken och göra någon form av roliga saker där.
Detta fungerar som vi faktiskt förväntar.
>> Okej, några frågor om detta?
>> Nu den andra anledningen till att Vi behöver du har förmågan
för att kunna definiera vad typ av datavariabler är
beror ibland gör vi inte vill initiera variabler
med vissa uppgifter på punkt definitionen.
Så i detta fall, låt oss säga att jag vill börja mata
vissa kvaliteter i en klass bok.
Jo jag vet att en av de variabler som jag vill vara
kommer att bli en föränderlig klass.
Och vi vet också att vi vill att det ska vara ett heltal.
Men kanske vi gör ännu inte har den kvalitet som finns.
>> I Swift, måste du definiera vilken typ av data
som är associerad med en variabel eller en låt konstant
innan du kan faktiskt använda den variabeln.
Eftersom det är starkt skrivit, du måste associera en typ
med dessa variabler.
>> Så i detta fall, om jag har inte riktigt initialiseras först med ett visst värde,
då jag måste tala om Swift vad Jag förväntar mig att den typ av data för att vara.
Och det kommer att förbli samma datatyp
hela historien av detta program.
>> Nu kanske du frestas så snart Jag har skapat denna klass variabel
och under förutsättning att det en heltal 100, nu om jag
vill försöka sammanfoga en sträng med det heltal,
kan frestas att fortfarande använda den strängen operatorn
som vi gjorde bara några rader innan.
Men tyvärr, Detta kommer faktiskt inte
arbete, eftersom du är väsentligen utför
en operation på två olika typer.
>> Nu skiljer sig mycket från andra språk som PHP som är riktigt
loosey goosey med deras typ av typer.
De är precis som, ja, vad som helst, jag bryr mig inte.
Ge mig bara en typ, och kanske jag ska göra det rätta.
>> I det här fallet, är Swift mycket stränga om vilka typer
att du har att göra med.
Denna summerings operatör eller operatorn
har väsentligen ett par olika möjliga alternativ.
Du kan göra summering med heltal, eller
kan göra strängsammanfogning, och kanske en del andra saker också.
Men om operatören inte känner igen vad som finns på vardera sidan av det,
eller snarare en kombination av de två typer, är inte vad det förväntar sig,
då det kommer att orsaka ett misslyckande.
>> Så i detta fall, vad betyder det att ha en sträng plus ett heltal?
Väl i samband med detta har vi antagligen
att göra en strängsammanfogning operation.
Men naturligtvis datorn har inte den sortens sammanhang.
Och så måste vi ge att ytterligare information
att låta den veta vad det är att vi vill göra.
>> Så med andra ord, det faktum att Swift är starkt skrivit
innebär att du måste göra en lite extra arbete
att få det att manövrera sätt som du vill.
Men som ett resultat, är det säkrare.
Och när du har ta hänsyn till dessa typer,
saker bara uppriktigt börja att fungera ganska bra.
>> Så i detta fall, då skulle vi utföra strängsammanfogning
genom att uttryckligen gjutning heltalet till en sträng
genom att linda det i detta huvudstad S String funktion,
och sedan använda strängsammanfogning operatör att ändra vår etikett variabel,
och sedan skriva ut den.
>> Hittils är det bra?
Okej, låt oss gå vidare.
>> Nu finns det en mängd data typer som vi kan använda i Swift.
Som ni har vant sig, Vi kan skapa en föränderlig array.
Och att matrisen endast kan innehålla en enda typ.
>> Så i det här fallet, kommer vi att skapa ett muterbart arrayer av heltal, som
Vi kommer att ringa betyg, och vi kommer att kunna att lagra det i denna hakparentes
format som du har vant att i en mängd olika andra språk.
Men märker att här är vi definierar ett par saker.
kvaliteter är en föränderlig variable-- Vi använder inte låt sökord.
Så det innebär att vi kan sedan ändra innehållet i denna matris.
Det är av typen Array Int, och vi kan säga att
baserade på dessa hakparenteser här.
>> Nu en av de fina sakerna om detta är att vi
har tillgång till en hel del ytterligare information
om arrayen bara använda några enkla punktnotation.
Så till exempel, grades.count ger oss
antalet objekt som finns i den array, som vi sedan kan komma ganska
lätt att bara använda den punktnotation.
>> Om du vill lägga till ytterligare objekt till denna samling,
du kan inte göra PHP stil där du bara uttryckligen definiera,
vid ett givet index, ett visst värde som du vill infoga.
Använd i stället append metod typen array
att lägga den posten, 95, till denna lista.
>> Så nu denna array har följande contents-- 100, 0, 90, 85.
Och nu har vi bifogat 95 till det också.
>> Det finns andra sätt vi kan lägga saker.
Du kan faktiskt använda en summerings operatör,
som kommer att tolkas som en array append operation.
Och du kan sedan lägga en annan matris, vars innehåll är 70 och 80,
till den arrayen.
Så nu har vi Innehållet i denna variabel
grades-- 100, 0, 90, 85, 95, 70, och 80.
Detta är bara en trevlig liten syntaktiskt socker som Swift ger till oss.
>> Så om vi vill summera kvaliteter, vi är kanske
kommer att vilja upprepa över varje objekt i denna slinga.
Och vi har, i Swift, begreppet av en for-loop som du förväntar dig.
Men det sätt som vi anger ett intervall är något annorlunda.
Så i detta fall, till Sammanfattningsvis allt, vi ska
kommer att skapa en temporär variabel som kallas summa för att vi
att upprätthålla denna räkning.
>> Och lägg märke till vår för loop konstruktion här.
För index 0 .. <grade.count.
Så denna konstruktion, 0 .. <grades.count är en serie operation där vi är
att säga att vi kommer att skapa en rad heltal från 0 upp
till men exkluderande grades.count.
Så kommer detta att vara 0, 1, 2, 3, 4, 5, fram till men många en
före grades.count.
>> Så det här är annorlunda än hur vi skulle normalt används för loopar
där du skulle ha några index variabel, ställa in den lika med 0 i början,
och sedan integrera dessa tills någon värde mindre än räkningen av objekt
i den arrayen.
>> Så det är en modifiering till detta, faktiskt,
vilket ger oss möjlighet att mycket enkelt ställa in olika typer av intervall.
Om du ändrar detta område för att tre punkter, 0 ... grade.count,
Detta representerar intervallet 0 att grades.count allomfattande,
vilket innebär att detta nummer är också då i detta intervall.
>> Men detta är mycket praktiskt för dessa exakta saker,
när vi måste utföra iterationer över slingan
eftersom dessa index noll indexeras, som vi har sett i andra språk
också.
Eventuella frågor om detta för loop?
>> Så det finns implicit definition av detta index variabel,
vars värde börjar vid 0, och fortsätter vid varje slingiteration
öka med 1 fram till en punkt som är lika med grades.count,
vid vilken punkt, avbryts slingan.
>> Lägg märke till att i vår sträng Interpolation här,
vi faktiskt kan utföra några enkla manipulationer till dessa värden.
Så index plus 1 kommer faktiskt utföra en summering av det värdet
eftersom index är, i detta fall, ett heltal.
Och på den punkten, kommer det sedan omvandlas till en sträng
och interpolerade i strängen här, och skrivas ut som vi skulle förvänta oss. .
>> Och det fina om uppsättningarna här är
att vi också kunna ha Hämtar värden och inställningsvärden
med hjälp av klammer notation som vi har sett i andra språk.
>> Okej, så härifrån, vi nu beräkna vår summan av alla våra kvaliteter.
Nu sorts nästa logiska steg skulle vara
att göra en division operation för att hitta ut genomsnittet av dessa kvaliteter.
Men något viktigt Här händer som
är att denna summa är kanske ett heltal.
Men vi behöver för att utföra vissa sorts dubbel division.
Och detta kommer att bli oerhört viktigt när
Vi vill utföra den här åtgärden, eftersom det vi säger
är att vi måste faktiskt utföra division två dubblar.
Och återigen, eftersom Swift är mycket starkt skrivit,
Vi måste uttryckligen ange alla objekt till dubblar innan vi faktiskt
utföra denna operation.
>> Så för oss att utföra dubbel delning,
det är inte tillräckligt för bara en av dessa objekt att vara en dubbel.
Båda måste vara en dubbel för att snabbt
vara säker på att detta är vad vi vill göra.
Så kommer vi då uttryckligen typecast det belopp som vi har beräknats ovan
och greven av betyg till dubbel, och sedan utföra denna operation och lagra
att i denna nya variabel, eller snarare denna nya konstant kallade genomsnitts,
som kommer att ha vilken typ, ni föreställa er?
Dubbel, ja.
Så i detta fall, vi behöver inte ange det
eftersom det kan härledas från operation vilken typ av data genomsnittet
kommer vara.
Och Swift är i allmänhet ganska bra om att kunna sluta typerna.
>> Vill du se här kör, eller kan jag gå vidare?
Jag vill fortsätta.
Eventuella frågor om något av detta?
Bra.
>> Nu ska vi börja för att komma till de goda stuff-- Definiera funktioner,
och ett par andra typer som är unik för Swift att du inte har
sett i andra språk fram till denna punkt,
men de är närvarande i andra språk som du kan hitta senare.
Så först om du vill att definiera en funktion,
du definiera det med funky ordet funktion, och sedan funktionsnamnet,
och sedan inom parentes, argument som du vill att funktionen att acceptera.
Argumenten måste också specify-- generally--
måste också ange vilken typ av data som de är, om de inte kan sluta.
Och vi får se det lilla varning på bara en liten bit.
>> Så i det här fallet har vi en funktion som kallas printGradeCount.
Vi kommer att acceptera en variable-- eller snarare i det här fallet,
en constant-- kallas betygsbok.
Och det kommer att vara av typ array av heltal.
Nu finns det något det är verkligen viktigt här
som jag vill att ni ska förstå.
Det är att som standard, dessa argument som är insatsvaror till denna funktion
definieras med en implicit låt sökord, vilket innebär att jag inte kan ändra detta
Betygsbok variabel här.
Och den sortens vettigt, eftersom du passerar data.
Och du kanske inte vill att det ändras från under dig.
Det är möjligt att uttryckligen nämna att detta är en variabel, genom att sätta
nyckelordet var här.
Men det är en gotcha som vi har märkt människor har gjort i det förflutna
är att de antog att det kommer att vara en variabel när i själva verket, det
är en konstant.
>> Okej, så här då, i det här fallet, vi är inte specificera någon typ avkastning.
Vi visar dig hur man gör som på bara ett ögonblick.
Men märker att här har vi bara en enkel om tillstånd.
Om betygsbok är tom, vilket i detta fall
är bara tillhör denna heltal array, sedan skriva vi ut något.
Annars kan vi göra något annat.
>> Ganska enkelt så långt tror jag.
Men stoppa mig om du har några frågor.
>> Nu denna funktion, i genomsnitt, tar också några argument, eller snarare ett argument,
som är den betygsbok, och denna gång kommer att returnera en dubbel typ.
Eftersom det är att beräkna genomsnittet och det är
kommer faktiskt tillbaka det beräknade genomsnittliga till den anropande linjen.
>> I det här fallet, vi anger retur typ efter en pil.
Och detta kan känna lite konstigt i början.
Du har vant att ställa in retur
ange innan namnet på funktionen.
Men om du tänker på detta när det gäller matematik,
som när du har matematik att definiera en funktion,
du har en funktion med vissa ingångar, och den producerar en utsignal.
Och det är precis vad detta är tänkt att efterlikna.
Och det finns ett par andra språk som har liknande syntax samt,
men förmodligen ingen som du har sett i CS50.
Men ändå inte förväxlas med det.
Pilen betyder vad som händer återlämnas i det här fallet.
OK, så hur ska vi att beräkna detta genomsnitt?
Tja, om betygsbok är tom, och då är vi
kommer att återvända 0, som kanske ett rimligt sätt att behandla detta.
Jag vet inte, låt oss komma tillbaka till det i en liten bit.
Detta kan faktiskt inte vara ett rimligt sätt
att beräkna ett genomsnitt om vi har en tom betygsbok.
>> Då kommer vi bara göra vårt summering.
Lägg märke till att vi här faktiskt har en alternativ version av en
for-loop, som tillåter oss att iterera över varje enskilt objekt i en array
och placera varje element in i dess egen variabel.
Genom att ange för betyg i betygsbok, vad vi säger
är att vi kommer att implicit skapa en ny konstant kallas
klass som kommer att representera varje unikt objekt i betygsbok
varje gång som för sling itererar.
Så första gången som det körs, grad kommer
vara det första objektet i betygsbok.
Andra gången det ska vara andra punkten, så vidare och så vidare
tills betygsbok har uttömt sig av element.
Då kommer vi att kunna sammanfatta att kvalitet i våra summer variabel
och tillbaka vår genomsnittliga som vi har sett förut.
OK, några frågor?
Ja?
PUBLIK: Jag har två frågor.
Nummer ett, hypotetiskt, kan du kör heltal på den här?
Behöver inte vara en dubbel, är det korrekt?
DAN AMRMENDARIZ: Kan du upprepa den frågan?
PUBLIK: Kan jag göra heltal som genomsnittet?
DAN AMRMENDARIZ: Kan du gör heltal som ett genomsnitt?
Så returnera ett heltal genomsnitt i stället för en dubbel?
>> PUBLIK: Return-- dig har det just nu nedan.
DAN AMRMENDARIZ: Just här, tillbaka 0,0?
Målgrupp: Ja, bara åter 0.
Så det kommer att bli antingen 80 eller 85, men inte 85,2.
>> DAN AMRMENDARIZ: Så i det fallet, så det finns ett par olika sätt
att svara på det.
Låt mig svara på dem i ordning.
Så om jag gör just denna återgång 0, en 0 är ett heltalsvärde.
Och så som kommer att orsaka en Typ fel i detta fall
eftersom det väntar en dubbel men därefter återvänder ett heltal.
Om jag vill returnera ett heltal, jag kan.
Jag kan ställa in returtypen att int tillbaka 0 här,
och inte utföra dubbel division.
Men då skulle vi vara göra heltalsdivision.
Och så vi då inte skulle få genomsnitt som vi möjligen skulle förvänta sig.
Men ja vi kan ändra typerna på det sättet.
>> PUBLIK: Och för det andra, du har en dubbel på toppen.
Men nere, när du gör åter Double Double,
som redan automatiskt återvända Dubbel-format.
Varför tror du fortfarande behöver definiera den med pil på toppen med en dubbel?
>> DAN AMRMENDARIZ: Så i fall är denna del
av the-- så att upprepa frågan, eftersom det är underförstått från retur
typer här, vilken typ detta faktiskt är, måste vi vara tydliga med Swift
om vad vi vill tillbaka av denna funktion
så att när det utför typ kontroll, kan det se till att
att det vi faktiskt har skrivit nere faktiskt överensstämmer med denna.
Så det är ungefär som en kontroll med dig själv typ av situation.
Men det är--
>> PUBLIK: [OHÖRBAR] arrow?
>> DAN AMRMENDARIZ: Det finns fall när Vi kan ange att vi kan underförstått
Ställ in returtypen.
Men i det här fallet, det gör jag inte tror att det skulle fungera.
Det finns en annan syntax att vi kommer att se senare.
>> Okej, så denna källa kod är lite annorlunda
eftersom detta tolkar argument från den funktion som vi kallar.
Låt mig visa dig hur det fungerar innan vi faktiskt går vidare
till en del intressanta saker som händer i Swift.
>> Så i detta fall, om jag kör just detta kod, notera att vad den gör
är-- medan det slags ger mig en konstig fel.
Jag måste ge det ett par heltal som en kommandorad argument.
Så låt oss se, 150 och 80, och tryck Enter att ta reda på vad det faktiskt gör.
Det är att acceptera varje dessa värden som heltal.
Det är inmatning av dem i en betygsbok.
Och då är det utför att genomsnittsberäkning
och utmatning det som vi skulle förvänta oss.
>> Men självklart finns det något på gång med detta förkasta något
något som ett heltal.
Som ni kanske kommer ihåg från när vi var behandlar kommandoradsargument
i C och andra språk, den allra första 0: te post i den Kommandoradsargumentet
Listan är namnet på kommandot att vi faktiskt utförs.
Så i detta fall, jag bara looping över alla kommandoradsargumenten de.
Men jag tänker inte göra någon slags fancy Kontrollera att hoppa över det första.
Jag är bara uttryckligen eller jag är underförstått kontrollera vilken av dessa typer
är heltal innan jag faktiskt utföra denna beräkning.
>> Och det är i huvudsak vad som händer här.
För varje argument process argument,
Jag kommer att utföra vissa check.
Och i detta fall, jag ska för att försöka att först omvandla
detta argument i ett heltal av utföra en explicit typecast,
eftersom det är på ingång, en sträng och i själva verket inte ett heltal.
>> Men det är lite av en konstig syntax, Om låt grad lika Int (argument).
Vad är det egentligen som händer här är extremt
viktigt för din hjälp av Swift.
Detta använder vad som är kallas en valfri typ.
>> Så denna funktion, Int (argument), returnerar inte bara ett heltal, men återvänder
vad som kallas ett valfritt heltal.
Och så detta är typ av en typ på toppen av en typ.
Du kan sorts tänka mig att det som det är tillbaka som ett paket.
Och när du öppnar det paket, den antingen
har ett heltal, som är resultatet, eller Det har absolut ingenting i det alls.
Och detta är användbar som en felkontroll mekanism, eftersom i detta fall
vi kan ta reda på, var detta typkonvertering framgångsrik?
Om det var, då det i själva verket kommer att ha ett heltal inuti.
Annars kommer att ha någon värde som vi kallar noll, vilket
är representativ för någon heltal alls.
Det är verkligen representativt för ingenting.
>> Och så detta om byggandet tillåter oss att packa det paketet,
som tillval bindning.
Och om vi kan packa att paketera och hitta ett heltal inne,
vad vi säger här är att vi kommer då
tillåter detta värde ställas in denna konstant heter klass.
Och denna del av if, den övre delen av if
kommer att köra, eftersom det Packa lyckades.
>> Om det råkar vara så att Det uppstod ett fel kanske
i detta explicit typomvandling från en sträng till ett heltal, kanske
Det är värdet ABC till exempel.
Och det är faktiskt inte kommer konvertera till ett heltal.
Då återkommer noll, vilket inte är ett heltal.
Och detta if-sats väl sedan misslyckas.
Betyget inte existerar på grund det har ingen heltal innehåll.
Och det kommer att köra andra blocket istället.
Ja?
>> PUBLIK: Nil är N-I-L?
DAN AMRMENDARIZ: noll är N-I-L, ja.
>> Så det här är kanske en av de svåraste sakerna med Swift,
särskilt när du är i ogräset på en iOS-app
och du faktiskt försöker att göra en del utveckling där.
Det kommer att skrika på dig om frivillig.
Det kommer att be dig för frågetecken och utropstecken.
Men när du räkna out-- om du ägna lite tid att räkna ut
vad som händer med valfria typer du kommer att spara dig en hel del huvudvärk
som du försöker skriva en app i Swift.
>> Det är faktiskt en mycket kraftfull funktion.
Och du bara måste ta mitt ord för det nu.
Men vi får se denna konstruktion och några andra gillar det
i några av de andra källkod som visar vi dig bara lite.
>> Finns det några inledande frågor här?
Så den viktiga takeaway är att en valfri typ är en slags metatyp.
Det antingen har ett värde, och om den gör det, så är det
kanske får detta värde associerat med det, eller det har inget värde alls,
och representeras av noll.
Resten av detta är kanske som du förväntar dig.
>> Så låt oss ramp upp svårighet ännu en gång.
Och den här gången, låt oss ta en titt på några andra datatyper som faktiskt existerar.
En av dem är ordböcker, som är mycket lik Python ordböcker.
Det är något som liknar en hashtabell i C. Den är väsentligen en kartläggning av nycklar
där nycklar kan vara strängar.
Och när man tittar upp dessa nycklar, dessa nycklar kommer att ha ett värde.
Så det är inte riktigt en matris, men I stället knytas närmare
till en hash karta eller en hashtabell.
>> Låt oss se hur detta är tänkt att arbeta innan vi faktiskt
gå in i källkoden själv.
Om jag kör just detta, ingenting händer verkligen.
Det talar om för mig att jag väntar vissa parametrar av följande typ.
Så jag kommer att ge till det vissa problem sätta namn,
så pset0, kanske fick jag 100.
Och pset1, fick jag en 5.
Och sedan på tentan, jag gjorde riktigt bra och fick 30.
Och oops, slog jag en plats här.
>> När jag slog in, kan du se utför någon beräkning.
Det säger betygsbok är tre kvaliteter, pset1, pset0, examen.
Och betygsbok har detta specifika genomsnitt.
Så återigen, vi arbetar med denna betygsbok idé,
men vi kommer att fortsätta iteration med komplexiteten i vår funktion.
>> Så i början, vi är bara kommer att skapa en funktion som
är ansvarig för att skriva ut användningen.
Och det finns denna utgång funktion som kommer bara
våld avsluta programmet.
Detta är inte något som du kommer att använda i iOS-app.
Detta är bara i detta fall, med en kommandorad argument.
Nästa börjar vi på väg mot Xcode.
Men detta är specifik för ett kommando linjestil program i Swift.
>> Låt oss ta en titt på några av intressanta saker här.
Låt oss se, bara ett par intressanta saker att nämna kanske
är att i min funktion utskrift antalet betyg,
Du kanske kommer ihåg att jag hade den listan av items-- pset1, pset0 och tentamen.
Du kan faktiskt snabbt och enkelt göra detta
genom att ta betygsbok, som är en lexikon som har nycklar och värden.
Hitta alla av de viktigaste är genom den punkttangenterna metoden här,
och sedan använda detta joinWithSeparator, som sedan kommer att ta alla nycklar
att vi hade skrivit in, pset1-- eller ledsen, pset0, pset1 och exam--
och sammanfoga dem tillsammans med ett komma och ett blanksteg
att skapa en lång sträng.
Detta anslutningsåtgärd är bara fenomenalt användbara i en mängd olika sammanhang.
Och så är det här joinWithSeparator.
>> Och det är en sak som är ändrats från Swift 1 till Swift 2.
Det brukade vara en Python style-- om du är
förtrogen med Python-- en Python stil gå metod på strängar.
Men det är inte längre fallet i Swift 2.
Du vill använda detta om du vill att sammanfoga en rad saker
tillsammans med en sträng.
>> Så kanske då i vår diskussion av genomsnittet före,
det gör lite mer meningsfullt för oss att sätta den genomsnittliga funktion
att vara en valfri dubbel snarare än bara en explicit dubbel.
Eftersom vi hade att ovanligt tillstånd där,
tänk om betygsbok faktiskt har några värden i det?
Vad ska den genomsnittliga avkastningen?
>> Väl kanske i C du skulle ha gjort något
liknande tillhandahålls en vaktpost värde, som 0.0, eller kanske ett negativt tal,
eller något bara representerar det faktum att det fanns något fel skick
och du kanske inte egentligen har förmågan att beräkna detta genomsnitt.
Jo skönhet specificera en valfri typ skulle vara att göra det.
Och jag säger nu alla dessa ord, men detta faktiskt inte använder optionals.
Men vi ser att på bara minuter där vi kan ställa in genomsnittlig
att vara en typ valfri data så att om det faktiskt returnerar vissa data, sedan
Vi kommer att återkomma dessa uppgifter.
Annars kommer vi att återkomma noll, säger att detta
har ingen meningsfull beräkning.
>> Låt oss gå vidare till något annat.
Så härifrån, vi har letat på alla dessa exempel på kommandoraden.
Men egentligen vad du tänker att ha att göra med är Xcode.
Och en av de fina sakerna Xcode är, och specifikt i Swift,
är att vi har denna som kallas en lekplats.
Och en lekplats är inte alls en iOS-app.
Men det kan du experimentera med Swift på ett mycket enkelt sätt.
Du kan skriva all din kod.
Det är snyggt syntax lyfts fram här.
När du skapar en ny fil, kommer den att be om du vill skapa en lekplats.
Men det fina med lekstugan är det till höger om ditt fönster,
gör det faktiskt visa dig utdata från din kod.
Så om jag bläddra ner, kan vi se vad utsignalen från olika rader kod
faktiskt råkar vara.
>> Så i detta fall, ska vi byta riktning bara lite
och prata om någonting som verkligen viktigt att denna höga nivå sätt
att Swift fungerar, och det är denna idé om nedläggningar.
Och du har förmodligen sett detta lite i JavaScript.
För er som är i CS50, nedläggningar
är mycket populära, mycket bra sätt att göra hög nivå saker i moderna språk.
Men det är också typ av svårt att linda huvudet runt den första gången.
Så om du tittar på detta första gången, det är OK.
Titta bara på källkoden och se Om du kan räkna ut hemma.
>> Så i detta fall, låt oss säga att vi vill skapa en hel del exponenter
med något fast värde.
Så i detta fall jag kan skapa en funktion.
Jag kommer att kalla det makt 2 vars enda syfte i livet
är att ta lite input och dubbel den och returnera det värdet.
Lägg märke till att här är jag acceptera en typ av data.
Det kommer att vara en variabel som heter x.
Det är av typen Double.
Och jag kommer att återvända en dubbel här.
Och jag ska bara göra en mycket, ärligt talat, ganska
naiva sätt att fördubbla detta värde.
Och jag ska visa dig varför detta är användbar på bara en sekund.
>> Lägg märke till att vi här har detta område igen. efter något i ett, dot
dot dot, 2, vilket innebär att denna slinga kommer att köras två gånger.
Men detta är en dummyvariabel.
Det betyder att jag inte verkligen kommer att att använda denna variabel som helst
insidan av denna slinga.
Jag vill bara denna linje kod för att köra två gånger,
utan att behöva känna värdet av detta intervall.
>> Så i detta fall jag kör resultat gånger på x två gånger, som i huvudsak
innebär att jag kvadratur detta värde.
Och det händer fungerar som vi skulle förvänta oss.
Power of 2, passerar ett värde av 2.0 ger oss en effekt på 4.
3.2 fungerar för 10,24.
>> Nu kan vi göra en liknande sak för makt 3.
Men nu bara ändra sortimentet.
För dummy variabel i en genom tre, multiplicera 3 gånger,
och göra samma sak.
>> Så detta kan kännas lite krystat.
Men det finns en viktig sak här som
är att titta på dessa två funktioner, det finns
bara en sak som är annorlunda, vilket är värdet i intervallet.
Allt annat om dessa två funktioner, makt 3 och makt 2,
är i själva verket, identiska, eftersom de fungerar på samma sätt.
>> Så på denna punkt, lite alarmklocka ska gå ut.
Förhoppningsvis vad du säger, du vet, känns det lite
som dubbelarbete.
Kanske finns det ett sätt som jag skulle kunna inkapsla allt detta
och tillhandahålla en funktion eller skapa en funktion som
gör precis vad jag vill utan behöva skriva ut det explicit.
Och detta är vad makt i en nedläggnings tillåter oss att göra.
Så låt oss ta en titt på detta.
Och jag kommer att tillbringa ett par minuter på detta, eftersom detta
är ganska viktigt för Swift.
Vi ser detta hela tiden.
Vi kommer att definiera en funktion.
Det kommer att kallas powerOf.
Det kommer att acceptera en parameter kallas y av typen Int.
Men ta en titt på returtypen.
Returtypen är, i parenteser, Double arrow Double.
Vilket innebär att denna funktion, denna funktion powerOf,
återvänder en funktion.
Det är att acceptera en dubbel och returnera en dubbel.
Så det kanske låter slags galen, men låt oss rulla ner lite
och titta för att se vad som händer.
Vi är inne i denna funktion powerOf.
Vi skapar en ny funktion kallas exponentiatorn,
men det spelar ingen roll vad det är.
>> Lägg märke till att detta har ett ingångsvärde för x.
Och det tar i en dubbel och returnera en dubbel.
Och det är samma kod som vi såg ovan, med undantag av att värdet 2
eller värdet av tre, som övre bundet i detta intervall,
har ersatts med detta värde på y, som
var den initiala parametern av vår powerOf funktion.
Och vid denna punkt, vi retur exponentiatorn.
Vi tillbaka funktionen.
>> Det är ungefär som en liten sinne blåser.
Men låt oss föreställa oss vad som händer när jag ringer denna funktion powerOf
och passerar in i det något värde som 2.
Vad detta innebär är att Jag har nu värdet
2 för y, vilket betyder att detta värde y i denna exponentiator funktion
blir att värdet 2.
Men jag återvänder här exponentiatorn funktion.
>> Så märke till vad Swift säger att jag har skapat i detta fall.
Låt torget en definition, är det en funktion som accepterar en dubbel
och returnerar en dubbel.
Jag har skapat en funktion att rutor något
med hjälp av denna mekanism här.
Och verkligen vad som händer är att det återvänder denna funktion
exponentiatorn, men detta värde y är insvept inuti den.
Och så nu varje gång jag använder den här variabel eller denna konstant heter
kvadrat, det är det kommer att bete sig som en funktion.
Och så jag kan sedan ringa den variabeln som jag skulle vilja kalla en funktion,
och passera in i det ett nummer, som i detta fall 3.
Och jag kommer då torget detta värde.
Så 3 kvadrat kommer då blir 9, som vi kan se här.
>> Riktigt galen, men detta nu ger mig möjlighet
att skapa andra powerOf funktioner.
Som jag kan säga, OK, och nu vill jag att skapa en ny funktion, powerOf (3),
och lagra det till en konstant kallas kub.
Och nu kuben kommer att bli en separat funktion som kommer därefter
ta lite värde som indata och kub som värde som vi kan se i den nedersta raden
här.
kub på 2 kommer att resultera i 8.
>> Förhoppningsvis ganska snyggt grejer.
Du har aldrig sett det här förut.
Jag uppmuntrar dig att undersöka nedläggningar och undersöka detta lite mer.
Det är verkligen kraftfulla saker ser vi en hel del i JavaScript och några andra språk.
Det är verkligen viktigt att förstå API: er samt
att vi kommer att få i bara en sekund.
Ja?
>> PUBLIK: När du gör powerOf (2), parentes, och sedan
annan parentes, en annan input-- du i princip ersätta torget.
DAN AMRMENDARIZ: Så ser i allra sista raden här.
Det är faktiskt helt möjligt att gör det kedja som ni föreslog.
Så powerOf (5) innebär att vi ska att ha en exponentiator av 5 upp här.
Så det här är i huvudsak kommer att vara samma sak som 4 till femte makten,
eftersom vi har skapat en exponentierande fungera till den femte makten,
och vi passerar in som fungerar värdet 4.
Och vi får detta värde att vi förväntar oss, 1024.
PUBLIK: Och det är inte en namn, så det gör det lättare
att läsa, torget oavsett.
>> DAN AMRMENDARIZ: Höger, exakt.
Så innan jag bara lägga den in i en konstant här så
att det gjorde det lätt att använda det namnet.
Ja?
>> PUBLIK: I detta sammanhang powerOf, det är en del
av programmeringsspråk i motsats till det sätt du
tänk på powerOf i [OHÖRBAR]?
DAN AMRMENDARIZ: Så i detta fall, powerOf
är helt enkelt namnet på funktion som jag definierade upp här.
Så det är inte inneboende till själva språket,
men i stället, det är bara en funktion som har
det namnet eftersom jag ge den det namnet.
Alla andra frågor?
Okej.
>> Nu är stor.
Men du kommer inte att se en massa förslutningsfunktioner som
är så här definierar du, inne av en funktion, en annan funktion.
Och du kan göra det.
Men det är typ av inte verkligen nödvändigt, eller hur?
Liksom varför jag definiera detta Funktionen kallas exponentiatorn
och sedan omedelbart tillbaka den.
Varför kan jag inte bara omedelbart returnera denna funktion?
>> Och i själva verket är det just tanken bakom ett koncept som kallas
anonyma funktioner, där anonyma funktioner egentligen inte
har ett namn, eftersom de behöver inte ha en.
Och så i detta fall, i 7B, vi kan hitta just detta.
Det är alla samma kod, gör exakt samma sak,
men nu har vi ändrat det något så att denna powerOf funktionen omedelbart
returnerar en funktion.
Lägg märke till att efter återvändandet, det finns en öppen klammer.
Det förväntar sig denna ingång Dubbel.
Det förväntar sig att produktionen Double.
Och sedan i sökord separerar själva koden.
Så det här är en anonym funktion.
Det egentligen inte har ett namn, medan innan det hette exponentiatorn.
Men som vi såg, bara verkligen inte hänvisa till exponentiator
utanför av den funktionen.
Så det spelade ingen roll.
Så denna anonym funktion är så kallad eftersom den är namnlöst,
men det är fortfarande används inom ramen för denna kod.
>> Nästa par som jag är kommer att fortsätta förhoppningsvis
blåser ditt sinne lite.
Vi kan förenkla ännu mer.
För som var skarpsinnigt påpekade tidigare,
kanske vi faktiskt vet, genom dra slutsatsen från denna kod, vad
utgången av denna kod kommer att bli.
Och faktiskt, i denna anonym funktion, Vi kan faktiskt sluta vilka typer av uppgifter.
>> Så i detta, vi inte längre måste explicit definiera
vilken typ av data som är att vara ingång och utgång från denna funktion
för ett par skäl.
En är att vi har definierat, upp på prototyp av den inneslutande funktion,
vilken typ av uppgifter denna anonyma Funktionen ska ingång och utgång.
Och från den andra, vi kan sluta sig till koden
här nere som vi accepterar ingång som är av typen Double
och returnera en dubbel.
>> Lägg märke till att vi här har inte uttryckligen definierade namnen på de argument
att denna funktion är att acceptera.
Och så ser vi att vi kan hänvisa till dessa parametrar med $ 0 $ 1,
så vidare och så vidare, beroende på numret på det parameter som används
i denna funktion.
>> Detta är något som du kommer att se en hel del är denna öppna klammer
definition följt av en $ 0 och sedan en operation,
och sedan en sluten klammer.
Det är en anonym funktion som utför denna operation.
Det har denna parameter där Det är typ är antagen.
Det första parametern är 0 $.
Och en operation är händer på att 0 $.
>> PUBLIK: Så dollartecken betyder parameter i princip,
och 0 betyder den första?
DAN Armendáriz: Det stämmer.
Så dollartecken i princip innebär parameter, och 0 betyder den första.
Men det fungerar specifikt i det här fallet där jag inte har namngett
argumenten i min anonym funktion.
>> PUBLIK: Har Perl eller något har denna dollartecken, dollar 0 där?
DAN Armendáriz: Gör som jag är ledsen?
PUBLIK: Har Perl har denna dollarn 0, dollar 1--
DAN Armendáriz: Jag är inte alltför bekant med Perl,
men PHP vad som definierar variabler baserat på dollartecken.
Och det kan finnas vissa språk som har funktioner som denna.
I själva verket lånar Swift en Många funktioner som detta
från en massa andra språk.
Vi ser inslag av Python i det.
Denna definition av typen verkar komma från OCaml.
Och vi har bara en massa grejer från massor av olika språk.
Det är en av de trevliga saker om Swift
är att det tar mycket av de bästa idéer från ett gäng språk
och skohorn dem alla tillsammans till en super språk.
I själva verket om du tillåter mig att fortsätta att blåsa ditt sinne,
så vi har gjort allt detta.
Vi kan kanske förenkla lite bitars genom att inse att, naturligtvis,
Swift har en exponentierande funktionen inbyggd.
Om jag importera Darwin, som är bara biblioteket som
har denna funktion som kallas pow, nu Jag kan förenkla min makt funktions
att vara följande.
Det kommer att vara tillbaka Detta anonym funktion.
>> Men titta på hur enkelt det är nu.
Detta är en anonym funktion som är att acceptera någon typ av data,
och det kommer att bli en argument som särskilt,
refereras på $ 0 som är av typen Double.
Det kommer att returnera en Duplex.
Men satsen return är nu implicit.
>> Och det är denna specifika stil som är mycket, mycket vanliga i Swift,
över hela stället.
Vi kommer att se detta hela tiden i Swift.
Så jag visar allt detta till dig på grund av denna syntax.
Detta är mycket vanligt att se, vilket betyder att det
är en anonym funktion som utför
någon operation på dessa argument.
Och det finns en implicit avkastning.
Så det är exakt samma sak för oss att säga detta, just här.
>> Eftersom denna lockigt fästet är en funktion,
vi utföra den här åtgärden på det första argumentet.
Vi kommer att återvända det.
Men denna yttre avkastningen tillbaka hela den funktion,
att hela anonym funktion att vi bara har skapat.
Alla andra frågor?
Okej, jag vet inte om ni är redo för detta,
men vi kan gå ännu galnare med Swift.
Är du redo?
OK, det här är bra.
>> Nu har vi faktiskt har förmågan till i Swift, på grund av hur modul
och hur protokoll baserat det vill säga att definiera våra egna freaking operatörer.
Som i det här fallet hade vi ingen operatör för exponentiation-- väl,
för att utföra befogenheter något.
Men jag kan i Swift, definiera en ny operatör som gör just detta.
Så i det här fallet finns det ett gäng syntax här.
Och jag kommer att låta dig att titta på det hemma när man tittar på detta.
Men vi definierar denna infix operatör, **, som sedan kommer att tillåta oss,
genom att definiera vad det funktion ** faktiskt
gör, att acceptera en vänster sida och en höger sida,
och sedan återgå exponenten för att vänster till höger sida.
>> Och så nu plötsligt jag har skapat en ny täljare.
Så 2 ** 3 betyder 2 till den tredje makten.
[Sinne blåser SOUND] Detta genom själv bör göra du gillar,
OK, skruv C. Jag tänker Swift hela vägen.
Det här är bra.
Detta är ganska fantastiskt.
>> Även om detta är ett bra exempel.
Men jag har aldrig en gång utanför i detta exempel faktiskt
definierat min egen operatör.
Men ändå, det visar en mycket av kraften i Swift
och varför detta är faktiskt verkligen väldigt cool.
OK, ja?
PUBLIK: Om du är definiera din egen operatör,
hur vet du att du inte av misstag försöka skapa en operatör som är
i någonstans i C, som gömd någonstans i Swift,
som en obskyr som du kanske inte har sett förut.
>> DAN Armendáriz: Så om du försöker att definiera egna operatörer,
finns det en risk för att definiera en över en befintlig aktör.
Det går in i en detaljnivå som Jag tror inte att vi har tid att gå igenom.
Men det finns en risk.
Och det är i själva verket själva anledningen till Jag använde inte cirkumflex symbol, som
när vi skriver ut makt, vi vanligtvis Använd 4 lite cirkumflex 5 eller något
så, just när vi är Gchatting kompisar eller vad som helst.
Men i så fall, som faktiskt skulle ha orsakat en kollision.
Och så jag undvek det bara för att Jag råkade veta i det här fallet
att det skulle leda till att kollision.
>> Okej.
Nu tyvärr, för de sista sju minuter,
Jag måste hålla blåsning era sinnen lite.
Så låt mig visa dig vissa andra saker också.
>> Vi har visat dig denna idé om ha dessa anonyma funktioner,
dessa nedläggningar som gör att du kan typ av pass funktioner runt.
Du kan lämna tillbaka dem.
Du kan manipulera dem.
Du kan göra alla typer av galna grejer.
>> Men en annan sak som råkar vara användbar
är möjligheten att, i motsats att återvända dessa funktioner
i en funktion, för att passera en funktion som en parameter till en annan funktion.
Du kanske tänker väl varför på jorden skulle jag vilja göra något sådant?
>> Nåväl, låt oss säga att jag vill att ta denna operatör som jag
arbetat så hårt för att skapa och tillämpa det till ett gäng olika nummer
i en matris.
Så i det här fallet har jag en rad integers-- 1, 4, 7, 2, 5, 10, 56.
Och jag vill att fördubbla dem alla.
Det sätt som vi skulle normalt göra det är att bara skriva
en enkel för loop som itererar över alla dem
och utföra någon form av kvadrat drift över dem,
inmatning dessa nya värden i en ny variabel, eller snarare, en ny array här.
Och värdet av utsignalen från Resultatet blir då samtliga dessa matriser,
eller snarare alla dessa element nu kvadrat.
>> Och vi kunde göra samma sak sak för cubing det,
men lite alarmklocka bör gå ut
säger att kanske det finns något sätt som vi skulle
kunna förenkla denna lite.
Och i själva verket finns det.
Tänk om vi kunde skapa en funktion som gör det möjligt för oss
att acceptera, som ett rovdjur, en funktion?
Så i detta fall, ta en titta på dessa argument.
Vi kommer att acceptera en lista med dubbel.
Och då kommer vi att acceptera en funktion
i en variabel som kallas f som kommer att ta en dubbel och returnera en dubbel.
Och hela utsignalen av hela denna funktion
kallas mapper kommer att returnera en array kallas dubbel.
>> Vad detta skulle då tillåta mig att göra är att iterera över listan
och göra samma sak, men nu tillämpa denna funktion för varje
av de individuella värdena i den listan.
Så inte riktigt vet jag vad f är.
Det spelar ingen roll för mig.
Men så länge det tar i en dubbel, utför någon operation på det,
och returnerar sedan ett Dubbel, skulle jag då vara
kunna kartlägga denna funktion över varje enskilt element i listan.
>> Och denna typ av programmering är kallade högre ordningens funktioner,
där vi passerar funktioner runt som parametrar
och göra saker med funktioner.
Det är ungefär som att ta alla dessa idéer som vi har lärt oss i CS50
och ta med dem sorterar av till nästa nivå.
Och det är allt CS51 stil grejer.
Och så går vi på djupet mer i klasserna som.
>> Men det är också viktigt här eftersom vi
se en hel del funktioner som används i Swift
som i huvudsak gör detta där vi har
några siffror, vissa rad siffror.
Vi kommer att passera att array i vår kartritare.
Och vi kommer även att passera någon funktion, som
Vi har redan definierat här uppe.
Det kommer att vara fyrkantig.
Och vi kommer att sedan torget alla dessa siffror
och lagra det i detta resultat här.
>> Så det här fallet har vi definierat vår egen funktion som kallas kartritare.
Men denna specifika sak är, i själva verket, inbyggd i Swift.
Det finns en mängd olika funktioner kallas karta.
Det finns en kartfunktion, det finns en sänka funktion,
och det finns en filterfunktion, som i huvudsak gäller funktioner
till varje enskilt element i en lista att ändra dem på något sätt.
>> PUBLIK: Så eftersom du omformar data till ett annat format
genom en function--
DAN Armendáriz: Rätt.
Ja, så funktionen att vi acceptera
omvandlar data på något sätt.
I det här fallet var vi antingen kvadratur det, eller vi cubing det,
eller egentligen kunde vi utför ingen operation på det alls.
>> Men låt mig visa dig då hur detta kommer att se ut i praktiken.
Och återigen, jag kör en lite tid. så jag är inte
kommer att kunna gå över alla av källkoden i detalj här.
Men jag uppmuntrar dig att göra det.
Vi kommer att lägga det så snart som möjligt efter detta samtal.
>> Men om du tar en titt på detta, anta att vi har en lista med tal,
en matris med siffror på detta variabel uppringda numren.
Då kan vi vill utföra detta filter operation på dessa siffror.
Så filter är ett högre ordningens funktion som
accepterar en array och även en funktion.
Och på varje element i det matris, utför den denna funktion.
>> Om att funktionen returnerar sant, det håller det objektet.
Om denna funktion returnerar false, Det kastar bort den posten.
Och sedan returnerar en lista som sedan består alla
av de poster som har filtrerats.
>> Så i ett annat ord, är detta samma idé, betygsbok.
Vi kanske har en mängd olika kvaliteter in detta värde uppringda numret.
Kan vara 100, och 70, och 40, så vidare och så vidare.
Vad det här filtret gör är meddelande att detta är att syntaktiskt socker
för en anonym funktion.
Detta är en anonym funktion säger att den parameter som jag acceptera
kommer att vara, om det är större än 70,
då detta kommer att återvända sant, vilket innebär att objektet kommer att hållas i det här filtret.
Så låt oss vara lite mer konkret om detta.
Om jag har denna rad siffror och den består av 100, 70, och 40,
Jag gör det här filtret operation på vart och ett av dessa.
Så det första är detta värde på 100.
100 större än eller lika till 70 är sant, vilket
innebär att 100 hålls i denna ny kopia av denna samling.
70 passerar också.
Men 40 inte.
Så vad är tillbaka i passingCount är arrangemanget av elementen 100 och 70--
100, kommatecken, 70.
De var de enda två objekt som hölls.
Och så anledningen till att jag snabbt gick igenom en hel del av denna typ av hög ordning
saker är eftersom detta är att vanliga sak som du kommer att se i Swift ganska
ofta utför en operation använder denna anonym funktion syntax.
>> Det finns några coola grejer.
Växlar är riktigt kraftfull i Swift, Jag menar precis som galen, galen kraftfull.
Du kan använda switch, och du kan faktiskt använda dem
till intervall, som är typ av galen, och göra snygga sånt.
>> Men under de senaste minuterna, Jag vill hoppa framåt ganska långt
och visa dig ett konkret exempel på hur vi kan skapa i iOS programmet med Swift.
Så när du gör detta måste du ta
en blick at-- på Apples dokumentation, de
har en hel del riktigt bra tutorials för att skapa din första ansökan.
Och jag uppmuntrar dig att göra att eftersom de tar dig
genom alla stegen i vad exakt till klicka på för att skapa ett iOS-program.
>> Men här har vi denna iOS-app.
Och det är en ganska enkel app verkligen.
Om jag kör detta, låt mig visa du hur det ser ut.
Allt det i huvudsak gör är det drar från Internet en JSON fil
att jag har lagras på en server.
Och det JSON fil definierar bilder som tillåter
mig att sedan gå igenom, på min app, bilder från mitt webbserver.
>> Så jag har här getNextImage.
Den laddar en bild från internet, och sedan visar den på skärmen.
>> Så det är ganska enkelt.
Men målet är att visa hur vi kan kombinera saker
från de senare veckorna av CS50 till en verklig iOS-program.
Med andra ord, kanske en av de saker som du kommer att vilja göra
är att ha en iOS-program som kan hämta data från Internet
och visa användaren viss information.
Det är helt och hållet den punkt av detta källkoden här.
>> Så det finns en hel del att säga om hur man gör själva iOS utveckling.
Det finns en hel del galna syntax att vi inte har sett riktigt än
som en klass, vilken klass som faktiskt är.
Vi kan till stor del ignorera att för närvarande.
>> Men märker att vi har inne inom denna en mängd olika saker
att vi redan har sett som funktioner som har specifika namn.
Och när vi ger dem fungerar rätt namn
som förväntas av iOS, i själva verket det här känns lite magiskt.
Men när du skapar en IOS ansökan, det
är specifika funktionsnamn som kallas av själva telefonen
som ansökan laddar att försöka för att skapa den process som faktiskt
kör din ansökan.
Så återigen, det finns en massa saker som jag måste skyla över hit för att vi
att tala om detta specifikt.
Men jag uppmuntrar dig att titta på kanske den andra iOS seminariet, men även en del
av tutorials på nätet som gör ett mycket bättre jobb med att beskriva
specifik information.
>> Men vi kan se ett par saker som är intressant ur koden här.
Lägg märke till att vi har om uttalanden.
Förresten, en viktig sak om om uttalanden
är att parentes runt Booleskt uttryck är valfria.
Men klammerparenteserna är inte frivilligt, oavsett hur få eller många rader kod
du har i en if-sats.
Du kan inte ha en om uttalanden utan klammerparenteserna i Swift.
>> Och detta är, ja, typ av dumt.
Men det finns historiska skäl för detta.
Det är tänkt att rädda dig från dig själv.
Gillar du till exempel, kan du inte eliminera klammerparenteserna runt den
if-sats.
De är i själva verket erfordras.
Så jag uppmuntrar dig att ta en titt på detta.
Men det finns ytterligare en konstruera att jag vill
att visa dig om Swift som är nytt för Swift 2,0 jämfört
till äldre versioner av Swift, vilket är följande.
Låt oss se var jag uttrycka det här?
>> Så i denna funktion som kallas fetchJSON denna funktion
är ansvariga för att dra att JSON fil från en URL, som bara råkar vara så
köras på min CS50 IDE.
Jag har precis börjat Apache, sätta min JSON fil där,
och jag kan då dra det data från Internet med hjälp av
denna funktion och denna URL, som tillhandahålls av telefonen.
Det tillhandahålls av en bibliotek som du använder när
du gör några iOS applikationsutveckling.
>> Lägg märke till här att det är denna ovanliga syntaktisk konstruktion kallas vakt.
Och egentligen allt detta är i Swift är ett sätt att verifiera
att vissa saker har är uppfyllda innan du
gå vidare med resten av funktionen.
Så jag kunde ha, med hjälp av Detta tillval typ,
Jag kunde har hittat URL: en med kör denna NSURL funktion
och lagra det i en URL konstant, och sedan kontrollera
för att se om webbadressen var noll, eftersom det skulle returnera en valfri typ.
Och om det var noll, då skulle jag skriva ut ett fel och sedan återvända.
>> Men i stället, låter vad vakt oss gör är att just det,
men se till att det är faktiskt så att url
har ställts in korrekt av NSURL.
Och om det är, då det hoppar över detta, och det
gör att du kan gå vidare med url ha adekvat definierade.
Men om det är så att url är inte korrekt definierad,
Om den här funktionen returnerar ett fel eller någon annan oväntad sak
faktiskt sker, detta skydd konstruktion ger oss möjlighet att sedan ut detta fel
och omedelbart återvända.
Ja?
>> PUBLIK: Så det är typ av som en om så annars?
DAN Armendáriz: Det är typ av som en om så annars, ja,
förutom att denna url sedan definierats för allt under denna.
Om den passerar detta skydd, då det faktiskt kommer att fyllas med data
och som kan användas i den återstående källkod i din funktion.
Så jag misstänker att du kommer att börja se detta skydd också.
Och vara uppmärksam på detta.
>> Så bara titta på ett par andra saker, denna rätt här är vad,
tror du, bara baserat på vad vi talade om tidigare?
>> PUBLIK: Tror det ska köras i listan?
>> DAN Armendáriz: Så det är nära.
Detta är en funktion som vi definierar.
Och vi matar in denna funktion som ett argument till denna funktion här.
>> Publik: [OHÖRBAR] om inte noll.
Så det är i listan, eller hur?
>> DAN Armendáriz: Om felet inte är noll, så det är-- så jag måste rulla.
Nåväl, låt oss se, jag kan inte riktigt bläddra till höger här.
error är ett argument som håller på att skickas till denna anonym funktion.
Detta är en anonym funktion.
Den har inget namn.
Men vi accepterar dessa tre argument, data, svar och fel.
Och det kommer att återvända ogiltiga, så det kommer inte att återvända något.
Och detta är innehållet av den funktionen.
Och sedan har vi tillgång insidan som funktion var och en av dessa argument.
>> Så det är en virvelvind rundtur i språket.
Men jag hoppas med detta förhoppningsvis när du tar
en titt på några av de tutorials specifika för iOS utveckling med Swift,
särskilt om du går till Apples utvecklare web page--
de har en hel del riktigt bra handledning för att komma igång.
Men förhoppningsvis just denna timme att tala om syntaxen i sig har gett
dig tillräckligt för att komma igång med det.
>> Vi kommer att lägga allt detta källa kod på seminariet webbplats
så snart som möjligt, och även glasen så du har en referens för alla dem.
Men lycka till med dina projekt.
Och tack alla så mycket för att ni kom.
>> [APPLÅDER]