1 00:00:00,000 --> 00:00:03,332 >> [MUSIK SPELA] 2 00:00:03,332 --> 00:00:06,200 3 00:00:06,200 --> 00:00:09,590 >> DAN AMRMENDARIZ: Alla, välkommen till CS50 seminariet 4 00:00:09,590 --> 00:00:11,690 iOS App utveckling med Swift. 5 00:00:11,690 --> 00:00:15,690 Jag är Dan Armendariz, och jag är en handledare datavetenskap här på Harvard. 6 00:00:15,690 --> 00:00:21,510 >> Och nästa timme kommer att vara en virvelvind rundtur i så mycket grejer 7 00:00:21,510 --> 00:00:25,160 om detta ämne som vi kan passa. 8 00:00:25,160 --> 00:00:29,170 Jag kommer att lägga all källkod att du kommer att se i dag på nätet. 9 00:00:29,170 --> 00:00:31,990 Vi kanske inte kunna faktiskt gå över allt 10 00:00:31,990 --> 00:00:34,810 att jag är att jag är visar dig i denna stund. 11 00:00:34,810 --> 00:00:37,580 Men åtminstone förhoppningsvis genom kommentarerna från källkoden, 12 00:00:37,580 --> 00:00:40,830 du kommer att kunna försöka räkna ut vad exakt händer med dessa saker 13 00:00:40,830 --> 00:00:42,950 att vi inte riktigt får till. 14 00:00:42,950 --> 00:00:46,970 >> Sammantaget struktur dagens föredrag kommer att vara följande. 15 00:00:46,970 --> 00:00:52,820 Vi kommer att börja göra vissa grundläggande syntax med Swift språket, 16 00:00:52,820 --> 00:00:56,290 gå in i några av de mer avancerade syntax Swift språket. 17 00:00:56,290 --> 00:00:59,560 Eftersom språket är verkligen moderna och det 18 00:00:59,560 --> 00:01:02,110 har mycket hög nivå funktioner, saker som vi har inga 19 00:01:02,110 --> 00:01:06,600 sett i C hela CS50, eller även några andra språk 20 00:01:06,600 --> 00:01:09,310 att vi har börjat använder i CS50 som PHP, 21 00:01:09,310 --> 00:01:12,670 så jag kommer att behöva försöka introducerar också några ämnen som 22 00:01:12,670 --> 00:01:18,580 är relaterade till språk högre nivå att du inte kan se i djup i CS50, 23 00:01:18,580 --> 00:01:21,380 men du kommer att se senare datavetenskap klasser. 24 00:01:21,380 --> 00:01:25,290 Så det kommer att bli en tätt packade timme. 25 00:01:25,290 --> 00:01:28,897 Och är du välkommen att låta mig vet om du har några frågor. 26 00:01:28,897 --> 00:01:30,730 Så om du är intresserad att göra utveckling 27 00:01:30,730 --> 00:01:34,442 med Swift, eller egentligen alla iOS applikationsutveckling, 28 00:01:34,442 --> 00:01:35,900 Det finns ett par krav. 29 00:01:35,900 --> 00:01:39,940 Först av allt måste du använda en Mac som kör i exemplen 30 00:01:39,940 --> 00:01:43,880 att vi kommer att använda i dag, en relativt ny version av operativsystemet 31 00:01:43,880 --> 00:01:46,580 X. I det här fallet, jag kör X 10.5. 32 00:01:46,580 --> 00:01:48,600 Du kan köra 10.11 om du vill. 33 00:01:48,600 --> 00:01:52,430 Men allt som du kommer att se är involverar Xcode 7 och senare, 34 00:01:52,430 --> 00:01:56,271 som har den senaste versionen Swift, som är Swift 2.0. 35 00:01:56,271 --> 00:01:58,270 Detta är faktiskt en ganska viktig skillnad. 36 00:01:58,270 --> 00:02:01,510 En hel del av syntaxen har förändrats ganska signifikant 37 00:02:01,510 --> 00:02:05,890 i vissa fall från Swift 1.0, som släpptes förra året, 38 00:02:05,890 --> 00:02:08,514 Swift 2,0, vilket bara kom ut i höst. 39 00:02:08,514 --> 00:02:09,889 Så vi kommer att visa Swift 2.0. 40 00:02:09,889 --> 00:02:13,020 En hel del av de saker som du söker efter på nätet 41 00:02:13,020 --> 00:02:18,040 när du försöker att få ytterligare information om en mängd olika saker, 42 00:02:18,040 --> 00:02:20,710 du kanske vill uttryckligen Sök efter Swift 2 43 00:02:20,710 --> 00:02:24,950 snarare än bara vanliga gamla Swift att göra Se till att du får syntaxen korrekt. 44 00:02:24,950 --> 00:02:26,920 >> I själva verket är detta generellt sant. 45 00:02:26,920 --> 00:02:31,210 Det finns en snabb mängd utveckling händer i Swift språk 46 00:02:31,210 --> 00:02:35,110 ända sedan Apple släppte det, tror jag vad, det har varit lite över ett år 47 00:02:35,110 --> 00:02:36,370 nu. 48 00:02:36,370 --> 00:02:39,080 Och saker har förändrats dramatiskt under den tiden. 49 00:02:39,080 --> 00:02:42,160 Och så bli inte frustrerad om, när du tittar runt 50 00:02:42,160 --> 00:02:48,310 för ämnen på Swift eller hur man åstadkomma något med hjälp av några exempel kod 51 00:02:48,310 --> 00:02:51,210 eller något som den inte faktiskt arbetar på Swift 2.0. 52 00:02:51,210 --> 00:02:53,790 Se till att du söker specifikt för den versionen 53 00:02:53,790 --> 00:02:58,690 att försöka minimera effekterna av olika versioner och den sortens saker. 54 00:02:58,690 --> 00:03:02,470 >> Jag ska försöka att peka ut bara några saker som skiljer sig från äldre versioner. 55 00:03:02,470 --> 00:03:03,970 Men det är något att se upp för. 56 00:03:03,970 --> 00:03:06,770 Det är antagligen kommer att bli en av de största huvudvärk 57 00:03:06,770 --> 00:03:11,010 att du kommer att ha med Swift är att hitta exempelkod som är äldre, även bara 58 00:03:11,010 --> 00:03:14,050 med några månader, försöker använda den i mer moderna projektet. 59 00:03:14,050 --> 00:03:15,430 Och det helt enkelt inte fungerar. 60 00:03:15,430 --> 00:03:18,530 Du får kompileringsfel, syntax fel, alla typer av galna grejer. 61 00:03:18,530 --> 00:03:21,580 Så bara ha tålamod med det, och du kommer förhoppningsvis 62 00:03:21,580 --> 00:03:24,200 har en ganska trevlig upplevelse med Swift totalt. 63 00:03:24,200 --> 00:03:28,430 >> Nu kan du faktiskt join-- och jag hoppas vi faktiskt fortfarande har denna denna year-- 64 00:03:28,430 --> 00:03:30,910 CS 50 Apple App utvecklingsteam, som 65 00:03:30,910 --> 00:03:34,680 gör att du kan installera några appar som du skapar på dina iOS-enheter. 66 00:03:34,680 --> 00:03:39,190 Så ta en titt på den här webbadressen om du är intresserad av att göra det. 67 00:03:39,190 --> 00:03:41,450 >> Så bara ett par saker om Swift själv. 68 00:03:41,450 --> 00:03:43,580 Det är en kompilerad språk. 69 00:03:43,580 --> 00:03:45,870 Men du kommer att se att vissa av de funktioner som vi använder 70 00:03:45,870 --> 00:03:50,650 tillåta att den kan användas även i en bit som en tolkad sätt också. 71 00:03:50,650 --> 00:03:56,350 >> En hel del av syntaxen är lånad från C. Den är baserad och skriven i C. 72 00:03:56,350 --> 00:04:00,400 Och så kommer vi att se till att Det finns en hel del takeaways 73 00:04:00,400 --> 00:04:04,450 från befintlig kunskap från C som vi kan port till Swift. 74 00:04:04,450 --> 00:04:07,290 >> Men det finns saker som göra det mycket annorlunda från C. 75 00:04:07,290 --> 00:04:08,860 Det är mycket starkt skrivit. 76 00:04:08,860 --> 00:04:10,380 Det finns automatisk minneshantering. 77 00:04:10,380 --> 00:04:13,170 Du kommer inte att behöva använda malloc eller fri någonstans. 78 00:04:13,170 --> 00:04:15,110 Den är utformad för generalitet. 79 00:04:15,110 --> 00:04:19,480 Så med andra ord kan du använda den i alla typer av sammanhang, från Apple Watch 80 00:04:19,480 --> 00:04:26,290 till iPhone hela vägen upp till OS X, och även vissa servrar, även några skript. 81 00:04:26,290 --> 00:04:28,400 Men vi får se att stöd för skript 82 00:04:28,400 --> 00:04:31,360 är inte riktigt där ännu som det är i andra språk. 83 00:04:31,360 --> 00:04:34,930 Så mest troligt att du kommer att använda detta enbart för utveckling 84 00:04:34,930 --> 00:04:37,060 på din Mac eller din iPhone. 85 00:04:37,060 --> 00:04:40,150 >> Och det har en hel del moderna funktioner. 86 00:04:40,150 --> 00:04:43,380 Och en hel del av dessa saker är saker som vi kommer att försöka ta itu med i dag, 87 00:04:43,380 --> 00:04:47,590 men även våra ämnen som uppriktigt sagt, vi kan ägna hela kurser. 88 00:04:47,590 --> 00:04:50,140 I själva verket, CS 51, som är erbjuds nästa termin, 89 00:04:50,140 --> 00:04:53,990 fokuserar mycket på dessa frågor som beskrivs nedan. 90 00:04:53,990 --> 00:04:56,781 Så du kan spendera en hel termin förstå dessa saker. 91 00:04:56,781 --> 00:04:58,530 Men vi ska försöka att få igenom dem 92 00:04:58,530 --> 00:05:00,800 åtminstone nog att du kan förstå vad som är 93 00:05:00,800 --> 00:05:03,700 händer när du ser vid en Swift program 94 00:05:03,700 --> 00:05:07,310 och kunna hacka din väg genom det för det slutliga projektet. 95 00:05:07,310 --> 00:05:10,780 >> Nu en av de bästa sätten att du kan få ytterligare information om detta 96 00:05:10,780 --> 00:05:14,700 är ärligt talat bara via Apples lämnat dokumentation för Swift. 97 00:05:14,700 --> 00:05:16,930 Det finns en hel del API som finns tillgängliga. 98 00:05:16,930 --> 00:05:21,170 Och detta är en bra bas för dig för att leta efter specifika saker som du 99 00:05:21,170 --> 00:05:23,020 vill göra med ett API som involverar iOS. 100 00:05:23,020 --> 00:05:26,350 Om du vill använda kameran för Exempelvis kan du börjar leta här, 101 00:05:26,350 --> 00:05:32,540 och även använda Google och Stack Overflow som vanligt. 102 00:05:32,540 --> 00:05:36,670 >> Eventuella frågor om denna innan vi hoppa rätt in? 103 00:05:36,670 --> 00:05:37,880 Okej. 104 00:05:37,880 --> 00:05:38,700 Låt oss gå vidare. 105 00:05:38,700 --> 00:05:42,620 >> Så först, har jag en antal exempelfiler. 106 00:05:42,620 --> 00:05:46,040 Och jag kommer att försöka steg genom dem relativt snabbt. 107 00:05:46,040 --> 00:05:49,190 Detta är Hello World-fil för Swift. 108 00:05:49,190 --> 00:05:51,050 Det är väldigt enkelt. 109 00:05:51,050 --> 00:05:54,360 Det finns sätt fler kommentarer än det finns faktiska koden. 110 00:05:54,360 --> 00:05:57,100 Lägg märke till den faktiska koden är på allra längst ner på ledningen 14. 111 00:05:57,100 --> 00:05:57,980 Det säger print. 112 00:05:57,980 --> 00:05:59,820 Och då är det ett funktionsanrop. 113 00:05:59,820 --> 00:06:03,010 Vi passerar in i den en sträng som kallas Hej CS50. 114 00:06:03,010 --> 00:06:04,750 Lägg märke till att det inte finns några semikolon. 115 00:06:04,750 --> 00:06:07,010 Lägg märke till att det inte finns någon int main. 116 00:06:07,010 --> 00:06:10,392 Det finns ingen av de cruft som vi hade med C. 117 00:06:10,392 --> 00:06:15,020 När vi använder Swift på detta sätt, som bara är skriven i en textfil 118 00:06:15,020 --> 00:06:18,340 och lagras på min dator, sedan Jag kan kompilera den och köra den. 119 00:06:18,340 --> 00:06:20,920 >> Lägg märke till att här är jag inte använder CS50 IDE. 120 00:06:20,920 --> 00:06:24,460 Detta förutsätter att jag är igång och att jag är på OS X, 121 00:06:24,460 --> 00:06:27,870 och att jag har Xcode redan installerat på den här datorn för att detta 122 00:06:27,870 --> 00:06:29,080 att faktiskt funktion. 123 00:06:29,080 --> 00:06:33,349 Men detta är bara en vanlig textfil att vi då kan sammanställa och redigera. 124 00:06:33,349 --> 00:06:34,890 Så låt oss se hur det faktiskt fungerar. 125 00:06:34,890 --> 00:06:37,430 Vad gör jag om jag vill kompilera det? 126 00:06:37,430 --> 00:06:40,450 swiftc 1.swift. 127 00:06:40,450 --> 00:06:42,960 Efter en stund eller två, det kommer att se att vi har nu 128 00:06:42,960 --> 00:06:45,360 sammanställt detta i en fil som heter 1. 129 00:06:45,360 --> 00:06:51,090 Och nu har vi tryckt vår CS50, vår Hello World-programmet i stället. 130 00:06:51,090 --> 00:06:54,690 >> Lägg märke till en annan sak som bra är att som standard, 131 00:06:54,690 --> 00:07:00,090 vi inte behövde input a / n för att skriva ut en ny linje. 132 00:07:00,090 --> 00:07:05,315 Som standard utskriftsfunktionen i Swift kommer att skriva en ny linje för dig. 133 00:07:05,315 --> 00:07:09,284 Du kan skicka en eventuell ytterligare parameter för att tala om den inte att göra detta. 134 00:07:09,284 --> 00:07:10,950 Men Google för mer information om detta. 135 00:07:10,950 --> 00:07:13,450 Som standard kommer den göra skrivraden. 136 00:07:13,450 --> 00:07:16,420 >> Okej, så låt oss gå vidare sedan till några andra saker. 137 00:07:16,420 --> 00:07:18,620 Så hur kan vi faktiskt definiera variabler? 138 00:07:18,620 --> 00:07:21,960 Vi kan göra det är att använda en av två metoder. 139 00:07:21,960 --> 00:07:26,122 Och det som jag vill berätta om första är denna låt definition. 140 00:07:26,122 --> 00:07:27,830 Och detta är viktigt eftersom ett effektivt 141 00:07:27,830 --> 00:07:30,240 vad vi gör är att definiera en konstant. 142 00:07:30,240 --> 00:07:34,010 Vi ska skapa en variabel, eller snarare ett konstant kallas namn, 143 00:07:34,010 --> 00:07:38,200 förse det några data-- i detta fall strängen Dan. 144 00:07:38,200 --> 00:07:40,630 Men genom att använda denna låt nyckelord, säger vi 145 00:07:40,630 --> 00:07:43,860 att detta variable-- eller igen constant-- kallas 146 00:07:43,860 --> 00:07:46,220 Namnet kommer aldrig att ändras. 147 00:07:46,220 --> 00:07:50,120 Det kommer att vara oföränderliga i hela varaktigheten av detta program 148 00:07:50,120 --> 00:07:53,100 eller genom hela varaktighet av sammanhanget 149 00:07:53,100 --> 00:07:55,390 att denna variabel är tillgänglig. 150 00:07:55,390 --> 00:08:00,096 >> Detta är verkligen viktigt att när du har någon information som inte är 151 00:08:00,096 --> 00:08:02,970 kommer att förändras i ditt program, och du kommer att se en mängd olika exempel 152 00:08:02,970 --> 00:08:06,790 om när vi vill använda låt kontra andra syntaxen, 153 00:08:06,790 --> 00:08:11,040 Det är viktigt att du använder låter där så är möjligt eftersom detta meddelar 154 00:08:11,040 --> 00:08:13,740 språket som det är inte kommer att ändras, 155 00:08:13,740 --> 00:08:16,590 och det kan faktiskt göra en massa optimeringar 156 00:08:16,590 --> 00:08:19,560 för att förbättra hastigheten och säkerheten för ditt program. 157 00:08:19,560 --> 00:08:24,480 Och säkerhet, menar jag inte låta IT-kraschen med galna fel 158 00:08:24,480 --> 00:08:27,910 att vi kan vara vana vid att se i C. 159 00:08:27,910 --> 00:08:32,460 >> Då kan vi använda sträng interpolation att kapsla in detta inom en sträng. 160 00:08:32,460 --> 00:08:35,200 Så vi kan se i denna utskrifts linje, skriva hej, 161 00:08:35,200 --> 00:08:38,950 och sedan använda omvända snedstreck öppna parens, och sedan namnet på min variabel, 162 00:08:38,950 --> 00:08:41,809 i detta fall konstant, stänga parentes. 163 00:08:41,809 --> 00:08:46,400 Jag huvudsak sedan sätta Innehållet i denna variabel som heter namn 164 00:08:46,400 --> 00:08:50,240 insidan av strängen och sedan utskrift resultatet där. 165 00:08:50,240 --> 00:08:54,070 >> Det finns en annan förändring till den här filen vilket är att jag har, högst upp, 166 00:08:54,070 --> 00:08:57,340 sätta i en Shebang linje, som i princip bara anger 167 00:08:57,340 --> 00:09:00,180 som jag vill använda Swift tolk, som 168 00:09:00,180 --> 00:09:04,190 innebär att jag inte längre behöver sammanställa detta program. 169 00:09:04,190 --> 00:09:06,567 Jag kan bara köra det som sitt eget manus. 170 00:09:06,567 --> 00:09:09,400 Men detta är, i det här fallet, bakom kulisserna sammanställs och sedan 171 00:09:09,400 --> 00:09:10,030 körs. 172 00:09:10,030 --> 00:09:13,540 Det är bara osynlig för oss. 173 00:09:13,540 --> 00:09:15,880 >> Okej, så låt oss gå vidare. 174 00:09:15,880 --> 00:09:19,650 Så det finns lite knep som just hänt förut. 175 00:09:19,650 --> 00:09:23,230 Jag visade att jag skulle kunna definiera en konstant. 176 00:09:23,230 --> 00:09:25,490 Och jag kunde ge några uppgifter att göra det. 177 00:09:25,490 --> 00:09:29,240 Men i det här fallet, märker att jag inte faktiskt ange vilken typ av uppgifter 178 00:09:29,240 --> 00:09:29,820 att det är. 179 00:09:29,820 --> 00:09:32,780 Och det beror på att kompilator, Swift kan 180 00:09:32,780 --> 00:09:36,910 härleda vilken typ av data som bara baseras på de uppgifter som jag lagt ned på det. 181 00:09:36,910 --> 00:09:41,760 Eftersom det vet att genom att utvärdera detta variabel här, denna data direkt 182 00:09:41,760 --> 00:09:43,370 här, vet den att det är en sträng. 183 00:09:43,370 --> 00:09:48,690 Och så denna ständiga namn är därför kommer att vara en sträng liksom. 184 00:09:48,690 --> 00:09:52,730 >> Men vi kan också vara explicit om den typ som är 185 00:09:52,730 --> 00:09:55,790 vi kommer att använda för konstanter eller variabler 186 00:09:55,790 --> 00:10:01,590 genom att använda denna syntax instead-- låt namn kolon Sträng lika 187 00:10:01,590 --> 00:10:05,530 Dan, som i detta fall innebär att vi är kommer att definiera en konstant som heter namn. 188 00:10:05,530 --> 00:10:07,150 Det kommer att vara av typen String. 189 00:10:07,150 --> 00:10:10,550 Och värdet kommer att vara Dan. 190 00:10:10,550 --> 00:10:12,550 Nu den andra vägen som vi kan skapa variables-- 191 00:10:12,550 --> 00:10:15,549 och dessa är föränderliga variabler, som innebär att vi i själva verket gå 192 00:10:15,549 --> 00:10:19,670 att ändra deras innehåll gång i varaktigheten av sammanhang 193 00:10:19,670 --> 00:10:23,890 att den variabeln defined-- vi Använd nyckelordet var i stället för låt. 194 00:10:23,890 --> 00:10:27,400 Men återigen, som standard, om du inte vet att du måste manipulera dessa data, 195 00:10:27,400 --> 00:10:30,510 försöker använda låt för prestandaförbättringar. 196 00:10:30,510 --> 00:10:33,740 >> I det här fallet kan jag då ange vilken typ av uppgifter 197 00:10:33,740 --> 00:10:37,650 att vi räknar med att vara inne i denna nya variabel kallad etikett. 198 00:10:37,650 --> 00:10:38,800 Det kommer att vara en sträng. 199 00:10:38,800 --> 00:10:43,030 Och vi kommer att sedan slå samman två strängar tillsammans, strängen hej, 200 00:10:43,030 --> 00:10:48,070 och strängen som representeras av variabel, eller snarare den ständiga namn. 201 00:10:48,070 --> 00:10:50,660 >> Så det här är trevligt eftersom detta är något PHP liknande genom att vi 202 00:10:50,660 --> 00:10:52,250 har mycket lätt strängsammanfogning. 203 00:10:52,250 --> 00:10:56,350 Vi behöver inte automatiskt använda någon form av minneshantering 204 00:10:56,350 --> 00:11:00,580 för att öka storleken och göra någon form av roliga saker där. 205 00:11:00,580 --> 00:11:05,040 Detta fungerar som vi faktiskt förväntar. 206 00:11:05,040 --> 00:11:09,370 >> Okej, några frågor om detta? 207 00:11:09,370 --> 00:11:12,520 >> Nu den andra anledningen till att Vi behöver du har förmågan 208 00:11:12,520 --> 00:11:15,490 för att kunna definiera vad typ av datavariabler är 209 00:11:15,490 --> 00:11:18,170 beror ibland gör vi inte vill initiera variabler 210 00:11:18,170 --> 00:11:21,080 med vissa uppgifter på punkt definitionen. 211 00:11:21,080 --> 00:11:23,500 Så i detta fall, låt oss säga att jag vill börja mata 212 00:11:23,500 --> 00:11:25,040 vissa kvaliteter i en klass bok. 213 00:11:25,040 --> 00:11:27,530 Jo jag vet att en av de variabler som jag vill vara 214 00:11:27,530 --> 00:11:30,280 kommer att bli en föränderlig klass. 215 00:11:30,280 --> 00:11:33,010 Och vi vet också att vi vill att det ska vara ett heltal. 216 00:11:33,010 --> 00:11:36,030 Men kanske vi gör ännu inte har den kvalitet som finns. 217 00:11:36,030 --> 00:11:39,570 >> I Swift, måste du definiera vilken typ av data 218 00:11:39,570 --> 00:11:44,000 som är associerad med en variabel eller en låt konstant 219 00:11:44,000 --> 00:11:47,840 innan du kan faktiskt använda den variabeln. 220 00:11:47,840 --> 00:11:51,170 Eftersom det är starkt skrivit, du måste associera en typ 221 00:11:51,170 --> 00:11:52,890 med dessa variabler. 222 00:11:52,890 --> 00:11:56,120 >> Så i detta fall, om jag har inte riktigt initialiseras först med ett visst värde, 223 00:11:56,120 --> 00:12:00,520 då jag måste tala om Swift vad Jag förväntar mig att den typ av data för att vara. 224 00:12:00,520 --> 00:12:02,650 Och det kommer att förbli samma datatyp 225 00:12:02,650 --> 00:12:05,780 hela historien av detta program. 226 00:12:05,780 --> 00:12:10,050 >> Nu kanske du frestas så snart Jag har skapat denna klass variabel 227 00:12:10,050 --> 00:12:13,530 och under förutsättning att det en heltal 100, nu om jag 228 00:12:13,530 --> 00:12:18,540 vill försöka sammanfoga en sträng med det heltal, 229 00:12:18,540 --> 00:12:21,610 kan frestas att fortfarande använda den strängen operatorn 230 00:12:21,610 --> 00:12:24,500 som vi gjorde bara några rader innan. 231 00:12:24,500 --> 00:12:26,460 Men tyvärr, Detta kommer faktiskt inte 232 00:12:26,460 --> 00:12:29,270 arbete, eftersom du är väsentligen utför 233 00:12:29,270 --> 00:12:32,380 en operation på två olika typer. 234 00:12:32,380 --> 00:12:36,856 >> Nu skiljer sig mycket från andra språk som PHP som är riktigt 235 00:12:36,856 --> 00:12:38,480 loosey goosey med deras typ av typer. 236 00:12:38,480 --> 00:12:40,030 De är precis som, ja, vad som helst, jag bryr mig inte. 237 00:12:40,030 --> 00:12:42,710 Ge mig bara en typ, och kanske jag ska göra det rätta. 238 00:12:42,710 --> 00:12:46,060 >> I det här fallet, är Swift mycket stränga om vilka typer 239 00:12:46,060 --> 00:12:47,350 att du har att göra med. 240 00:12:47,350 --> 00:12:50,700 Denna summerings operatör eller operatorn 241 00:12:50,700 --> 00:12:54,400 har väsentligen ett par olika möjliga alternativ. 242 00:12:54,400 --> 00:12:56,970 Du kan göra summering med heltal, eller 243 00:12:56,970 --> 00:13:00,870 kan göra strängsammanfogning, och kanske en del andra saker också. 244 00:13:00,870 --> 00:13:05,550 Men om operatören inte känner igen vad som finns på vardera sidan av det, 245 00:13:05,550 --> 00:13:10,452 eller snarare en kombination av de två typer, är inte vad det förväntar sig, 246 00:13:10,452 --> 00:13:11,910 då det kommer att orsaka ett misslyckande. 247 00:13:11,910 --> 00:13:16,690 >> Så i detta fall, vad betyder det att ha en sträng plus ett heltal? 248 00:13:16,690 --> 00:13:18,880 Väl i samband med detta har vi antagligen 249 00:13:18,880 --> 00:13:21,990 att göra en strängsammanfogning operation. 250 00:13:21,990 --> 00:13:26,420 Men naturligtvis datorn har inte den sortens sammanhang. 251 00:13:26,420 --> 00:13:29,950 Och så måste vi ge att ytterligare information 252 00:13:29,950 --> 00:13:32,390 att låta den veta vad det är att vi vill göra. 253 00:13:32,390 --> 00:13:36,860 >> Så med andra ord, det faktum att Swift är starkt skrivit 254 00:13:36,860 --> 00:13:39,520 innebär att du måste göra en lite extra arbete 255 00:13:39,520 --> 00:13:42,100 att få det att manövrera sätt som du vill. 256 00:13:42,100 --> 00:13:43,710 Men som ett resultat, är det säkrare. 257 00:13:43,710 --> 00:13:46,290 Och när du har ta hänsyn till dessa typer, 258 00:13:46,290 --> 00:13:49,300 saker bara uppriktigt börja att fungera ganska bra. 259 00:13:49,300 --> 00:13:52,520 >> Så i detta fall, då skulle vi utföra strängsammanfogning 260 00:13:52,520 --> 00:13:56,040 genom att uttryckligen gjutning heltalet till en sträng 261 00:13:56,040 --> 00:13:58,490 genom att linda det i detta huvudstad S String funktion, 262 00:13:58,490 --> 00:14:03,510 och sedan använda strängsammanfogning operatör att ändra vår etikett variabel, 263 00:14:03,510 --> 00:14:06,280 och sedan skriva ut den. 264 00:14:06,280 --> 00:14:08,420 >> Hittils är det bra? 265 00:14:08,420 --> 00:14:12,020 Okej, låt oss gå vidare. 266 00:14:12,020 --> 00:14:16,300 >> Nu finns det en mängd data typer som vi kan använda i Swift. 267 00:14:16,300 --> 00:14:21,620 Som ni har vant sig, Vi kan skapa en föränderlig array. 268 00:14:21,620 --> 00:14:26,140 Och att matrisen endast kan innehålla en enda typ. 269 00:14:26,140 --> 00:14:30,360 >> Så i det här fallet, kommer vi att skapa ett muterbart arrayer av heltal, som 270 00:14:30,360 --> 00:14:34,800 Vi kommer att ringa betyg, och vi kommer att kunna att lagra det i denna hakparentes 271 00:14:34,800 --> 00:14:38,650 format som du har vant att i en mängd olika andra språk. 272 00:14:38,650 --> 00:14:41,150 Men märker att här är vi definierar ett par saker. 273 00:14:41,150 --> 00:14:45,350 kvaliteter är en föränderlig variable-- Vi använder inte låt sökord. 274 00:14:45,350 --> 00:14:49,620 Så det innebär att vi kan sedan ändra innehållet i denna matris. 275 00:14:49,620 --> 00:14:53,420 Det är av typen Array Int, och vi kan säga att 276 00:14:53,420 --> 00:14:56,260 baserade på dessa hakparenteser här. 277 00:14:56,260 --> 00:14:58,930 >> Nu en av de fina sakerna om detta är att vi 278 00:14:58,930 --> 00:15:02,310 har tillgång till en hel del ytterligare information 279 00:15:02,310 --> 00:15:07,110 om arrayen bara använda några enkla punktnotation. 280 00:15:07,110 --> 00:15:10,500 Så till exempel, grades.count ger oss 281 00:15:10,500 --> 00:15:14,820 antalet objekt som finns i den array, som vi sedan kan komma ganska 282 00:15:14,820 --> 00:15:19,090 lätt att bara använda den punktnotation. 283 00:15:19,090 --> 00:15:21,830 >> Om du vill lägga till ytterligare objekt till denna samling, 284 00:15:21,830 --> 00:15:27,220 du kan inte göra PHP stil där du bara uttryckligen definiera, 285 00:15:27,220 --> 00:15:30,910 vid ett givet index, ett visst värde som du vill infoga. 286 00:15:30,910 --> 00:15:37,210 Använd i stället append metod typen array 287 00:15:37,210 --> 00:15:40,920 att lägga den posten, 95, till denna lista. 288 00:15:40,920 --> 00:15:45,990 >> Så nu denna array har följande contents-- 100, 0, 90, 85. 289 00:15:45,990 --> 00:15:49,270 Och nu har vi bifogat 95 till det också. 290 00:15:49,270 --> 00:15:51,830 >> Det finns andra sätt vi kan lägga saker. 291 00:15:51,830 --> 00:15:55,030 Du kan faktiskt använda en summerings operatör, 292 00:15:55,030 --> 00:15:59,200 som kommer att tolkas som en array append operation. 293 00:15:59,200 --> 00:16:04,680 Och du kan sedan lägga en annan matris, vars innehåll är 70 och 80, 294 00:16:04,680 --> 00:16:05,560 till den arrayen. 295 00:16:05,560 --> 00:16:08,250 Så nu har vi Innehållet i denna variabel 296 00:16:08,250 --> 00:16:17,220 grades-- 100, 0, 90, 85, 95, 70, och 80. 297 00:16:17,220 --> 00:16:21,850 Detta är bara en trevlig liten syntaktiskt socker som Swift ger till oss. 298 00:16:21,850 --> 00:16:23,850 >> Så om vi vill summera kvaliteter, vi är kanske 299 00:16:23,850 --> 00:16:27,340 kommer att vilja upprepa över varje objekt i denna slinga. 300 00:16:27,340 --> 00:16:32,150 Och vi har, i Swift, begreppet av en for-loop som du förväntar dig. 301 00:16:32,150 --> 00:16:35,350 Men det sätt som vi anger ett intervall är något annorlunda. 302 00:16:35,350 --> 00:16:37,790 Så i detta fall, till Sammanfattningsvis allt, vi ska 303 00:16:37,790 --> 00:16:40,650 kommer att skapa en temporär variabel som kallas summa för att vi 304 00:16:40,650 --> 00:16:42,580 att upprätthålla denna räkning. 305 00:16:42,580 --> 00:16:44,430 >> Och lägg märke till vår för loop konstruktion här. 306 00:16:44,430 --> 00:16:46,820 För index 0 .. 00:16:51,480 308 00:16:51,480 --> 00:16:57,390 Så denna konstruktion, 0 .. 00:17:01,860 att säga att vi kommer att skapa en rad heltal från 0 upp 310 00:17:01,860 --> 00:17:05,750 till men exkluderande grades.count. 311 00:17:05,750 --> 00:17:09,577 Så kommer detta att vara 0, 1, 2, 3, 4, 5, fram till men många en 312 00:17:09,577 --> 00:17:10,410 före grades.count. 313 00:17:10,410 --> 00:17:14,160 >> Så det här är annorlunda än hur vi skulle normalt används för loopar 314 00:17:14,160 --> 00:17:18,569 där du skulle ha några index variabel, ställa in den lika med 0 i början, 315 00:17:18,569 --> 00:17:25,480 och sedan integrera dessa tills någon värde mindre än räkningen av objekt 316 00:17:25,480 --> 00:17:27,140 i den arrayen. 317 00:17:27,140 --> 00:17:29,820 >> Så det är en modifiering till detta, faktiskt, 318 00:17:29,820 --> 00:17:35,010 vilket ger oss möjlighet att mycket enkelt ställa in olika typer av intervall. 319 00:17:35,010 --> 00:17:40,570 Om du ändrar detta område för att tre punkter, 0 ... grade.count, 320 00:17:40,570 --> 00:17:45,120 Detta representerar intervallet 0 att grades.count allomfattande, 321 00:17:45,120 --> 00:17:49,260 vilket innebär att detta nummer är också då i detta intervall. 322 00:17:49,260 --> 00:17:52,110 >> Men detta är mycket praktiskt för dessa exakta saker, 323 00:17:52,110 --> 00:17:54,590 när vi måste utföra iterationer över slingan 324 00:17:54,590 --> 00:17:59,630 eftersom dessa index noll indexeras, som vi har sett i andra språk 325 00:17:59,630 --> 00:18:02,360 också. 326 00:18:02,360 --> 00:18:05,210 Eventuella frågor om detta för loop? 327 00:18:05,210 --> 00:18:10,660 >> Så det finns implicit definition av detta index variabel, 328 00:18:10,660 --> 00:18:14,350 vars värde börjar vid 0, och fortsätter vid varje slingiteration 329 00:18:14,350 --> 00:18:17,950 öka med 1 fram till en punkt som är lika med grades.count, 330 00:18:17,950 --> 00:18:20,380 vid vilken punkt, avbryts slingan. 331 00:18:20,380 --> 00:18:23,730 >> Lägg märke till att i vår sträng Interpolation här, 332 00:18:23,730 --> 00:18:26,910 vi faktiskt kan utföra några enkla manipulationer till dessa värden. 333 00:18:26,910 --> 00:18:31,230 Så index plus 1 kommer faktiskt utföra en summering av det värdet 334 00:18:31,230 --> 00:18:34,780 eftersom index är, i detta fall, ett heltal. 335 00:18:34,780 --> 00:18:37,810 Och på den punkten, kommer det sedan omvandlas till en sträng 336 00:18:37,810 --> 00:18:42,230 och interpolerade i strängen här, och skrivas ut som vi skulle förvänta oss. . 337 00:18:42,230 --> 00:18:44,520 >> Och det fina om uppsättningarna här är 338 00:18:44,520 --> 00:18:50,730 att vi också kunna ha Hämtar värden och inställningsvärden 339 00:18:50,730 --> 00:18:54,080 med hjälp av klammer notation som vi har sett i andra språk. 340 00:18:54,080 --> 00:18:57,130 341 00:18:57,130 --> 00:19:01,030 >> Okej, så härifrån, vi nu beräkna vår summan av alla våra kvaliteter. 342 00:19:01,030 --> 00:19:02,780 Nu sorts nästa logiska steg skulle vara 343 00:19:02,780 --> 00:19:07,580 att göra en division operation för att hitta ut genomsnittet av dessa kvaliteter. 344 00:19:07,580 --> 00:19:10,150 Men något viktigt Här händer som 345 00:19:10,150 --> 00:19:15,020 är att denna summa är kanske ett heltal. 346 00:19:15,020 --> 00:19:18,020 Men vi behöver för att utföra vissa sorts dubbel division. 347 00:19:18,020 --> 00:19:20,600 Och detta kommer att bli oerhört viktigt när 348 00:19:20,600 --> 00:19:24,140 Vi vill utföra den här åtgärden, eftersom det vi säger 349 00:19:24,140 --> 00:19:28,430 är att vi måste faktiskt utföra division två dubblar. 350 00:19:28,430 --> 00:19:31,370 Och återigen, eftersom Swift är mycket starkt skrivit, 351 00:19:31,370 --> 00:19:36,760 Vi måste uttryckligen ange alla objekt till dubblar innan vi faktiskt 352 00:19:36,760 --> 00:19:38,300 utföra denna operation. 353 00:19:38,300 --> 00:19:40,550 >> Så för oss att utföra dubbel delning, 354 00:19:40,550 --> 00:19:43,730 det är inte tillräckligt för bara en av dessa objekt att vara en dubbel. 355 00:19:43,730 --> 00:19:46,400 Båda måste vara en dubbel för att snabbt 356 00:19:46,400 --> 00:19:50,860 vara säker på att detta är vad vi vill göra. 357 00:19:50,860 --> 00:19:54,360 Så kommer vi då uttryckligen typecast det belopp som vi har beräknats ovan 358 00:19:54,360 --> 00:19:58,970 och greven av betyg till dubbel, och sedan utföra denna operation och lagra 359 00:19:58,970 --> 00:20:02,390 att i denna nya variabel, eller snarare denna nya konstant kallade genomsnitts, 360 00:20:02,390 --> 00:20:06,810 som kommer att ha vilken typ, ni föreställa er? 361 00:20:06,810 --> 00:20:07,587 Dubbel, ja. 362 00:20:07,587 --> 00:20:09,420 Så i detta fall, vi behöver inte ange det 363 00:20:09,420 --> 00:20:13,450 eftersom det kan härledas från operation vilken typ av data genomsnittet 364 00:20:13,450 --> 00:20:14,730 kommer vara. 365 00:20:14,730 --> 00:20:19,025 Och Swift är i allmänhet ganska bra om att kunna sluta typerna. 366 00:20:19,025 --> 00:20:22,116 367 00:20:22,116 --> 00:20:24,200 >> Vill du se här kör, eller kan jag gå vidare? 368 00:20:24,200 --> 00:20:25,640 Jag vill fortsätta. 369 00:20:25,640 --> 00:20:28,130 Eventuella frågor om något av detta? 370 00:20:28,130 --> 00:20:28,630 Bra. 371 00:20:28,630 --> 00:20:31,160 372 00:20:31,160 --> 00:20:35,010 >> Nu ska vi börja för att komma till de goda stuff-- Definiera funktioner, 373 00:20:35,010 --> 00:20:39,090 och ett par andra typer som är unik för Swift att du inte har 374 00:20:39,090 --> 00:20:41,620 sett i andra språk fram till denna punkt, 375 00:20:41,620 --> 00:20:46,290 men de är närvarande i andra språk som du kan hitta senare. 376 00:20:46,290 --> 00:20:48,210 Så först om du vill att definiera en funktion, 377 00:20:48,210 --> 00:20:52,170 du definiera det med funky ordet funktion, och sedan funktionsnamnet, 378 00:20:52,170 --> 00:20:56,710 och sedan inom parentes, argument som du vill att funktionen att acceptera. 379 00:20:56,710 --> 00:21:00,280 Argumenten måste också specify-- generally-- 380 00:21:00,280 --> 00:21:05,010 måste också ange vilken typ av data som de är, om de inte kan sluta. 381 00:21:05,010 --> 00:21:07,500 Och vi får se det lilla varning på bara en liten bit. 382 00:21:07,500 --> 00:21:09,920 >> Så i det här fallet har vi en funktion som kallas printGradeCount. 383 00:21:09,920 --> 00:21:12,840 Vi kommer att acceptera en variable-- eller snarare i det här fallet, 384 00:21:12,840 --> 00:21:14,450 en constant-- kallas betygsbok. 385 00:21:14,450 --> 00:21:18,517 Och det kommer att vara av typ array av heltal. 386 00:21:18,517 --> 00:21:20,600 Nu finns det något det är verkligen viktigt här 387 00:21:20,600 --> 00:21:21,849 som jag vill att ni ska förstå. 388 00:21:21,849 --> 00:21:27,560 Det är att som standard, dessa argument som är insatsvaror till denna funktion 389 00:21:27,560 --> 00:21:34,380 definieras med en implicit låt sökord, vilket innebär att jag inte kan ändra detta 390 00:21:34,380 --> 00:21:39,850 Betygsbok variabel här. 391 00:21:39,850 --> 00:21:43,360 Och den sortens vettigt, eftersom du passerar data. 392 00:21:43,360 --> 00:21:45,860 Och du kanske inte vill att det ändras från under dig. 393 00:21:45,860 --> 00:21:50,800 Det är möjligt att uttryckligen nämna att detta är en variabel, genom att sätta 394 00:21:50,800 --> 00:21:52,070 nyckelordet var här. 395 00:21:52,070 --> 00:21:56,832 Men det är en gotcha som vi har märkt människor har gjort i det förflutna 396 00:21:56,832 --> 00:21:59,790 är att de antog att det kommer att vara en variabel när i själva verket, det 397 00:21:59,790 --> 00:22:02,640 är en konstant. 398 00:22:02,640 --> 00:22:07,340 >> Okej, så här då, i det här fallet, vi är inte specificera någon typ avkastning. 399 00:22:07,340 --> 00:22:09,460 Vi visar dig hur man gör som på bara ett ögonblick. 400 00:22:09,460 --> 00:22:12,340 Men märker att här har vi bara en enkel om tillstånd. 401 00:22:12,340 --> 00:22:14,560 Om betygsbok är tom, vilket i detta fall 402 00:22:14,560 --> 00:22:19,310 är bara tillhör denna heltal array, sedan skriva vi ut något. 403 00:22:19,310 --> 00:22:23,100 Annars kan vi göra något annat. 404 00:22:23,100 --> 00:22:25,000 >> Ganska enkelt så långt tror jag. 405 00:22:25,000 --> 00:22:27,960 Men stoppa mig om du har några frågor. 406 00:22:27,960 --> 00:22:33,350 >> Nu denna funktion, i genomsnitt, tar också några argument, eller snarare ett argument, 407 00:22:33,350 --> 00:22:37,507 som är den betygsbok, och denna gång kommer att returnera en dubbel typ. 408 00:22:37,507 --> 00:22:39,340 Eftersom det är att beräkna genomsnittet och det är 409 00:22:39,340 --> 00:22:45,010 kommer faktiskt tillbaka det beräknade genomsnittliga till den anropande linjen. 410 00:22:45,010 --> 00:22:50,070 >> I det här fallet, vi anger retur typ efter en pil. 411 00:22:50,070 --> 00:22:53,260 Och detta kan känna lite konstigt i början. 412 00:22:53,260 --> 00:22:55,610 Du har vant att ställa in retur 413 00:22:55,610 --> 00:22:57,720 ange innan namnet på funktionen. 414 00:22:57,720 --> 00:23:00,310 Men om du tänker på detta när det gäller matematik, 415 00:23:00,310 --> 00:23:03,320 som när du har matematik att definiera en funktion, 416 00:23:03,320 --> 00:23:06,807 du har en funktion med vissa ingångar, och den producerar en utsignal. 417 00:23:06,807 --> 00:23:08,890 Och det är precis vad detta är tänkt att efterlikna. 418 00:23:08,890 --> 00:23:12,460 Och det finns ett par andra språk som har liknande syntax samt, 419 00:23:12,460 --> 00:23:15,674 men förmodligen ingen som du har sett i CS50. 420 00:23:15,674 --> 00:23:17,090 Men ändå inte förväxlas med det. 421 00:23:17,090 --> 00:23:21,650 Pilen betyder vad som händer återlämnas i det här fallet. 422 00:23:21,650 --> 00:23:23,650 OK, så hur ska vi att beräkna detta genomsnitt? 423 00:23:23,650 --> 00:23:25,649 Tja, om betygsbok är tom, och då är vi 424 00:23:25,649 --> 00:23:30,731 kommer att återvända 0, som kanske ett rimligt sätt att behandla detta. 425 00:23:30,731 --> 00:23:32,980 Jag vet inte, låt oss komma tillbaka till det i en liten bit. 426 00:23:32,980 --> 00:23:34,688 Detta kan faktiskt inte vara ett rimligt sätt 427 00:23:34,688 --> 00:23:38,310 att beräkna ett genomsnitt om vi har en tom betygsbok. 428 00:23:38,310 --> 00:23:41,260 >> Då kommer vi bara göra vårt summering. 429 00:23:41,260 --> 00:23:43,900 Lägg märke till att vi här faktiskt har en alternativ version av en 430 00:23:43,900 --> 00:23:49,190 for-loop, som tillåter oss att iterera över varje enskilt objekt i en array 431 00:23:49,190 --> 00:23:53,630 och placera varje element in i dess egen variabel. 432 00:23:53,630 --> 00:23:56,200 Genom att ange för betyg i betygsbok, vad vi säger 433 00:23:56,200 --> 00:24:00,560 är att vi kommer att implicit skapa en ny konstant kallas 434 00:24:00,560 --> 00:24:05,180 klass som kommer att representera varje unikt objekt i betygsbok 435 00:24:05,180 --> 00:24:06,769 varje gång som för sling itererar. 436 00:24:06,769 --> 00:24:08,560 Så första gången som det körs, grad kommer 437 00:24:08,560 --> 00:24:09,800 vara det första objektet i betygsbok. 438 00:24:09,800 --> 00:24:12,300 Andra gången det ska vara andra punkten, så vidare och så vidare 439 00:24:12,300 --> 00:24:15,970 tills betygsbok har uttömt sig av element. 440 00:24:15,970 --> 00:24:20,390 Då kommer vi att kunna sammanfatta att kvalitet i våra summer variabel 441 00:24:20,390 --> 00:24:22,570 och tillbaka vår genomsnittliga som vi har sett förut. 442 00:24:22,570 --> 00:24:25,670 443 00:24:25,670 --> 00:24:26,950 OK, några frågor? 444 00:24:26,950 --> 00:24:27,699 Ja? 445 00:24:27,699 --> 00:24:28,990 PUBLIK: Jag har två frågor. 446 00:24:28,990 --> 00:24:33,586 Nummer ett, hypotetiskt, kan du kör heltal på den här? 447 00:24:33,586 --> 00:24:35,604 Behöver inte vara en dubbel, är det korrekt? 448 00:24:35,604 --> 00:24:37,520 DAN AMRMENDARIZ: Kan du upprepa den frågan? 449 00:24:37,520 --> 00:24:39,587 PUBLIK: Kan jag göra heltal som genomsnittet? 450 00:24:39,587 --> 00:24:41,670 DAN AMRMENDARIZ: Kan du gör heltal som ett genomsnitt? 451 00:24:41,670 --> 00:24:45,015 Så returnera ett heltal genomsnitt i stället för en dubbel? 452 00:24:45,015 --> 00:24:48,204 >> PUBLIK: Return-- dig har det just nu nedan. 453 00:24:48,204 --> 00:24:49,870 DAN AMRMENDARIZ: Just här, tillbaka 0,0? 454 00:24:49,870 --> 00:24:51,790 Målgrupp: Ja, bara åter 0. 455 00:24:51,790 --> 00:24:56,590 Så det kommer att bli antingen 80 eller 85, men inte 85,2. 456 00:24:56,590 --> 00:24:59,465 >> DAN AMRMENDARIZ: Så i det fallet, så det finns ett par olika sätt 457 00:24:59,465 --> 00:25:00,090 att svara på det. 458 00:25:00,090 --> 00:25:02,760 Låt mig svara på dem i ordning. 459 00:25:02,760 --> 00:25:06,740 Så om jag gör just denna återgång 0, en 0 är ett heltalsvärde. 460 00:25:06,740 --> 00:25:09,730 Och så som kommer att orsaka en Typ fel i detta fall 461 00:25:09,730 --> 00:25:13,210 eftersom det väntar en dubbel men därefter återvänder ett heltal. 462 00:25:13,210 --> 00:25:16,770 Om jag vill returnera ett heltal, jag kan. 463 00:25:16,770 --> 00:25:20,450 Jag kan ställa in returtypen att int tillbaka 0 här, 464 00:25:20,450 --> 00:25:22,047 och inte utföra dubbel division. 465 00:25:22,047 --> 00:25:23,880 Men då skulle vi vara göra heltalsdivision. 466 00:25:23,880 --> 00:25:27,080 Och så vi då inte skulle få genomsnitt som vi möjligen skulle förvänta sig. 467 00:25:27,080 --> 00:25:29,210 Men ja vi kan ändra typerna på det sättet. 468 00:25:29,210 --> 00:25:32,598 >> PUBLIK: Och för det andra, du har en dubbel på toppen. 469 00:25:32,598 --> 00:25:35,502 Men nere, när du gör åter Double Double, 470 00:25:35,502 --> 00:25:38,280 som redan automatiskt återvända Dubbel-format. 471 00:25:38,280 --> 00:25:42,278 Varför tror du fortfarande behöver definiera den med pil på toppen med en dubbel? 472 00:25:42,278 --> 00:25:45,010 >> DAN AMRMENDARIZ: Så i fall är denna del 473 00:25:45,010 --> 00:25:50,580 av the-- så att upprepa frågan, eftersom det är underförstått från retur 474 00:25:50,580 --> 00:25:56,030 typer här, vilken typ detta faktiskt är, måste vi vara tydliga med Swift 475 00:25:56,030 --> 00:25:59,970 om vad vi vill tillbaka av denna funktion 476 00:25:59,970 --> 00:26:02,690 så att när det utför typ kontroll, kan det se till att 477 00:26:02,690 --> 00:26:05,850 att det vi faktiskt har skrivit nere faktiskt överensstämmer med denna. 478 00:26:05,850 --> 00:26:10,225 Så det är ungefär som en kontroll med dig själv typ av situation. 479 00:26:10,225 --> 00:26:11,050 Men det är-- 480 00:26:11,050 --> 00:26:12,560 >> PUBLIK: [OHÖRBAR] arrow? 481 00:26:12,560 --> 00:26:19,490 >> DAN AMRMENDARIZ: Det finns fall när Vi kan ange att vi kan underförstått 482 00:26:19,490 --> 00:26:21,550 Ställ in returtypen. 483 00:26:21,550 --> 00:26:23,940 Men i det här fallet, det gör jag inte tror att det skulle fungera. 484 00:26:23,940 --> 00:26:26,190 Det finns en annan syntax att vi kommer att se senare. 485 00:26:26,190 --> 00:26:30,320 486 00:26:30,320 --> 00:26:35,280 >> Okej, så denna källa kod är lite annorlunda 487 00:26:35,280 --> 00:26:41,839 eftersom detta tolkar argument från den funktion som vi kallar. 488 00:26:41,839 --> 00:26:44,130 Låt mig visa dig hur det fungerar innan vi faktiskt går vidare 489 00:26:44,130 --> 00:26:48,050 till en del intressanta saker som händer i Swift. 490 00:26:48,050 --> 00:26:51,870 >> Så i detta fall, om jag kör just detta kod, notera att vad den gör 491 00:26:51,870 --> 00:26:54,900 är-- medan det slags ger mig en konstig fel. 492 00:26:54,900 --> 00:26:59,730 Jag måste ge det ett par heltal som en kommandorad argument. 493 00:26:59,730 --> 00:27:06,220 Så låt oss se, 150 och 80, och tryck Enter att ta reda på vad det faktiskt gör. 494 00:27:06,220 --> 00:27:09,890 Det är att acceptera varje dessa värden som heltal. 495 00:27:09,890 --> 00:27:12,040 Det är inmatning av dem i en betygsbok. 496 00:27:12,040 --> 00:27:14,470 Och då är det utför att genomsnittsberäkning 497 00:27:14,470 --> 00:27:16,650 och utmatning det som vi skulle förvänta oss. 498 00:27:16,650 --> 00:27:19,950 >> Men självklart finns det något på gång med detta förkasta något 499 00:27:19,950 --> 00:27:23,300 något som ett heltal. 500 00:27:23,300 --> 00:27:27,300 Som ni kanske kommer ihåg från när vi var behandlar kommandoradsargument 501 00:27:27,300 --> 00:27:32,640 i C och andra språk, den allra första 0: te post i den Kommandoradsargumentet 502 00:27:32,640 --> 00:27:35,774 Listan är namnet på kommandot att vi faktiskt utförs. 503 00:27:35,774 --> 00:27:38,690 Så i detta fall, jag bara looping över alla kommandoradsargumenten de. 504 00:27:38,690 --> 00:27:41,650 Men jag tänker inte göra någon slags fancy Kontrollera att hoppa över det första. 505 00:27:41,650 --> 00:27:45,920 Jag är bara uttryckligen eller jag är underförstått kontrollera vilken av dessa typer 506 00:27:45,920 --> 00:27:49,900 är heltal innan jag faktiskt utföra denna beräkning. 507 00:27:49,900 --> 00:27:52,420 >> Och det är i huvudsak vad som händer här. 508 00:27:52,420 --> 00:27:55,860 För varje argument process argument, 509 00:27:55,860 --> 00:27:59,210 Jag kommer att utföra vissa check. 510 00:27:59,210 --> 00:28:01,970 Och i detta fall, jag ska för att försöka att först omvandla 511 00:28:01,970 --> 00:28:07,620 detta argument i ett heltal av utföra en explicit typecast, 512 00:28:07,620 --> 00:28:12,310 eftersom det är på ingång, en sträng och i själva verket inte ett heltal. 513 00:28:12,310 --> 00:28:18,140 >> Men det är lite av en konstig syntax, Om låt grad lika Int (argument). 514 00:28:18,140 --> 00:28:21,120 Vad är det egentligen som händer här är extremt 515 00:28:21,120 --> 00:28:24,390 viktigt för din hjälp av Swift. 516 00:28:24,390 --> 00:28:27,610 Detta använder vad som är kallas en valfri typ. 517 00:28:27,610 --> 00:28:34,790 >> Så denna funktion, Int (argument), returnerar inte bara ett heltal, men återvänder 518 00:28:34,790 --> 00:28:37,470 vad som kallas ett valfritt heltal. 519 00:28:37,470 --> 00:28:41,200 Och så detta är typ av en typ på toppen av en typ. 520 00:28:41,200 --> 00:28:45,900 Du kan sorts tänka mig att det som det är tillbaka som ett paket. 521 00:28:45,900 --> 00:28:47,750 Och när du öppnar det paket, den antingen 522 00:28:47,750 --> 00:28:53,930 har ett heltal, som är resultatet, eller Det har absolut ingenting i det alls. 523 00:28:53,930 --> 00:28:58,140 Och detta är användbar som en felkontroll mekanism, eftersom i detta fall 524 00:28:58,140 --> 00:29:02,080 vi kan ta reda på, var detta typkonvertering framgångsrik? 525 00:29:02,080 --> 00:29:05,810 Om det var, då det i själva verket kommer att ha ett heltal inuti. 526 00:29:05,810 --> 00:29:08,750 Annars kommer att ha någon värde som vi kallar noll, vilket 527 00:29:08,750 --> 00:29:10,920 är representativ för någon heltal alls. 528 00:29:10,920 --> 00:29:13,270 Det är verkligen representativt för ingenting. 529 00:29:13,270 --> 00:29:18,130 >> Och så detta om byggandet tillåter oss att packa det paketet, 530 00:29:18,130 --> 00:29:19,850 som tillval bindning. 531 00:29:19,850 --> 00:29:25,560 Och om vi kan packa att paketera och hitta ett heltal inne, 532 00:29:25,560 --> 00:29:27,720 vad vi säger här är att vi kommer då 533 00:29:27,720 --> 00:29:33,090 tillåter detta värde ställas in denna konstant heter klass. 534 00:29:33,090 --> 00:29:36,590 Och denna del av if, den övre delen av if 535 00:29:36,590 --> 00:29:40,390 kommer att köra, eftersom det Packa lyckades. 536 00:29:40,390 --> 00:29:43,290 >> Om det råkar vara så att Det uppstod ett fel kanske 537 00:29:43,290 --> 00:29:47,040 i detta explicit typomvandling från en sträng till ett heltal, kanske 538 00:29:47,040 --> 00:29:49,160 Det är värdet ABC till exempel. 539 00:29:49,160 --> 00:29:52,120 Och det är faktiskt inte kommer konvertera till ett heltal. 540 00:29:52,120 --> 00:29:55,520 Då återkommer noll, vilket inte är ett heltal. 541 00:29:55,520 --> 00:29:57,570 Och detta if-sats väl sedan misslyckas. 542 00:29:57,570 --> 00:30:01,930 Betyget inte existerar på grund det har ingen heltal innehåll. 543 00:30:01,930 --> 00:30:06,391 Och det kommer att köra andra blocket istället. 544 00:30:06,391 --> 00:30:06,890 Ja? 545 00:30:06,890 --> 00:30:09,652 >> PUBLIK: Nil är N-I-L? 546 00:30:09,652 --> 00:30:11,110 DAN AMRMENDARIZ: noll är N-I-L, ja. 547 00:30:11,110 --> 00:30:14,970 548 00:30:14,970 --> 00:30:20,310 >> Så det här är kanske en av de svåraste sakerna med Swift, 549 00:30:20,310 --> 00:30:23,690 särskilt när du är i ogräset på en iOS-app 550 00:30:23,690 --> 00:30:27,442 och du faktiskt försöker att göra en del utveckling där. 551 00:30:27,442 --> 00:30:29,400 Det kommer att skrika på dig om frivillig. 552 00:30:29,400 --> 00:30:33,050 Det kommer att be dig för frågetecken och utropstecken. 553 00:30:33,050 --> 00:30:37,100 Men när du räkna out-- om du ägna lite tid att räkna ut 554 00:30:37,100 --> 00:30:41,990 vad som händer med valfria typer du kommer att spara dig en hel del huvudvärk 555 00:30:41,990 --> 00:30:46,040 som du försöker skriva en app i Swift. 556 00:30:46,040 --> 00:30:47,660 >> Det är faktiskt en mycket kraftfull funktion. 557 00:30:47,660 --> 00:30:49,826 Och du bara måste ta mitt ord för det nu. 558 00:30:49,826 --> 00:30:52,620 Men vi får se denna konstruktion och några andra gillar det 559 00:30:52,620 --> 00:30:56,740 i några av de andra källkod som visar vi dig bara lite. 560 00:30:56,740 --> 00:31:00,440 >> Finns det några inledande frågor här? 561 00:31:00,440 --> 00:31:03,790 562 00:31:03,790 --> 00:31:08,690 Så den viktiga takeaway är att en valfri typ är en slags metatyp. 563 00:31:08,690 --> 00:31:12,500 Det antingen har ett värde, och om den gör det, så är det 564 00:31:12,500 --> 00:31:18,110 kanske får detta värde associerat med det, eller det har inget värde alls, 565 00:31:18,110 --> 00:31:19,620 och representeras av noll. 566 00:31:19,620 --> 00:31:24,210 567 00:31:24,210 --> 00:31:28,870 Resten av detta är kanske som du förväntar dig. 568 00:31:28,870 --> 00:31:32,900 >> Så låt oss ramp upp svårighet ännu en gång. 569 00:31:32,900 --> 00:31:37,070 Och den här gången, låt oss ta en titt på några andra datatyper som faktiskt existerar. 570 00:31:37,070 --> 00:31:41,290 En av dem är ordböcker, som är mycket lik Python ordböcker. 571 00:31:41,290 --> 00:31:48,270 Det är något som liknar en hashtabell i C. Den är väsentligen en kartläggning av nycklar 572 00:31:48,270 --> 00:31:49,820 där nycklar kan vara strängar. 573 00:31:49,820 --> 00:31:52,670 Och när man tittar upp dessa nycklar, dessa nycklar kommer att ha ett värde. 574 00:31:52,670 --> 00:31:56,020 Så det är inte riktigt en matris, men I stället knytas närmare 575 00:31:56,020 --> 00:31:58,810 till en hash karta eller en hashtabell. 576 00:31:58,810 --> 00:32:02,420 >> Låt oss se hur detta är tänkt att arbeta innan vi faktiskt 577 00:32:02,420 --> 00:32:05,210 gå in i källkoden själv. 578 00:32:05,210 --> 00:32:07,680 Om jag kör just detta, ingenting händer verkligen. 579 00:32:07,680 --> 00:32:12,430 Det talar om för mig att jag väntar vissa parametrar av följande typ. 580 00:32:12,430 --> 00:32:16,050 Så jag kommer att ge till det vissa problem sätta namn, 581 00:32:16,050 --> 00:32:18,490 så pset0, kanske fick jag 100. 582 00:32:18,490 --> 00:32:20,790 Och pset1, fick jag en 5. 583 00:32:20,790 --> 00:32:24,630 Och sedan på tentan, jag gjorde riktigt bra och fick 30. 584 00:32:24,630 --> 00:32:27,180 Och oops, slog jag en plats här. 585 00:32:27,180 --> 00:32:30,940 >> När jag slog in, kan du se utför någon beräkning. 586 00:32:30,940 --> 00:32:33,740 Det säger betygsbok är tre kvaliteter, pset1, pset0, examen. 587 00:32:33,740 --> 00:32:36,120 Och betygsbok har detta specifika genomsnitt. 588 00:32:36,120 --> 00:32:38,370 Så återigen, vi arbetar med denna betygsbok idé, 589 00:32:38,370 --> 00:32:44,650 men vi kommer att fortsätta iteration med komplexiteten i vår funktion. 590 00:32:44,650 --> 00:32:47,650 >> Så i början, vi är bara kommer att skapa en funktion som 591 00:32:47,650 --> 00:32:49,390 är ansvarig för att skriva ut användningen. 592 00:32:49,390 --> 00:32:51,920 Och det finns denna utgång funktion som kommer bara 593 00:32:51,920 --> 00:32:53,710 våld avsluta programmet. 594 00:32:53,710 --> 00:32:56,530 Detta är inte något som du kommer att använda i iOS-app. 595 00:32:56,530 --> 00:32:59,750 Detta är bara i detta fall, med en kommandorad argument. 596 00:32:59,750 --> 00:33:01,990 Nästa börjar vi på väg mot Xcode. 597 00:33:01,990 --> 00:33:07,760 Men detta är specifik för ett kommando linjestil program i Swift. 598 00:33:07,760 --> 00:33:11,490 >> Låt oss ta en titt på några av intressanta saker här. 599 00:33:11,490 --> 00:33:15,150 Låt oss se, bara ett par intressanta saker att nämna kanske 600 00:33:15,150 --> 00:33:19,930 är att i min funktion utskrift antalet betyg, 601 00:33:19,930 --> 00:33:26,090 Du kanske kommer ihåg att jag hade den listan av items-- pset1, pset0 och tentamen. 602 00:33:26,090 --> 00:33:29,130 Du kan faktiskt snabbt och enkelt göra detta 603 00:33:29,130 --> 00:33:34,490 genom att ta betygsbok, som är en lexikon som har nycklar och värden. 604 00:33:34,490 --> 00:33:38,730 Hitta alla av de viktigaste är genom den punkttangenterna metoden här, 605 00:33:38,730 --> 00:33:43,180 och sedan använda detta joinWithSeparator, som sedan kommer att ta alla nycklar 606 00:33:43,180 --> 00:33:48,590 att vi hade skrivit in, pset1-- eller ledsen, pset0, pset1 och exam-- 607 00:33:48,590 --> 00:33:53,030 och sammanfoga dem tillsammans med ett komma och ett blanksteg 608 00:33:53,030 --> 00:33:55,400 att skapa en lång sträng. 609 00:33:55,400 --> 00:34:00,190 Detta anslutningsåtgärd är bara fenomenalt användbara i en mängd olika sammanhang. 610 00:34:00,190 --> 00:34:03,450 Och så är det här joinWithSeparator. 611 00:34:03,450 --> 00:34:06,939 >> Och det är en sak som är ändrats från Swift 1 till Swift 2. 612 00:34:06,939 --> 00:34:08,730 Det brukade vara en Python style-- om du är 613 00:34:08,730 --> 00:34:13,219 förtrogen med Python-- en Python stil gå metod på strängar. 614 00:34:13,219 --> 00:34:15,699 Men det är inte längre fallet i Swift 2. 615 00:34:15,699 --> 00:34:19,400 Du vill använda detta om du vill att sammanfoga en rad saker 616 00:34:19,400 --> 00:34:23,380 tillsammans med en sträng. 617 00:34:23,380 --> 00:34:27,889 >> Så kanske då i vår diskussion av genomsnittet före, 618 00:34:27,889 --> 00:34:32,659 det gör lite mer meningsfullt för oss att sätta den genomsnittliga funktion 619 00:34:32,659 --> 00:34:36,610 att vara en valfri dubbel snarare än bara en explicit dubbel. 620 00:34:36,610 --> 00:34:39,239 Eftersom vi hade att ovanligt tillstånd där, 621 00:34:39,239 --> 00:34:41,550 tänk om betygsbok faktiskt har några värden i det? 622 00:34:41,550 --> 00:34:44,280 Vad ska den genomsnittliga avkastningen? 623 00:34:44,280 --> 00:34:46,350 >> Väl kanske i C du skulle ha gjort något 624 00:34:46,350 --> 00:34:50,040 liknande tillhandahålls en vaktpost värde, som 0.0, eller kanske ett negativt tal, 625 00:34:50,040 --> 00:34:53,690 eller något bara representerar det faktum att det fanns något fel skick 626 00:34:53,690 --> 00:34:57,910 och du kanske inte egentligen har förmågan att beräkna detta genomsnitt. 627 00:34:57,910 --> 00:35:05,590 Jo skönhet specificera en valfri typ skulle vara att göra det. 628 00:35:05,590 --> 00:35:09,540 Och jag säger nu alla dessa ord, men detta faktiskt inte använder optionals. 629 00:35:09,540 --> 00:35:12,970 Men vi ser att på bara minuter där vi kan ställa in genomsnittlig 630 00:35:12,970 --> 00:35:17,230 att vara en typ valfri data så att om det faktiskt returnerar vissa data, sedan 631 00:35:17,230 --> 00:35:18,470 Vi kommer att återkomma dessa uppgifter. 632 00:35:18,470 --> 00:35:20,570 Annars kommer vi att återkomma noll, säger att detta 633 00:35:20,570 --> 00:35:22,200 har ingen meningsfull beräkning. 634 00:35:22,200 --> 00:35:25,650 635 00:35:25,650 --> 00:35:28,570 >> Låt oss gå vidare till något annat. 636 00:35:28,570 --> 00:35:35,910 Så härifrån, vi har letat på alla dessa exempel på kommandoraden. 637 00:35:35,910 --> 00:35:39,470 Men egentligen vad du tänker att ha att göra med är Xcode. 638 00:35:39,470 --> 00:35:43,720 Och en av de fina sakerna Xcode är, och specifikt i Swift, 639 00:35:43,720 --> 00:35:47,450 är att vi har denna som kallas en lekplats. 640 00:35:47,450 --> 00:35:51,470 Och en lekplats är inte alls en iOS-app. 641 00:35:51,470 --> 00:35:54,751 Men det kan du experimentera med Swift på ett mycket enkelt sätt. 642 00:35:54,751 --> 00:35:56,000 Du kan skriva all din kod. 643 00:35:56,000 --> 00:35:58,140 Det är snyggt syntax lyfts fram här. 644 00:35:58,140 --> 00:36:01,600 När du skapar en ny fil, kommer den att be om du vill skapa en lekplats. 645 00:36:01,600 --> 00:36:08,720 Men det fina med lekstugan är det till höger om ditt fönster, 646 00:36:08,720 --> 00:36:12,020 gör det faktiskt visa dig utdata från din kod. 647 00:36:12,020 --> 00:36:16,110 Så om jag bläddra ner, kan vi se vad utsignalen från olika rader kod 648 00:36:16,110 --> 00:36:17,200 faktiskt råkar vara. 649 00:36:17,200 --> 00:36:19,850 650 00:36:19,850 --> 00:36:26,790 >> Så i detta fall, ska vi byta riktning bara lite 651 00:36:26,790 --> 00:36:30,960 och prata om någonting som verkligen viktigt att denna höga nivå sätt 652 00:36:30,960 --> 00:36:34,020 att Swift fungerar, och det är denna idé om nedläggningar. 653 00:36:34,020 --> 00:36:36,960 Och du har förmodligen sett detta lite i JavaScript. 654 00:36:36,960 --> 00:36:40,770 För er som är i CS50, nedläggningar 655 00:36:40,770 --> 00:36:47,240 är mycket populära, mycket bra sätt att göra hög nivå saker i moderna språk. 656 00:36:47,240 --> 00:36:50,270 Men det är också typ av svårt att linda huvudet runt den första gången. 657 00:36:50,270 --> 00:36:52,269 Så om du tittar på detta första gången, det är OK. 658 00:36:52,269 --> 00:36:56,740 Titta bara på källkoden och se Om du kan räkna ut hemma. 659 00:36:56,740 --> 00:37:01,050 >> Så i detta fall, låt oss säga att vi vill skapa en hel del exponenter 660 00:37:01,050 --> 00:37:04,134 med något fast värde. 661 00:37:04,134 --> 00:37:05,800 Så i detta fall jag kan skapa en funktion. 662 00:37:05,800 --> 00:37:09,270 Jag kommer att kalla det makt 2 vars enda syfte i livet 663 00:37:09,270 --> 00:37:15,770 är att ta lite input och dubbel den och returnera det värdet. 664 00:37:15,770 --> 00:37:21,210 Lägg märke till att här är jag acceptera en typ av data. 665 00:37:21,210 --> 00:37:23,137 Det kommer att vara en variabel som heter x. 666 00:37:23,137 --> 00:37:23,970 Det är av typen Double. 667 00:37:23,970 --> 00:37:26,190 Och jag kommer att återvända en dubbel här. 668 00:37:26,190 --> 00:37:29,100 Och jag ska bara göra en mycket, ärligt talat, ganska 669 00:37:29,100 --> 00:37:32,650 naiva sätt att fördubbla detta värde. 670 00:37:32,650 --> 00:37:35,600 Och jag ska visa dig varför detta är användbar på bara en sekund. 671 00:37:35,600 --> 00:37:40,418 >> Lägg märke till att vi här har detta område igen. efter något i ett, dot 672 00:37:40,418 --> 00:37:44,130 dot dot, 2, vilket innebär att denna slinga kommer att köras två gånger. 673 00:37:44,130 --> 00:37:46,480 Men detta är en dummyvariabel. 674 00:37:46,480 --> 00:37:49,650 Det betyder att jag inte verkligen kommer att att använda denna variabel som helst 675 00:37:49,650 --> 00:37:51,070 insidan av denna slinga. 676 00:37:51,070 --> 00:37:55,380 Jag vill bara denna linje kod för att köra två gånger, 677 00:37:55,380 --> 00:37:58,980 utan att behöva känna värdet av detta intervall. 678 00:37:58,980 --> 00:38:02,570 >> Så i detta fall jag kör resultat gånger på x två gånger, som i huvudsak 679 00:38:02,570 --> 00:38:06,560 innebär att jag kvadratur detta värde. 680 00:38:06,560 --> 00:38:10,230 Och det händer fungerar som vi skulle förvänta oss. 681 00:38:10,230 --> 00:38:16,410 Power of 2, passerar ett värde av 2.0 ger oss en effekt på 4. 682 00:38:16,410 --> 00:38:18,810 3.2 fungerar för 10,24. 683 00:38:18,810 --> 00:38:22,660 >> Nu kan vi göra en liknande sak för makt 3. 684 00:38:22,660 --> 00:38:25,330 Men nu bara ändra sortimentet. 685 00:38:25,330 --> 00:38:28,840 För dummy variabel i en genom tre, multiplicera 3 gånger, 686 00:38:28,840 --> 00:38:29,830 och göra samma sak. 687 00:38:29,830 --> 00:38:32,240 >> Så detta kan kännas lite krystat. 688 00:38:32,240 --> 00:38:34,270 Men det finns en viktig sak här som 689 00:38:34,270 --> 00:38:37,770 är att titta på dessa två funktioner, det finns 690 00:38:37,770 --> 00:38:43,600 bara en sak som är annorlunda, vilket är värdet i intervallet. 691 00:38:43,600 --> 00:38:46,910 Allt annat om dessa två funktioner, makt 3 och makt 2, 692 00:38:46,910 --> 00:38:50,440 är i själva verket, identiska, eftersom de fungerar på samma sätt. 693 00:38:50,440 --> 00:38:53,460 >> Så på denna punkt, lite alarmklocka ska gå ut. 694 00:38:53,460 --> 00:38:56,200 Förhoppningsvis vad du säger, du vet, känns det lite 695 00:38:56,200 --> 00:38:59,250 som dubbelarbete. 696 00:38:59,250 --> 00:39:02,950 Kanske finns det ett sätt som jag skulle kunna inkapsla allt detta 697 00:39:02,950 --> 00:39:06,630 och tillhandahålla en funktion eller skapa en funktion som 698 00:39:06,630 --> 00:39:11,550 gör precis vad jag vill utan behöva skriva ut det explicit. 699 00:39:11,550 --> 00:39:15,732 Och detta är vad makt i en nedläggnings tillåter oss att göra. 700 00:39:15,732 --> 00:39:16,940 Så låt oss ta en titt på detta. 701 00:39:16,940 --> 00:39:18,700 Och jag kommer att tillbringa ett par minuter på detta, eftersom detta 702 00:39:18,700 --> 00:39:20,310 är ganska viktigt för Swift. 703 00:39:20,310 --> 00:39:22,900 Vi ser detta hela tiden. 704 00:39:22,900 --> 00:39:24,550 Vi kommer att definiera en funktion. 705 00:39:24,550 --> 00:39:26,380 Det kommer att kallas powerOf. 706 00:39:26,380 --> 00:39:29,470 Det kommer att acceptera en parameter kallas y av typen Int. 707 00:39:29,470 --> 00:39:32,220 Men ta en titt på returtypen. 708 00:39:32,220 --> 00:39:38,730 Returtypen är, i parenteser, Double arrow Double. 709 00:39:38,730 --> 00:39:43,370 Vilket innebär att denna funktion, denna funktion powerOf, 710 00:39:43,370 --> 00:39:46,550 återvänder en funktion. 711 00:39:46,550 --> 00:39:50,845 Det är att acceptera en dubbel och returnera en dubbel. 712 00:39:50,845 --> 00:39:53,720 Så det kanske låter slags galen, men låt oss rulla ner lite 713 00:39:53,720 --> 00:39:55,060 och titta för att se vad som händer. 714 00:39:55,060 --> 00:39:57,910 Vi är inne i denna funktion powerOf. 715 00:39:57,910 --> 00:40:00,760 Vi skapar en ny funktion kallas exponentiatorn, 716 00:40:00,760 --> 00:40:02,900 men det spelar ingen roll vad det är. 717 00:40:02,900 --> 00:40:06,410 >> Lägg märke till att detta har ett ingångsvärde för x. 718 00:40:06,410 --> 00:40:09,910 Och det tar i en dubbel och returnera en dubbel. 719 00:40:09,910 --> 00:40:16,320 Och det är samma kod som vi såg ovan, med undantag av att värdet 2 720 00:40:16,320 --> 00:40:20,060 eller värdet av tre, som övre bundet i detta intervall, 721 00:40:20,060 --> 00:40:23,210 har ersatts med detta värde på y, som 722 00:40:23,210 --> 00:40:27,230 var den initiala parametern av vår powerOf funktion. 723 00:40:27,230 --> 00:40:31,700 Och vid denna punkt, vi retur exponentiatorn. 724 00:40:31,700 --> 00:40:33,345 Vi tillbaka funktionen. 725 00:40:33,345 --> 00:40:36,300 726 00:40:36,300 --> 00:40:39,550 >> Det är ungefär som en liten sinne blåser. 727 00:40:39,550 --> 00:40:44,360 Men låt oss föreställa oss vad som händer när jag ringer denna funktion powerOf 728 00:40:44,360 --> 00:40:47,610 och passerar in i det något värde som 2. 729 00:40:47,610 --> 00:40:50,020 Vad detta innebär är att Jag har nu värdet 730 00:40:50,020 --> 00:40:55,130 2 för y, vilket betyder att detta värde y i denna exponentiator funktion 731 00:40:55,130 --> 00:40:56,410 blir att värdet 2. 732 00:40:56,410 --> 00:41:01,290 Men jag återvänder här exponentiatorn funktion. 733 00:41:01,290 --> 00:41:05,900 >> Så märke till vad Swift säger att jag har skapat i detta fall. 734 00:41:05,900 --> 00:41:10,550 Låt torget en definition, är det en funktion som accepterar en dubbel 735 00:41:10,550 --> 00:41:12,610 och returnerar en dubbel. 736 00:41:12,610 --> 00:41:16,590 Jag har skapat en funktion att rutor något 737 00:41:16,590 --> 00:41:19,782 med hjälp av denna mekanism här. 738 00:41:19,782 --> 00:41:22,490 Och verkligen vad som händer är att det återvänder denna funktion 739 00:41:22,490 --> 00:41:26,390 exponentiatorn, men detta värde y är insvept inuti den. 740 00:41:26,390 --> 00:41:31,080 Och så nu varje gång jag använder den här variabel eller denna konstant heter 741 00:41:31,080 --> 00:41:35,180 kvadrat, det är det kommer att bete sig som en funktion. 742 00:41:35,180 --> 00:41:39,960 Och så jag kan sedan ringa den variabeln som jag skulle vilja kalla en funktion, 743 00:41:39,960 --> 00:41:43,830 och passera in i det ett nummer, som i detta fall 3. 744 00:41:43,830 --> 00:41:45,910 Och jag kommer då torget detta värde. 745 00:41:45,910 --> 00:41:53,340 Så 3 kvadrat kommer då blir 9, som vi kan se här. 746 00:41:53,340 --> 00:41:56,530 >> Riktigt galen, men detta nu ger mig möjlighet 747 00:41:56,530 --> 00:41:59,040 att skapa andra powerOf funktioner. 748 00:41:59,040 --> 00:42:03,680 Som jag kan säga, OK, och nu vill jag att skapa en ny funktion, powerOf (3), 749 00:42:03,680 --> 00:42:06,290 och lagra det till en konstant kallas kub. 750 00:42:06,290 --> 00:42:10,220 Och nu kuben kommer att bli en separat funktion som kommer därefter 751 00:42:10,220 --> 00:42:14,800 ta lite värde som indata och kub som värde som vi kan se i den nedersta raden 752 00:42:14,800 --> 00:42:16,420 här. 753 00:42:16,420 --> 00:42:18,590 kub på 2 kommer att resultera i 8. 754 00:42:18,590 --> 00:42:21,330 755 00:42:21,330 --> 00:42:22,680 >> Förhoppningsvis ganska snyggt grejer. 756 00:42:22,680 --> 00:42:25,920 Du har aldrig sett det här förut. 757 00:42:25,920 --> 00:42:29,990 Jag uppmuntrar dig att undersöka nedläggningar och undersöka detta lite mer. 758 00:42:29,990 --> 00:42:33,570 Det är verkligen kraftfulla saker ser vi en hel del i JavaScript och några andra språk. 759 00:42:33,570 --> 00:42:37,160 Det är verkligen viktigt att förstå API: er samt 760 00:42:37,160 --> 00:42:38,620 att vi kommer att få i bara en sekund. 761 00:42:38,620 --> 00:42:39,456 Ja? 762 00:42:39,456 --> 00:42:43,740 >> PUBLIK: När du gör powerOf (2), parentes, och sedan 763 00:42:43,740 --> 00:42:48,764 annan parentes, en annan input-- du i princip ersätta torget. 764 00:42:48,764 --> 00:42:50,930 DAN AMRMENDARIZ: Så ser i allra sista raden här. 765 00:42:50,930 --> 00:42:55,930 Det är faktiskt helt möjligt att gör det kedja som ni föreslog. 766 00:42:55,930 --> 00:43:00,990 Så powerOf (5) innebär att vi ska att ha en exponentiator av 5 upp här. 767 00:43:00,990 --> 00:43:04,160 Så det här är i huvudsak kommer att vara samma sak som 4 till femte makten, 768 00:43:04,160 --> 00:43:07,200 eftersom vi har skapat en exponentierande fungera till den femte makten, 769 00:43:07,200 --> 00:43:09,920 och vi passerar in som fungerar värdet 4. 770 00:43:09,920 --> 00:43:12,619 Och vi får detta värde att vi förväntar oss, 1024. 771 00:43:12,619 --> 00:43:14,785 PUBLIK: Och det är inte en namn, så det gör det lättare 772 00:43:14,785 --> 00:43:16,570 att läsa, torget oavsett. 773 00:43:16,570 --> 00:43:17,903 >> DAN AMRMENDARIZ: Höger, exakt. 774 00:43:17,903 --> 00:43:21,120 Så innan jag bara lägga den in i en konstant här så 775 00:43:21,120 --> 00:43:23,808 att det gjorde det lätt att använda det namnet. 776 00:43:23,808 --> 00:43:24,308 Ja? 777 00:43:24,308 --> 00:43:26,942 >> PUBLIK: I detta sammanhang powerOf, det är en del 778 00:43:26,942 --> 00:43:30,774 av programmeringsspråk i motsats till det sätt du 779 00:43:30,774 --> 00:43:33,952 tänk på powerOf i [OHÖRBAR]? 780 00:43:33,952 --> 00:43:35,660 DAN AMRMENDARIZ: Så i detta fall, powerOf 781 00:43:35,660 --> 00:43:39,280 är helt enkelt namnet på funktion som jag definierade upp här. 782 00:43:39,280 --> 00:43:41,801 Så det är inte inneboende till själva språket, 783 00:43:41,801 --> 00:43:43,550 men i stället, det är bara en funktion som har 784 00:43:43,550 --> 00:43:45,628 det namnet eftersom jag ge den det namnet. 785 00:43:45,628 --> 00:43:48,770 786 00:43:48,770 --> 00:43:51,920 Alla andra frågor? 787 00:43:51,920 --> 00:43:52,800 Okej. 788 00:43:52,800 --> 00:43:54,750 >> Nu är stor. 789 00:43:54,750 --> 00:43:58,170 Men du kommer inte att se en massa förslutningsfunktioner som 790 00:43:58,170 --> 00:44:03,440 är så här definierar du, inne av en funktion, en annan funktion. 791 00:44:03,440 --> 00:44:04,320 Och du kan göra det. 792 00:44:04,320 --> 00:44:06,430 Men det är typ av inte verkligen nödvändigt, eller hur? 793 00:44:06,430 --> 00:44:09,189 Liksom varför jag definiera detta Funktionen kallas exponentiatorn 794 00:44:09,189 --> 00:44:10,480 och sedan omedelbart tillbaka den. 795 00:44:10,480 --> 00:44:15,220 Varför kan jag inte bara omedelbart returnera denna funktion? 796 00:44:15,220 --> 00:44:18,890 >> Och i själva verket är det just tanken bakom ett koncept som kallas 797 00:44:18,890 --> 00:44:22,410 anonyma funktioner, där anonyma funktioner egentligen inte 798 00:44:22,410 --> 00:44:25,270 har ett namn, eftersom de behöver inte ha en. 799 00:44:25,270 --> 00:44:28,700 Och så i detta fall, i 7B, vi kan hitta just detta. 800 00:44:28,700 --> 00:44:31,470 Det är alla samma kod, gör exakt samma sak, 801 00:44:31,470 --> 00:44:35,570 men nu har vi ändrat det något så att denna powerOf funktionen omedelbart 802 00:44:35,570 --> 00:44:37,750 returnerar en funktion. 803 00:44:37,750 --> 00:44:44,150 Lägg märke till att efter återvändandet, det finns en öppen klammer. 804 00:44:44,150 --> 00:44:46,410 Det förväntar sig denna ingång Dubbel. 805 00:44:46,410 --> 00:44:48,560 Det förväntar sig att produktionen Double. 806 00:44:48,560 --> 00:44:52,175 Och sedan i sökord separerar själva koden. 807 00:44:52,175 --> 00:44:53,550 Så det här är en anonym funktion. 808 00:44:53,550 --> 00:44:57,030 Det egentligen inte har ett namn, medan innan det hette exponentiatorn. 809 00:44:57,030 --> 00:45:00,229 Men som vi såg, bara verkligen inte hänvisa till exponentiator 810 00:45:00,229 --> 00:45:01,270 utanför av den funktionen. 811 00:45:01,270 --> 00:45:02,470 Så det spelade ingen roll. 812 00:45:02,470 --> 00:45:06,300 Så denna anonym funktion är så kallad eftersom den är namnlöst, 813 00:45:06,300 --> 00:45:09,107 men det är fortfarande används inom ramen för denna kod. 814 00:45:09,107 --> 00:45:13,690 815 00:45:13,690 --> 00:45:16,079 >> Nästa par som jag är kommer att fortsätta förhoppningsvis 816 00:45:16,079 --> 00:45:17,370 blåser ditt sinne lite. 817 00:45:17,370 --> 00:45:20,410 Vi kan förenkla ännu mer. 818 00:45:20,410 --> 00:45:24,490 För som var skarpsinnigt påpekade tidigare, 819 00:45:24,490 --> 00:45:29,100 kanske vi faktiskt vet, genom dra slutsatsen från denna kod, vad 820 00:45:29,100 --> 00:45:31,750 utgången av denna kod kommer att bli. 821 00:45:31,750 --> 00:45:38,180 Och faktiskt, i denna anonym funktion, Vi kan faktiskt sluta vilka typer av uppgifter. 822 00:45:38,180 --> 00:45:41,650 >> Så i detta, vi inte längre måste explicit definiera 823 00:45:41,650 --> 00:45:44,850 vilken typ av data som är att vara ingång och utgång från denna funktion 824 00:45:44,850 --> 00:45:45,890 för ett par skäl. 825 00:45:45,890 --> 00:45:51,390 En är att vi har definierat, upp på prototyp av den inneslutande funktion, 826 00:45:51,390 --> 00:45:55,770 vilken typ av uppgifter denna anonyma Funktionen ska ingång och utgång. 827 00:45:55,770 --> 00:45:57,900 Och från den andra, vi kan sluta sig till koden 828 00:45:57,900 --> 00:46:01,930 här nere som vi accepterar ingång som är av typen Double 829 00:46:01,930 --> 00:46:03,670 och returnera en dubbel. 830 00:46:03,670 --> 00:46:07,890 >> Lägg märke till att vi här har inte uttryckligen definierade namnen på de argument 831 00:46:07,890 --> 00:46:11,220 att denna funktion är att acceptera. 832 00:46:11,220 --> 00:46:16,180 Och så ser vi att vi kan hänvisa till dessa parametrar med $ 0 $ 1, 833 00:46:16,180 --> 00:46:20,140 så vidare och så vidare, beroende på numret på det parameter som används 834 00:46:20,140 --> 00:46:20,850 i denna funktion. 835 00:46:20,850 --> 00:46:23,370 836 00:46:23,370 --> 00:46:29,740 >> Detta är något som du kommer att se en hel del är denna öppna klammer 837 00:46:29,740 --> 00:46:32,797 definition följt av en $ 0 och sedan en operation, 838 00:46:32,797 --> 00:46:34,130 och sedan en sluten klammer. 839 00:46:34,130 --> 00:46:38,630 Det är en anonym funktion som utför denna operation. 840 00:46:38,630 --> 00:46:42,940 Det har denna parameter där Det är typ är antagen. 841 00:46:42,940 --> 00:46:44,860 Det första parametern är 0 $. 842 00:46:44,860 --> 00:46:49,010 Och en operation är händer på att 0 $. 843 00:46:49,010 --> 00:46:52,100 >> PUBLIK: Så dollartecken betyder parameter i princip, 844 00:46:52,100 --> 00:46:53,429 och 0 betyder den första? 845 00:46:53,429 --> 00:46:54,720 DAN Armendáriz: Det stämmer. 846 00:46:54,720 --> 00:46:59,100 Så dollartecken i princip innebär parameter, och 0 betyder den första. 847 00:46:59,100 --> 00:47:02,760 Men det fungerar specifikt i det här fallet där jag inte har namngett 848 00:47:02,760 --> 00:47:07,940 argumenten i min anonym funktion. 849 00:47:07,940 --> 00:47:11,119 >> PUBLIK: Har Perl eller något har denna dollartecken, dollar 0 där? 850 00:47:11,119 --> 00:47:12,702 DAN Armendáriz: Gör som jag är ledsen? 851 00:47:12,702 --> 00:47:15,360 PUBLIK: Har Perl har denna dollarn 0, dollar 1-- 852 00:47:15,360 --> 00:47:17,318 DAN Armendáriz: Jag är inte alltför bekant med Perl, 853 00:47:17,318 --> 00:47:21,340 men PHP vad som definierar variabler baserat på dollartecken. 854 00:47:21,340 --> 00:47:26,120 Och det kan finnas vissa språk som har funktioner som denna. 855 00:47:26,120 --> 00:47:28,240 I själva verket lånar Swift en Många funktioner som detta 856 00:47:28,240 --> 00:47:29,489 från en massa andra språk. 857 00:47:29,489 --> 00:47:32,380 Vi ser inslag av Python i det. 858 00:47:32,380 --> 00:47:35,800 Denna definition av typen verkar komma från OCaml. 859 00:47:35,800 --> 00:47:38,932 Och vi har bara en massa grejer från massor av olika språk. 860 00:47:38,932 --> 00:47:40,640 Det är en av de trevliga saker om Swift 861 00:47:40,640 --> 00:47:43,390 är att det tar mycket av de bästa idéer från ett gäng språk 862 00:47:43,390 --> 00:47:47,229 och skohorn dem alla tillsammans till en super språk. 863 00:47:47,229 --> 00:47:49,520 I själva verket om du tillåter mig att fortsätta att blåsa ditt sinne, 864 00:47:49,520 --> 00:47:51,000 så vi har gjort allt detta. 865 00:47:51,000 --> 00:47:56,690 Vi kan kanske förenkla lite bitars genom att inse att, naturligtvis, 866 00:47:56,690 --> 00:48:02,120 Swift har en exponentierande funktionen inbyggd. 867 00:48:02,120 --> 00:48:04,660 Om jag importera Darwin, som är bara biblioteket som 868 00:48:04,660 --> 00:48:09,680 har denna funktion som kallas pow, nu Jag kan förenkla min makt funktions 869 00:48:09,680 --> 00:48:11,830 att vara följande. 870 00:48:11,830 --> 00:48:15,860 Det kommer att vara tillbaka Detta anonym funktion. 871 00:48:15,860 --> 00:48:17,950 >> Men titta på hur enkelt det är nu. 872 00:48:17,950 --> 00:48:22,780 Detta är en anonym funktion som är att acceptera någon typ av data, 873 00:48:22,780 --> 00:48:26,600 och det kommer att bli en argument som särskilt, 874 00:48:26,600 --> 00:48:29,320 refereras på $ 0 som är av typen Double. 875 00:48:29,320 --> 00:48:32,680 Det kommer att returnera en Duplex. 876 00:48:32,680 --> 00:48:35,760 Men satsen return är nu implicit. 877 00:48:35,760 --> 00:48:39,990 >> Och det är denna specifika stil som är mycket, mycket vanliga i Swift, 878 00:48:39,990 --> 00:48:40,790 över hela stället. 879 00:48:40,790 --> 00:48:43,190 Vi kommer att se detta hela tiden i Swift. 880 00:48:43,190 --> 00:48:46,150 Så jag visar allt detta till dig på grund av denna syntax. 881 00:48:46,150 --> 00:48:49,070 Detta är mycket vanligt att se, vilket betyder att det 882 00:48:49,070 --> 00:48:51,420 är en anonym funktion som utför 883 00:48:51,420 --> 00:48:54,640 någon operation på dessa argument. 884 00:48:54,640 --> 00:48:56,940 Och det finns en implicit avkastning. 885 00:48:56,940 --> 00:49:01,850 Så det är exakt samma sak för oss att säga detta, just här. 886 00:49:01,850 --> 00:49:05,730 887 00:49:05,730 --> 00:49:08,150 >> Eftersom denna lockigt fästet är en funktion, 888 00:49:08,150 --> 00:49:10,480 vi utföra den här åtgärden på det första argumentet. 889 00:49:10,480 --> 00:49:12,170 Vi kommer att återvända det. 890 00:49:12,170 --> 00:49:14,815 Men denna yttre avkastningen tillbaka hela den funktion, 891 00:49:14,815 --> 00:49:19,855 att hela anonym funktion att vi bara har skapat. 892 00:49:19,855 --> 00:49:21,689 Alla andra frågor? 893 00:49:21,689 --> 00:49:23,980 Okej, jag vet inte om ni är redo för detta, 894 00:49:23,980 --> 00:49:27,455 men vi kan gå ännu galnare med Swift. 895 00:49:27,455 --> 00:49:28,560 Är du redo? 896 00:49:28,560 --> 00:49:29,930 OK, det här är bra. 897 00:49:29,930 --> 00:49:35,310 >> Nu har vi faktiskt har förmågan till i Swift, på grund av hur modul 898 00:49:35,310 --> 00:49:39,650 och hur protokoll baserat det vill säga att definiera våra egna freaking operatörer. 899 00:49:39,650 --> 00:49:44,060 Som i det här fallet hade vi ingen operatör för exponentiation-- väl, 900 00:49:44,060 --> 00:49:47,990 för att utföra befogenheter något. 901 00:49:47,990 --> 00:49:53,632 Men jag kan i Swift, definiera en ny operatör som gör just detta. 902 00:49:53,632 --> 00:49:55,590 Så i det här fallet finns det ett gäng syntax här. 903 00:49:55,590 --> 00:49:59,980 Och jag kommer att låta dig att titta på det hemma när man tittar på detta. 904 00:49:59,980 --> 00:50:06,890 Men vi definierar denna infix operatör, **, som sedan kommer att tillåta oss, 905 00:50:06,890 --> 00:50:09,840 genom att definiera vad det funktion ** faktiskt 906 00:50:09,840 --> 00:50:15,010 gör, att acceptera en vänster sida och en höger sida, 907 00:50:15,010 --> 00:50:21,190 och sedan återgå exponenten för att vänster till höger sida. 908 00:50:21,190 --> 00:50:24,850 >> Och så nu plötsligt jag har skapat en ny täljare. 909 00:50:24,850 --> 00:50:29,490 Så 2 ** 3 betyder 2 till den tredje makten. 910 00:50:29,490 --> 00:50:34,420 [Sinne blåser SOUND] Detta genom själv bör göra du gillar, 911 00:50:34,420 --> 00:50:37,960 OK, skruv C. Jag tänker Swift hela vägen. 912 00:50:37,960 --> 00:50:38,740 Det här är bra. 913 00:50:38,740 --> 00:50:40,140 Detta är ganska fantastiskt. 914 00:50:40,140 --> 00:50:42,240 >> Även om detta är ett bra exempel. 915 00:50:42,240 --> 00:50:45,570 Men jag har aldrig en gång utanför i detta exempel faktiskt 916 00:50:45,570 --> 00:50:46,800 definierat min egen operatör. 917 00:50:46,800 --> 00:50:49,710 Men ändå, det visar en mycket av kraften i Swift 918 00:50:49,710 --> 00:50:54,050 och varför detta är faktiskt verkligen väldigt cool. 919 00:50:54,050 --> 00:50:55,832 OK, ja? 920 00:50:55,832 --> 00:50:57,790 PUBLIK: Om du är definiera din egen operatör, 921 00:50:57,790 --> 00:51:02,940 hur vet du att du inte av misstag försöka skapa en operatör som är 922 00:51:02,940 --> 00:51:06,040 i någonstans i C, som gömd någonstans i Swift, 923 00:51:06,040 --> 00:51:12,210 som en obskyr som du kanske inte har sett förut. 924 00:51:12,210 --> 00:51:15,050 >> DAN Armendáriz: Så om du försöker att definiera egna operatörer, 925 00:51:15,050 --> 00:51:20,970 finns det en risk för att definiera en över en befintlig aktör. 926 00:51:20,970 --> 00:51:24,870 Det går in i en detaljnivå som Jag tror inte att vi har tid att gå igenom. 927 00:51:24,870 --> 00:51:27,620 Men det finns en risk. 928 00:51:27,620 --> 00:51:31,320 Och det är i själva verket själva anledningen till Jag använde inte cirkumflex symbol, som 929 00:51:31,320 --> 00:51:36,210 när vi skriver ut makt, vi vanligtvis Använd 4 lite cirkumflex 5 eller något 930 00:51:36,210 --> 00:51:40,560 så, just när vi är Gchatting kompisar eller vad som helst. 931 00:51:40,560 --> 00:51:43,660 Men i så fall, som faktiskt skulle ha orsakat en kollision. 932 00:51:43,660 --> 00:51:46,450 Och så jag undvek det bara för att Jag råkade veta i det här fallet 933 00:51:46,450 --> 00:51:50,430 att det skulle leda till att kollision. 934 00:51:50,430 --> 00:51:52,270 >> Okej. 935 00:51:52,270 --> 00:51:55,080 Nu tyvärr, för de sista sju minuter, 936 00:51:55,080 --> 00:51:57,410 Jag måste hålla blåsning era sinnen lite. 937 00:51:57,410 --> 00:52:00,230 Så låt mig visa dig vissa andra saker också. 938 00:52:00,230 --> 00:52:03,710 >> Vi har visat dig denna idé om ha dessa anonyma funktioner, 939 00:52:03,710 --> 00:52:07,040 dessa nedläggningar som gör att du kan typ av pass funktioner runt. 940 00:52:07,040 --> 00:52:08,100 Du kan lämna tillbaka dem. 941 00:52:08,100 --> 00:52:09,490 Du kan manipulera dem. 942 00:52:09,490 --> 00:52:11,790 Du kan göra alla typer av galna grejer. 943 00:52:11,790 --> 00:52:14,850 >> Men en annan sak som råkar vara användbar 944 00:52:14,850 --> 00:52:19,740 är möjligheten att, i motsats att återvända dessa funktioner 945 00:52:19,740 --> 00:52:25,146 i en funktion, för att passera en funktion som en parameter till en annan funktion. 946 00:52:25,146 --> 00:52:30,430 Du kanske tänker väl varför på jorden skulle jag vilja göra något sådant? 947 00:52:30,430 --> 00:52:33,660 >> Nåväl, låt oss säga att jag vill att ta denna operatör som jag 948 00:52:33,660 --> 00:52:40,260 arbetat så hårt för att skapa och tillämpa det till ett gäng olika nummer 949 00:52:40,260 --> 00:52:41,770 i en matris. 950 00:52:41,770 --> 00:52:46,700 Så i det här fallet har jag en rad integers-- 1, 4, 7, 2, 5, 10, 56. 951 00:52:46,700 --> 00:52:48,080 Och jag vill att fördubbla dem alla. 952 00:52:48,080 --> 00:52:50,430 Det sätt som vi skulle normalt göra det är att bara skriva 953 00:52:50,430 --> 00:52:53,440 en enkel för loop som itererar över alla dem 954 00:52:53,440 --> 00:52:57,140 och utföra någon form av kvadrat drift över dem, 955 00:52:57,140 --> 00:53:02,700 inmatning dessa nya värden i en ny variabel, eller snarare, en ny array här. 956 00:53:02,700 --> 00:53:07,370 Och värdet av utsignalen från Resultatet blir då samtliga dessa matriser, 957 00:53:07,370 --> 00:53:10,200 eller snarare alla dessa element nu kvadrat. 958 00:53:10,200 --> 00:53:12,680 >> Och vi kunde göra samma sak sak för cubing det, 959 00:53:12,680 --> 00:53:15,360 men lite alarmklocka bör gå ut 960 00:53:15,360 --> 00:53:17,360 säger att kanske det finns något sätt som vi skulle 961 00:53:17,360 --> 00:53:19,860 kunna förenkla denna lite. 962 00:53:19,860 --> 00:53:21,130 Och i själva verket finns det. 963 00:53:21,130 --> 00:53:25,320 Tänk om vi kunde skapa en funktion som gör det möjligt för oss 964 00:53:25,320 --> 00:53:28,350 att acceptera, som ett rovdjur, en funktion? 965 00:53:28,350 --> 00:53:30,350 Så i detta fall, ta en titta på dessa argument. 966 00:53:30,350 --> 00:53:33,220 Vi kommer att acceptera en lista med dubbel. 967 00:53:33,220 --> 00:53:35,030 Och då kommer vi att acceptera en funktion 968 00:53:35,030 --> 00:53:40,990 i en variabel som kallas f som kommer att ta en dubbel och returnera en dubbel. 969 00:53:40,990 --> 00:53:43,320 Och hela utsignalen av hela denna funktion 970 00:53:43,320 --> 00:53:47,310 kallas mapper kommer att returnera en array kallas dubbel. 971 00:53:47,310 --> 00:53:52,380 >> Vad detta skulle då tillåta mig att göra är att iterera över listan 972 00:53:52,380 --> 00:53:56,350 och göra samma sak, men nu tillämpa denna funktion för varje 973 00:53:56,350 --> 00:53:58,970 av de individuella värdena i den listan. 974 00:53:58,970 --> 00:54:00,750 Så inte riktigt vet jag vad f är. 975 00:54:00,750 --> 00:54:02,010 Det spelar ingen roll för mig. 976 00:54:02,010 --> 00:54:06,530 Men så länge det tar i en dubbel, utför någon operation på det, 977 00:54:06,530 --> 00:54:08,640 och returnerar sedan ett Dubbel, skulle jag då vara 978 00:54:08,640 --> 00:54:13,415 kunna kartlägga denna funktion över varje enskilt element i listan. 979 00:54:13,415 --> 00:54:16,270 980 00:54:16,270 --> 00:54:20,930 >> Och denna typ av programmering är kallade högre ordningens funktioner, 981 00:54:20,930 --> 00:54:24,440 där vi passerar funktioner runt som parametrar 982 00:54:24,440 --> 00:54:26,430 och göra saker med funktioner. 983 00:54:26,430 --> 00:54:29,640 Det är ungefär som att ta alla dessa idéer som vi har lärt oss i CS50 984 00:54:29,640 --> 00:54:31,390 och ta med dem sorterar av till nästa nivå. 985 00:54:31,390 --> 00:54:34,140 Och det är allt CS51 stil grejer. 986 00:54:34,140 --> 00:54:37,080 Och så går vi på djupet mer i klasserna som. 987 00:54:37,080 --> 00:54:38,930 >> Men det är också viktigt här eftersom vi 988 00:54:38,930 --> 00:54:42,010 se en hel del funktioner som används i Swift 989 00:54:42,010 --> 00:54:45,590 som i huvudsak gör detta där vi har 990 00:54:45,590 --> 00:54:48,300 några siffror, vissa rad siffror. 991 00:54:48,300 --> 00:54:50,850 Vi kommer att passera att array i vår kartritare. 992 00:54:50,850 --> 00:54:55,770 Och vi kommer även att passera någon funktion, som 993 00:54:55,770 --> 00:54:57,950 Vi har redan definierat här uppe. 994 00:54:57,950 --> 00:54:59,690 Det kommer att vara fyrkantig. 995 00:54:59,690 --> 00:55:02,220 Och vi kommer att sedan torget alla dessa siffror 996 00:55:02,220 --> 00:55:04,710 och lagra det i detta resultat här. 997 00:55:04,710 --> 00:55:07,280 998 00:55:07,280 --> 00:55:11,000 >> Så det här fallet har vi definierat vår egen funktion som kallas kartritare. 999 00:55:11,000 --> 00:55:15,370 Men denna specifika sak är, i själva verket, inbyggd i Swift. 1000 00:55:15,370 --> 00:55:18,960 Det finns en mängd olika funktioner kallas karta. 1001 00:55:18,960 --> 00:55:21,520 Det finns en kartfunktion, det finns en sänka funktion, 1002 00:55:21,520 --> 00:55:25,630 och det finns en filterfunktion, som i huvudsak gäller funktioner 1003 00:55:25,630 --> 00:55:30,782 till varje enskilt element i en lista att ändra dem på något sätt. 1004 00:55:30,782 --> 00:55:34,510 >> PUBLIK: Så eftersom du omformar data till ett annat format 1005 00:55:34,510 --> 00:55:36,134 genom en function-- 1006 00:55:36,134 --> 00:55:37,050 DAN Armendáriz: Rätt. 1007 00:55:37,050 --> 00:55:39,420 Ja, så funktionen att vi acceptera 1008 00:55:39,420 --> 00:55:41,790 omvandlar data på något sätt. 1009 00:55:41,790 --> 00:55:44,700 I det här fallet var vi antingen kvadratur det, eller vi cubing det, 1010 00:55:44,700 --> 00:55:50,060 eller egentligen kunde vi utför ingen operation på det alls. 1011 00:55:50,060 --> 00:55:54,150 >> Men låt mig visa dig då hur detta kommer att se ut i praktiken. 1012 00:55:54,150 --> 00:55:56,681 Och återigen, jag kör en lite tid. så jag är inte 1013 00:55:56,681 --> 00:55:59,430 kommer att kunna gå över alla av källkoden i detalj här. 1014 00:55:59,430 --> 00:56:00,721 Men jag uppmuntrar dig att göra det. 1015 00:56:00,721 --> 00:56:03,850 Vi kommer att lägga det så snart som möjligt efter detta samtal. 1016 00:56:03,850 --> 00:56:07,610 >> Men om du tar en titt på detta, anta att vi har en lista med tal, 1017 00:56:07,610 --> 00:56:10,260 en matris med siffror på detta variabel uppringda numren. 1018 00:56:10,260 --> 00:56:16,670 Då kan vi vill utföra detta filter operation på dessa siffror. 1019 00:56:16,670 --> 00:56:19,730 Så filter är ett högre ordningens funktion som 1020 00:56:19,730 --> 00:56:24,660 accepterar en array och även en funktion. 1021 00:56:24,660 --> 00:56:28,760 Och på varje element i det matris, utför den denna funktion. 1022 00:56:28,760 --> 00:56:31,990 >> Om att funktionen returnerar sant, det håller det objektet. 1023 00:56:31,990 --> 00:56:36,100 Om denna funktion returnerar false, Det kastar bort den posten. 1024 00:56:36,100 --> 00:56:40,480 Och sedan returnerar en lista som sedan består alla 1025 00:56:40,480 --> 00:56:44,360 av de poster som har filtrerats. 1026 00:56:44,360 --> 00:56:47,150 >> Så i ett annat ord, är detta samma idé, betygsbok. 1027 00:56:47,150 --> 00:56:50,800 Vi kanske har en mängd olika kvaliteter in detta värde uppringda numret. 1028 00:56:50,800 --> 00:56:55,590 Kan vara 100, och 70, och 40, så vidare och så vidare. 1029 00:56:55,590 --> 00:56:59,110 Vad det här filtret gör är meddelande att detta är att syntaktiskt socker 1030 00:56:59,110 --> 00:57:01,310 för en anonym funktion. 1031 00:57:01,310 --> 00:57:05,980 Detta är en anonym funktion säger att den parameter som jag acceptera 1032 00:57:05,980 --> 00:57:09,690 kommer att vara, om det är större än 70, 1033 00:57:09,690 --> 00:57:15,837 då detta kommer att återvända sant, vilket innebär att objektet kommer att hållas i det här filtret. 1034 00:57:15,837 --> 00:57:17,920 Så låt oss vara lite mer konkret om detta. 1035 00:57:17,920 --> 00:57:25,760 Om jag har denna rad siffror och den består av 100, 70, och 40, 1036 00:57:25,760 --> 00:57:29,730 Jag gör det här filtret operation på vart och ett av dessa. 1037 00:57:29,730 --> 00:57:33,270 Så det första är detta värde på 100. 1038 00:57:33,270 --> 00:57:36,770 100 större än eller lika till 70 är sant, vilket 1039 00:57:36,770 --> 00:57:41,950 innebär att 100 hålls i denna ny kopia av denna samling. 1040 00:57:41,950 --> 00:57:44,290 70 passerar också. 1041 00:57:44,290 --> 00:57:46,020 Men 40 inte. 1042 00:57:46,020 --> 00:57:54,290 Så vad är tillbaka i passingCount är arrangemanget av elementen 100 och 70-- 1043 00:57:54,290 --> 00:57:57,410 100, kommatecken, 70. 1044 00:57:57,410 --> 00:57:59,870 De var de enda två objekt som hölls. 1045 00:57:59,870 --> 00:58:03,740 Och så anledningen till att jag snabbt gick igenom en hel del av denna typ av hög ordning 1046 00:58:03,740 --> 00:58:08,680 saker är eftersom detta är att vanliga sak som du kommer att se i Swift ganska 1047 00:58:08,680 --> 00:58:16,810 ofta utför en operation använder denna anonym funktion syntax. 1048 00:58:16,810 --> 00:58:18,450 >> Det finns några coola grejer. 1049 00:58:18,450 --> 00:58:24,730 Växlar är riktigt kraftfull i Swift, Jag menar precis som galen, galen kraftfull. 1050 00:58:24,730 --> 00:58:28,250 Du kan använda switch, och du kan faktiskt använda dem 1051 00:58:28,250 --> 00:58:33,160 till intervall, som är typ av galen, och göra snygga sånt. 1052 00:58:33,160 --> 00:58:37,540 >> Men under de senaste minuterna, Jag vill hoppa framåt ganska långt 1053 00:58:37,540 --> 00:58:46,940 och visa dig ett konkret exempel på hur vi kan skapa i iOS programmet med Swift. 1054 00:58:46,940 --> 00:58:49,040 Så när du gör detta måste du ta 1055 00:58:49,040 --> 00:58:51,990 en blick at-- på Apples dokumentation, de 1056 00:58:51,990 --> 00:58:56,084 har en hel del riktigt bra tutorials för att skapa din första ansökan. 1057 00:58:56,084 --> 00:58:58,250 Och jag uppmuntrar dig att göra att eftersom de tar dig 1058 00:58:58,250 --> 00:59:04,110 genom alla stegen i vad exakt till klicka på för att skapa ett iOS-program. 1059 00:59:04,110 --> 00:59:07,290 >> Men här har vi denna iOS-app. 1060 00:59:07,290 --> 00:59:10,960 Och det är en ganska enkel app verkligen. 1061 00:59:10,960 --> 00:59:13,840 Om jag kör detta, låt mig visa du hur det ser ut. 1062 00:59:13,840 --> 00:59:19,480 Allt det i huvudsak gör är det drar från Internet en JSON fil 1063 00:59:19,480 --> 00:59:22,300 att jag har lagras på en server. 1064 00:59:22,300 --> 00:59:26,310 Och det JSON fil definierar bilder som tillåter 1065 00:59:26,310 --> 00:59:31,680 mig att sedan gå igenom, på min app, bilder från mitt webbserver. 1066 00:59:31,680 --> 00:59:32,880 >> Så jag har här getNextImage. 1067 00:59:32,880 --> 00:59:37,100 Den laddar en bild från internet, och sedan visar den på skärmen. 1068 00:59:37,100 --> 00:59:38,200 >> Så det är ganska enkelt. 1069 00:59:38,200 --> 00:59:41,550 Men målet är att visa hur vi kan kombinera saker 1070 00:59:41,550 --> 00:59:47,820 från de senare veckorna av CS50 till en verklig iOS-program. 1071 00:59:47,820 --> 00:59:53,140 Med andra ord, kanske en av de saker som du kommer att vilja göra 1072 00:59:53,140 --> 00:59:56,340 är att ha en iOS-program som kan hämta data från Internet 1073 00:59:56,340 --> 00:59:59,070 och visa användaren viss information. 1074 00:59:59,070 --> 01:00:03,130 Det är helt och hållet den punkt av detta källkoden här. 1075 01:00:03,130 --> 01:00:07,890 >> Så det finns en hel del att säga om hur man gör själva iOS utveckling. 1076 01:00:07,890 --> 01:00:12,860 Det finns en hel del galna syntax att vi inte har sett riktigt än 1077 01:00:12,860 --> 01:00:15,580 som en klass, vilken klass som faktiskt är. 1078 01:00:15,580 --> 01:00:19,470 Vi kan till stor del ignorera att för närvarande. 1079 01:00:19,470 --> 01:00:23,250 >> Men märker att vi har inne inom denna en mängd olika saker 1080 01:00:23,250 --> 01:00:27,720 att vi redan har sett som funktioner som har specifika namn. 1081 01:00:27,720 --> 01:00:32,650 Och när vi ger dem fungerar rätt namn 1082 01:00:32,650 --> 01:00:36,530 som förväntas av iOS, i själva verket det här känns lite magiskt. 1083 01:00:36,530 --> 01:00:40,300 Men när du skapar en IOS ansökan, det 1084 01:00:40,300 --> 01:00:47,590 är specifika funktionsnamn som kallas av själva telefonen 1085 01:00:47,590 --> 01:00:52,440 som ansökan laddar att försöka för att skapa den process som faktiskt 1086 01:00:52,440 --> 01:00:54,787 kör din ansökan. 1087 01:00:54,787 --> 01:00:58,120 Så återigen, det finns en massa saker som jag måste skyla över hit för att vi 1088 01:00:58,120 --> 01:01:00,570 att tala om detta specifikt. 1089 01:01:00,570 --> 01:01:06,050 Men jag uppmuntrar dig att titta på kanske den andra iOS seminariet, men även en del 1090 01:01:06,050 --> 01:01:09,290 av tutorials på nätet som gör ett mycket bättre jobb med att beskriva 1091 01:01:09,290 --> 01:01:11,030 specifik information. 1092 01:01:11,030 --> 01:01:15,760 >> Men vi kan se ett par saker som är intressant ur koden här. 1093 01:01:15,760 --> 01:01:17,950 Lägg märke till att vi har om uttalanden. 1094 01:01:17,950 --> 01:01:20,400 Förresten, en viktig sak om om uttalanden 1095 01:01:20,400 --> 01:01:24,860 är att parentes runt Booleskt uttryck är valfria. 1096 01:01:24,860 --> 01:01:30,800 Men klammerparenteserna är inte frivilligt, oavsett hur få eller många rader kod 1097 01:01:30,800 --> 01:01:32,360 du har i en if-sats. 1098 01:01:32,360 --> 01:01:38,670 Du kan inte ha en om uttalanden utan klammerparenteserna i Swift. 1099 01:01:38,670 --> 01:01:41,000 >> Och detta är, ja, typ av dumt. 1100 01:01:41,000 --> 01:01:43,910 Men det finns historiska skäl för detta. 1101 01:01:43,910 --> 01:01:46,180 Det är tänkt att rädda dig från dig själv. 1102 01:01:46,180 --> 01:01:49,899 Gillar du till exempel, kan du inte eliminera klammerparenteserna runt den 1103 01:01:49,899 --> 01:01:50,440 if-sats. 1104 01:01:50,440 --> 01:01:52,730 De är i själva verket erfordras. 1105 01:01:52,730 --> 01:01:54,480 Så jag uppmuntrar dig att ta en titt på detta. 1106 01:01:54,480 --> 01:01:56,230 Men det finns ytterligare en konstruera att jag vill 1107 01:01:56,230 --> 01:02:02,640 att visa dig om Swift som är nytt för Swift 2,0 jämfört 1108 01:02:02,640 --> 01:02:08,460 till äldre versioner av Swift, vilket är följande. 1109 01:02:08,460 --> 01:02:11,620 Låt oss se var jag uttrycka det här? 1110 01:02:11,620 --> 01:02:16,630 >> Så i denna funktion som kallas fetchJSON denna funktion 1111 01:02:16,630 --> 01:02:23,450 är ansvariga för att dra att JSON fil från en URL, som bara råkar vara så 1112 01:02:23,450 --> 01:02:26,310 köras på min CS50 IDE. 1113 01:02:26,310 --> 01:02:28,580 Jag har precis börjat Apache, sätta min JSON fil där, 1114 01:02:28,580 --> 01:02:32,110 och jag kan då dra det data från Internet med hjälp av 1115 01:02:32,110 --> 01:02:36,430 denna funktion och denna URL, som tillhandahålls av telefonen. 1116 01:02:36,430 --> 01:02:40,490 Det tillhandahålls av en bibliotek som du använder när 1117 01:02:40,490 --> 01:02:43,140 du gör några iOS applikationsutveckling. 1118 01:02:43,140 --> 01:02:49,690 >> Lägg märke till här att det är denna ovanliga syntaktisk konstruktion kallas vakt. 1119 01:02:49,690 --> 01:02:53,530 Och egentligen allt detta är i Swift är ett sätt att verifiera 1120 01:02:53,530 --> 01:02:56,870 att vissa saker har är uppfyllda innan du 1121 01:02:56,870 --> 01:03:00,000 gå vidare med resten av funktionen. 1122 01:03:00,000 --> 01:03:04,260 Så jag kunde ha, med hjälp av Detta tillval typ, 1123 01:03:04,260 --> 01:03:10,530 Jag kunde har hittat URL: en med kör denna NSURL funktion 1124 01:03:10,530 --> 01:03:16,640 och lagra det i en URL konstant, och sedan kontrollera 1125 01:03:16,640 --> 01:03:20,820 för att se om webbadressen var noll, eftersom det skulle returnera en valfri typ. 1126 01:03:20,820 --> 01:03:25,660 Och om det var noll, då skulle jag skriva ut ett fel och sedan återvända. 1127 01:03:25,660 --> 01:03:29,970 >> Men i stället, låter vad vakt oss gör är att just det, 1128 01:03:29,970 --> 01:03:34,550 men se till att det är faktiskt så att url 1129 01:03:34,550 --> 01:03:38,020 har ställts in korrekt av NSURL. 1130 01:03:38,020 --> 01:03:41,810 Och om det är, då det hoppar över detta, och det 1131 01:03:41,810 --> 01:03:46,110 gör att du kan gå vidare med url ha adekvat definierade. 1132 01:03:46,110 --> 01:03:48,830 Men om det är så att url är inte korrekt definierad, 1133 01:03:48,830 --> 01:03:52,550 Om den här funktionen returnerar ett fel eller någon annan oväntad sak 1134 01:03:52,550 --> 01:03:58,030 faktiskt sker, detta skydd konstruktion ger oss möjlighet att sedan ut detta fel 1135 01:03:58,030 --> 01:04:00,390 och omedelbart återvända. 1136 01:04:00,390 --> 01:04:00,890 Ja? 1137 01:04:00,890 --> 01:04:04,839 >> PUBLIK: Så det är typ av som en om så annars? 1138 01:04:04,839 --> 01:04:07,130 DAN Armendáriz: Det är typ av som en om så annars, ja, 1139 01:04:07,130 --> 01:04:14,200 förutom att denna url sedan definierats för allt under denna. 1140 01:04:14,200 --> 01:04:20,420 Om den passerar detta skydd, då det faktiskt kommer att fyllas med data 1141 01:04:20,420 --> 01:04:29,500 och som kan användas i den återstående källkod i din funktion. 1142 01:04:29,500 --> 01:04:33,790 Så jag misstänker att du kommer att börja se detta skydd också. 1143 01:04:33,790 --> 01:04:36,670 Och vara uppmärksam på detta. 1144 01:04:36,670 --> 01:04:46,270 >> Så bara titta på ett par andra saker, denna rätt här är vad, 1145 01:04:46,270 --> 01:04:53,377 tror du, bara baserat på vad vi talade om tidigare? 1146 01:04:53,377 --> 01:04:56,650 >> PUBLIK: Tror det ska köras i listan? 1147 01:04:56,650 --> 01:04:59,100 >> DAN Armendáriz: Så det är nära. 1148 01:04:59,100 --> 01:05:02,360 Detta är en funktion som vi definierar. 1149 01:05:02,360 --> 01:05:07,240 Och vi matar in denna funktion som ett argument till denna funktion här. 1150 01:05:07,240 --> 01:05:09,120 >> Publik: [OHÖRBAR] om inte noll. 1151 01:05:09,120 --> 01:05:11,470 Så det är i listan, eller hur? 1152 01:05:11,470 --> 01:05:15,450 >> DAN Armendáriz: Om felet inte är noll, så det är-- så jag måste rulla. 1153 01:05:15,450 --> 01:05:18,060 Nåväl, låt oss se, jag kan inte riktigt bläddra till höger här. 1154 01:05:18,060 --> 01:05:23,161 error är ett argument som håller på att skickas till denna anonym funktion. 1155 01:05:23,161 --> 01:05:24,410 Detta är en anonym funktion. 1156 01:05:24,410 --> 01:05:25,480 Den har inget namn. 1157 01:05:25,480 --> 01:05:29,850 Men vi accepterar dessa tre argument, data, svar och fel. 1158 01:05:29,850 --> 01:05:33,590 Och det kommer att återvända ogiltiga, så det kommer inte att återvända något. 1159 01:05:33,590 --> 01:05:37,910 Och detta är innehållet av den funktionen. 1160 01:05:37,910 --> 01:05:41,961 Och sedan har vi tillgång insidan som funktion var och en av dessa argument. 1161 01:05:41,961 --> 01:05:45,650 1162 01:05:45,650 --> 01:05:48,679 >> Så det är en virvelvind rundtur i språket. 1163 01:05:48,679 --> 01:05:50,470 Men jag hoppas med detta förhoppningsvis när du tar 1164 01:05:50,470 --> 01:05:54,490 en titt på några av de tutorials specifika för iOS utveckling med Swift, 1165 01:05:54,490 --> 01:05:57,481 särskilt om du går till Apples utvecklare web page-- 1166 01:05:57,481 --> 01:05:59,980 de har en hel del riktigt bra handledning för att komma igång. 1167 01:05:59,980 --> 01:06:05,010 Men förhoppningsvis just denna timme att tala om syntaxen i sig har gett 1168 01:06:05,010 --> 01:06:08,760 dig tillräckligt för att komma igång med det. 1169 01:06:08,760 --> 01:06:12,950 >> Vi kommer att lägga allt detta källa kod på seminariet webbplats 1170 01:06:12,950 --> 01:06:17,800 så snart som möjligt, och även glasen så du har en referens för alla dem. 1171 01:06:17,800 --> 01:06:20,530 Men lycka till med dina projekt. 1172 01:06:20,530 --> 01:06:23,640 Och tack alla så mycket för att ni kom. 1173 01:06:23,640 --> 01:06:26,990 >> [APPLÅDER] 1174 01:06:26,990 --> 01:06:28,026