>> [Musik spiller]
>> DAN AMRMENDARIZ: Alle, velkommen til CS50 seminaret,
iOS App Udvikling med Swift.
Jeg er Dan Armendariz, og jeg er en preceptor af datalogi her på Harvard.
>> Og den næste time vil være en hurtig rundvisning i så meget stuff
om dette emne, som vi kan passe.
Jeg vil sende alle kildekoden at du vil se i dag online.
Vi kan ikke være i stand til at faktisk gå over alt
at jeg er, at jeg er viser dig i denne time.
Men i det mindste forhåbentlig gennem bemærkningerne fra kildekoden,
vil du være i stand til at forsøge at regne ud, hvad præcis sker efter disse ting
at vi ikke helt komme til.
>> Generelt struktur dagens snak vil være som følger.
Vi starter ud at gøre nogle grundlæggende syntaks med Swift sprog,
gå ind i nogle af de mere avancerede syntaksen for Swift sprog.
Fordi sproget er virkelig moderne og det
har en masse højt funktioner, ting, som vi ikke har
ses i C hele CS50 eller Selv nogle af de andre sprog
at vi har startet hjælp i CS50 som PHP,
så jeg nødt til at forsøge at introducere også nogle emner,
er relateret til højere sprog niveau at du ikke kan se i dybden i CS50,
men du vil se i senere datalogi klasser.
Så det vil være en tætpakkede time.
Og er du velkommen til at lade mig vide, hvis du har spørgsmål.
Så hvis du er interesseret i at gøre udviklingen
med Swift, eller virkelig enhver iOS App udvikling,
der er et par krav.
Først og fremmest, er du nødt til at bruge en Mac, der kører i eksemplerne
at vi skal bruge i dag, en forholdsvis ny version af OS
X. I dette tilfælde, jeg kører X 10.5.
Du kan køre 10.11, hvis du ønsker.
Men alt, hvad du kommer til at se er at inddrage Xcode 7 og senere,
som har den nyeste version Swift, som er Swift 2.0.
Dette er faktisk en temmelig vigtig forskel.
En masse af syntaksen har ændret temmelig markant
i nogle tilfælde fra Swift 1,0, som blev udgivet sidste år,
til Swift 2.0, som bare kom ud dette efterår.
Så vi kommer til at vise Swift 2.0.
En masse af de ting, du søge efter online
når du forsøger at få yderligere oplysninger om en lang række ting,
kan du eksplicit søge efter Swift 2
snarere end blot almindelig gamle Swift til at gøre sikker på, at du får den syntaks korrekt.
>> I virkeligheden er dette generelt rigtigt.
Der er en hurtig mængde udvikling sker i Swift sprog
lige siden Apple frigivet den, tror jeg hvad, det har været lidt over et år
nu.
Og tingene har ændret sig dramatisk i tid.
Og så ikke være frustreret Hvis, når du søger rundt
for emner på Swift eller hvordan du gør noget ved hjælp af nogle eksempel kode
eller noget, der det ikke faktisk arbejde på Swift 2.0.
Sørg for at du er på udkig specielt til denne version
for at forsøge at minimere virkningerne af forskellige versioner og den slags ting.
>> Jeg vil prøve at påpege bare nogle ting som er anderledes end ældre versioner.
Men det er noget at holde øje med.
Det er sandsynligvis kommer til at være en af ​​de største hovedpine
at du vil have med Swift er at finde eksempel kode, der er ældre, bare
af et par måneder, forsøger at bruge det i din mere moderne projekt.
Og det simpelthen ikke virker.
Du får compiler fejl, syntaks fejl, alle mulige skøre ting.
Så bare være tålmodig med at, og du vil forhåbentlig
har en temmelig god oplevelse med Swift samlet.
>> Nu kan du faktisk join-- og jeg håber vi faktisk stadig har denne denne year--
CS 50 s Apple App udviklingsteam, som
vil give dig mulighed for at installere eventuelle apps som du opretter på dine iOS-enheder.
Så tag et kig på denne webadresse, hvis du er interesseret i at gøre det.
>> Så blot et par ting om Swift selv.
Det er en kompileret sprog.
Men du vil se, at nogle af de funktioner, som vi bruger
Lad det også anvendes i en smule som et fortolket måde også.
>> En masse af syntaksen er lånt fra C. Det er baseret og skrevet i C.
Og så vil vi se, at der er en masse af grillbarer
fra din eksisterende viden fra C, som vi kan havn til Swift.
>> Men der er ting, gør det meget forskelligt fra C.
Det er meget stærkt skrevet.
Der er automatisk styring af hukommelse.
Du kommer ikke til at have til bruge malloc eller gratis overalt.
Den er designet til generalitet.
Så med andre ord, kan du bruge det i alle mulige sammenhænge, ​​fra Apple Watch
til iPhone hele vejen op til OS X, og endda nogle servere, endda nogle scripting.
Men vi vil se, at det støtte til scripting
er endnu ikke helt der som det er i andre sprog.
Så mest sandsynligt vil du være at bruge dette udelukkende til udvikling
på din Mac eller din iPhone.
>> Og det har en masse moderne funktioner.
Og en masse af disse ting er ting, vi vil forsøge at løse i dag,
men også vores emner, der helt ærligt, vi kan afsætte hele kurser.
Faktisk CS 51, som er tilbudt næste semester,
fokuserer meget på disse emner der er beskrevet nedenfor.
Så du kan bruge et helt semester forstå disse ting.
Men vi vil prøve at komme igennem dem
mindst nok, at du kan forstå, hvad der er
foregår, når du ser ved en Swift program
og være i stand til at hacke din vej igennem det for det endelige projekt.
>> Nu er en af ​​de bedste måder, du kan få yderligere oplysninger om dette
er ærligt talt blot gennem Apples forudsat dokumentation for Swift.
Der er en masse API'er der er tilgængelige.
Og det er en god base for dig at kigge efter specifikke ting, som du
ønsker at gøre med en API, der involverer iOS.
Hvis du vil bruge kameraet til eksempel, kan du begynde at kigge her,
og også bruge Google og Stack Overløb som du normalt ville.
>> Eventuelle spørgsmål vedrørende denne før vi hoppe ret i?
Okay.
Lad os gå videre.
>> Så først, jeg har en antal eksempel filer.
Og jeg har tænkt mig at forsøge at træde gennem dem relativt hurtigt.
Dette er den Hello World fil til Swift.
Det er meget simpelt.
Der er måde flere kommentarer end der er faktiske kode.
Bemærk den faktiske code er ved selve bunden på linje 14.
Der står print.
Og så er det en funktion opkald.
Vi passerer ind i det en snor kaldet Hello CS50.
Bemærk, at der er ingen semikoloner.
Bemærk, at der ikke er nogen int main.
Der er ingen af ​​de cruft som vi havde med C.
Når vi bruger Swift på denne måde, som er lige skrevet i en tekstfil
og lagres på min computer, så Jeg kan kompilere den og køre den.
>> Bemærk, at her er jeg ikke bruger CS50 IDE.
Dette forudsætter, at jeg er kører, og at jeg er på OS X,
og at jeg har Xcode allerede installeret på denne maskine for at denne
faktisk funktion.
Men dette er blot en almindelig tekstfil at vi så kan kompilere og redigere.
Så lad os se, hvordan det rent faktisk virker.
Hvad hvis jeg ønsker at kompilere det?
swiftc 1.swift.
Efter et øjeblik eller to, det vil se, at vi nu har
kompileret dette i en fil kaldet 1.
Og nu har vi trykt vores CS50, vores Hello World program snarere.
>> Læg mærke til en anden ting, som godt, er, at som standard,
vi havde ikke at indtaste a / n for at udskrive en ny linje.
Som standard print-funktionen i Swift vil udskrive en ny linje for dig.
Du kan passere en valgfri ekstra parameter for at fortælle det ikke at gøre det.
Men Google for mere information om det.
Som standard, vil det gøre de trykte linje.
>> Okay, så lad os gå videre derefter til nogle andre ting.
Så hvordan kan vi faktisk definere variabler?
Vi kan gøre det er at bruge en af ​​to metoder.
Og den, som jeg vil gerne fortælle dig om første er dette lad definition.
Og det er vigtigt fordi effektivt
hvad vi laver, er at definere en konstant.
Vi vil oprette en variabel, eller rettere en konstant kaldes navn,
give det nogle data-- i dette tilfælde strengen Dan.
Men ved at bruge denne lad søgeord, siger vi
at dette variable-- eller igen constant-- kaldes
Navnet er aldrig vil blive ændret.
Det kommer til at være uforanderlige hele varigheden af ​​dette program
eller hele varighed forbindelse
at denne variabel er tilgængelig.
>> Dette er virkelig vigtigt, at når du har nogle data, der ikke
kommer til at ændre i dit program, og du vil se en række eksempler
om, når vi ønsker at bruge Lad versus den anden syntaks,
Det er vigtigt, at du bruger lad hvor det er muligt, fordi denne Meddeler
det sprog, det er ikke kommer til at blive ændret,
og det kan rent faktisk udfører en masse optimeringer
at forbedre hastigheden og sikkerheden af ​​dit program.
Og ved sikkerheden, mener jeg ikke lade Det nedbrud med skøre fejl
at vi kunne være vant til at se i C.
>> Så kan vi bruge strengen interpolation at indkapsle dette inden for en streng.
Så vi kan se i dette print linje, udskrive hej,
og derefter bruge omvendt skråstreg åbne parens, og derefter navnet på min variable,
i dette tilfælde konstant, lukke parentes.
Jeg væsentlige derefter sætte Indholdet af denne variabel kaldet navn
inde i strengen, og derefter udskrivning resultatet der.
>> Der er en anden ændring til denne fil som er, at jeg har, helt i top,
sat i en shebang linje, der dybest set blot specificerer
at jeg ønsker at bruge Swift tolk, som
betyder, at jeg ikke længere behøver at kompilere dette program.
Jeg kan bare køre det som sit eget manuskript.
Men det er i dette tilfælde, bag scenerne bliver kompileret og derefter
køres.
Det er bare usynlige for os.
>> Okay, så lad os komme videre.
Så der er lidt af fup der lige er sket før.
Jeg viste dig, at jeg kunne definere en konstant.
Og jeg kunne give nogle oplysninger til at gøre det.
Men i dette tilfælde, bemærke, at jeg ikke faktisk specificere den type data
at det er.
Og det er fordi compiler, kan Swift
udlede den type data blot baseret på de data, jeg har lagt i den.
Fordi det ved, at ved at vurdere denne variabel lige her, disse data ret
her, det ved, at det er en streng.
Og så denne konstante navn er derfor kommer til at være en streng som godt.
>> Men vi kan også være eksplicit om den type, der er
vi kommer til at bruge til konstanter eller variable
ved hjælp af denne syntaks instead-- lad navn kolon String lig
Dan, som i dette tilfælde betyder, at vi er skal definere en konstant kaldes navn.
Det kommer til at være af typen String.
Og værdien vil være Dan.
Nu den anden måde, vi kan skabe variables--
og disse er foranderlig variabler, som betyder, at vi er i virkeligheden, vil
at ændre deres indhold engang i varigheden af ​​forbindelse
at denne variabel defined-- vi bruge nøgleordet var stedet for lad.
Men igen, som standard, medmindre du kender at du skal manipulere disse data,
forsøger at bruge lade til ydeevne.
>> I dette tilfælde kan jeg så specificere den type data
at vi forventer at være inde i denne nye variabel kaldet etiket.
Det kommer til at være en streng.
Og vi vil derefter sammenkæde to strenge sammen, strengen hej,
og strengen repræsenteret ved variabel, eller rettere den konstante navn.
>> Så dette er rart, fordi det er noget PHP ligesom i at vi
har meget let strengsammensætning.
Vi har ikke til automatisk bruge nogen form for hukommelse ledelse
at øge størrelsen og gøre nogen form for sjove ting der.
Det fungerer som vi faktisk ville forvente.
>> Okay, spørgsmål om dette?
>> Nu den anden grund til, at vi har brug for du har mulighed
at kunne definere, hvad type datavariable er
er fordi nogle gange gør vi ikke vil initialisere variabler
med nogle data på den punkt definition.
Så i dette tilfælde, lad os sige at jeg ønsker at starte indtastning
nogle kvaliteter i en karakterbog.
Jamen jeg ved, at en af ​​de variabler, som jeg ønsker at være
vil være en foranderlig karakter.
Og vi ved også, at vi ønsker det skal være et heltal.
Men måske vi ikke endnu har denne lønklasse rådighed.
>> I Swift, er du nødt til definere den type data
der er forbundet med en variabel eller en lade konstant
før du kan faktisk bruge denne variabel.
Fordi det er stærkt skrevet, du er nødt til at knytte en type
med disse variabler.
>> Så i dette tilfælde, hvis jeg har ikke ordentligt initialiseres først med en vis værdi,
så er jeg nødt til at fortælle Swift hvad Jeg forventer, at datatypen at være.
Og det kommer til at forblive samme datatype
hele historien om dette program.
>> Nu kan du måske blive fristet, så snart Jeg har oprettet denne klasse variabel
og forudsat at det et heltal på 100, nu, hvis jeg
vil forsøge at sammenkæde en streng med det heltal,
kunne være fristet til at stadig bruge at strengen Sammenkædningsoperator
ligesom vi gjorde bare et par linjer før.
Men desværre, dette vil faktisk ikke
arbejde, fordi du er hovedsagelig udfører
en operation på to forskellige typer.
>> Nu er meget forskellig fra andre sprog som PHP, som er virkelig
loosey goosey med deres slags typer.
De er ligesom, ja, uanset hvad, jeg er ligeglad.
Bare giv mig en type, og måske jeg vil gøre det rigtige.
>> I dette tilfælde er Swift ekstremt strenge om de typer
at du har at gøre med.
Denne summationstegnet eller Sammenkædningsoperator
har i det væsentlige et par forskellige mulige løsninger.
Du kan gøre summation med heltal, eller du
kan gøre snor sammenkædning, og måske nogle andre ting også.
Men hvis denne erhvervsdrivende ikke genkender hvad der er på hver side af det,
eller rettere en kombination af dem to typer, er ikke, hvad det er forventet,
så det kommer til at forårsage en fejl.
>> Så i dette tilfælde, hvad betyder det at have en streng plus et heltal?
Godt i forbindelse med dette, vi sandsynligvis vil
til at gøre en streng sammenkædning operation.
Men selvfølgelig computeren har ikke den slags sammenhæng.
Og så er vi nødt til at give at yderligere oplysninger
at lade det vide, hvad det er, at vi ønsker at gøre.
>> Så med andre ord, den omstændighed at Swift stærkt indtastet
betyder, at du nødt til at gøre en lille smule ekstra arbejde
at få det til at betjene måde, som du ønsker.
Men som et resultat, er det sikrere.
Og når du har tage hensyn til disse typer,
tingene bare ærligt starte at arbejde temmelig godt.
>> Så i dette tilfælde, vi så ville udføre snor sammenkædning
ved udtrykkeligt støbning det hele tal til en streng
ved at pakke det i denne kapital S String-funktion,
og derefter bruge strengen sammenkædning operatøren at ændre vores label variable,
og derefter printe det ud.
>> Så langt så godt?
Okay, lad os komme videre.
>> Nu er der en række data typer, som vi kan bruge i Swift.
Som du har vænnet sig til, vi kan skabe en foranderlig array.
Og at array kan kun indeholder en enkelt type.
>> Så i dette tilfælde, vil vi skabe et bevægeligt arrays af heltal, der
vi vil kalde kvaliteter, og vi vil kunne at opbevare det i denne firkant beslag
format, som du har vænnet i en række andre sprog.
Men se, at her er vi definerer et par ting.
kvaliteter er en foranderlig variable-- vi ikke bruge lad søgeord.
Så det betyder, at vi kan derefter ændre indholdet af dette array.
Det er af typen Array Int, og vi kan fortælle, at
på grundlag af disse firkantede parenteser her.
>> Nu er en af ​​de gode ting dette er, at vi
har adgang til en masse yderligere information
om array bare at bruge nogle enkle dot notation.
Så for eksempel, grades.count giver til os
antallet af elementer, der findes i det array, som vi så kan få adgang til temmelig
nemt blot at bruge, at dot notation.
>> Hvis du ønsker at tilføje yderligere elementer til denne matrix,
du kan ikke gøre PHP stil hvor du bare udtrykkeligt definere,
på et givet indeks, vis værdi at du ønsker at indsætte.
Brug i stedet append metode i array typen
at tilføje denne post, 95, til denne liste.
>> Så nu dette array har følgende contents-- 100, 0, 90, 85.
Og nu har vi vedlagt 95 til, at så godt.
>> Der er andre måder Vi kan tilføje ting.
Du kan faktisk bruge en summationstegnet,
som vil blive fortolket som et array append operation.
Og du kan derefter tilføje en anden array, hvis indhold er 70 og 80,
til den opstilling.
Så nu har vi den Indholdet i denne variabel
grades-- 100, 0, 90, 85, 95, 70, og 80.
Dette er blot et dejligt lille syntaktisk sukker, Swift giver til os.
>> Så hvis vi ønsker at opsummere den kvaliteter, men vi er måske
vil ønsker at gentage over hver post i denne løkke.
Og vi har i Swift, begrebet af en for-løkke, som du ville forvente.
Men den måde, at vi angiver et område er lidt anderledes.
Så i dette tilfælde, at opsummere alt, vi får
kommer til at oprette en midlertidig variabel kaldet sum for at vi
at opretholde denne tæller.
>> Og bemærk vores for loop byggeri her.
For indekset i 0 .. <grade.count.
Så denne konstruktion, 0 .. <grades.count er en serie operation, hvor vi er
sige, at vi kommer til at skabe en række tal fra 0 op
til, men eksklusive grades.count.
Så det vil være 0, 1, 2, 3, 4, 5, indtil men mange én
før grades.count.
>> Så dette er anderledes end hvordan vi ville typisk anvendes til løkker
hvor du ville have nogle indeks variabel, sæt den lig med 0 i første omgang,
og derefter integrere det indtil nogle værdi under optællingen af ​​emner
i den opstilling.
>> Så der er en ændring til dette, faktisk,
som giver os mulighed for at meget nemt indstille forskellige typer intervaller.
Hvis du ændrer dette interval til tre prikker, 0 ... grade.count,
dette repræsenterer intervallet 0 at grades.count inklusive,
således, at denne række er også derefter inkluderet i dette område.
>> Men det er meget praktisk for netop disse ting,
når vi nødt til at udføre iterationer end løkke
fordi disse indekser er nul indekseret, som vi har set på andre sprog
samt.
Eventuelle spørgsmål vedrørende denne for løkke?
>> Så der er implicit definition af dette indeks variable,
hvis værdi begynder ved 0, og fortsætter ved hver iteration loop
at stige med 1 indtil et punkt der er lig med grades.count,
på hvilket tidspunkt, løkken afbryder.
>> Bemærk, at i vores snor Interpolation her,
Vi kan faktisk udføre nogle simple manipulationer af disse værdier.
Så indeks plus 1 vil faktisk udføre en opsummering af denne værdi
fordi indekset er i dette tilfælde et heltal.
Og på det tidspunkt, vil det derefter omdannes til en streng
og interpoleret i denne streng her, og udskrives som vi ville forvente. .
>> Og det gode om arrays her er
at vi også i stand til at have Henter værdier og indstillingsværdier
ved hjælp af den firkantede beslag notation som vi har set på andre sprog så godt.
>> Okay, så herfra, vi nu beregne summen af ​​vores alle vores kvaliteter.
Nu slags næste logiske skridt ville være
til at gøre en division for at finde ud gennemsnittet af disse kvaliteter.
Men noget vigtigt her sker der
er, at denne sum er måske et heltal.
Men vi er nødt til at udføre nogle slags dobbelt division.
Og det vil være yderst vigtigt, når
vi ønsker at udføre denne operation, fordi det, vi siger
er, at vi er nødt til rent faktisk at udføre division på to dobbeltværelser.
Og igen, fordi Swift er meget stærkt skrevet,
må vi udtrykkeligt angive alle de elementer til doubler, før vi faktisk
udføre denne operation.
>> Så for at vi kan udføre dobbelt division,
det er ikke tilstrækkeligt, at bare én af disse elementer til at være en dobbelt.
Begge af dem er nødt til at være en dobbelt, for hurtig
at være sikker på, at dette er, hvad vi ønsker at gøre.
Så vil vi så eksplicit typecast det beløb, som vi har beregnet ovenfor
og optællingen af ​​kvaliteter til doubler, og derefter udføre denne operation og butik
at i denne nye variabel, eller rettere denne nye konstant kaldes gennemsnit
som vil have, hvilken type, du forestiller dig?
Dobbelt, ja.
Så i dette tilfælde, vi behøver ikke at angive det
fordi det kan udledes af den drift, hvilken type gennemsnit data
vil blive.
Og Swift er generelt temmelig god om at kunne udlede de typer.
>> Har du lyst til at se denne køre, eller kan jeg komme videre?
Jeg ønsker at holde ud.
Eventuelle spørgsmål om noget af dette?
Alle tiders.
>> Nu vil vi begynde at komme til de gode stuff-- definerende funktioner,
og et par andre typer, der er unik for Swift, som du ikke har
set på andre sprog indtil dette punkt,
men de er til stede i andre sprog, som du måske vil finde senere.
Så først, hvis du ønsker at definere en funktion,
du definere det med funky ord funktion, og derefter funktionen navn,
og derefter i parentes, argumenterne som du ønsker denne funktion til at acceptere.
Argumenterne skal også specify-- generally--
skal også angive, hvilken type data, som de er, medmindre de kan udledes.
Og vi vil se, at lidt advarsel i bare en lille smule.
>> Så i dette tilfælde har vi en funktion kaldet printGradeCount.
Vi kommer til at acceptere en variable-- eller rettere i dette tilfælde,
en constant-- kaldet gradebook.
Og det vil være af skriv vifte af heltal.
Nu er der noget det er virkelig vigtigt her
at jeg vil have dig til at forstå.
Det er, at som standard, disse argumenter som er input til denne funktion er
defineres med en implicit lad søgeord, hvilket betyder, at jeg ikke kan ændre dette
Karakterbog variabel her.
Og den slags giver mening, fordi du passerer data.
Og du måske ikke ønsker det ændres fra under dig.
Det er muligt at eksplicit nævne at dette er en variabel ved at sætte
Var nøgleordet her.
Men det er en gotcha, at vi har bemærket folk har gjort i fortiden
er, at de antog, at det vil at være en variabel, når det i virkeligheden er det
er en konstant.
>> Okay, så her så i dette tilfælde, vi er ikke specificerer nogen tilbagevenden type.
Vi viser dig, hvordan du gør at på bare et øjeblik.
Men se, at her har vi blot en enkel, hvis tilstand.
Hvis gradebook er tomme, som i dette tilfælde
er blot den ejendom af denne heltal array, så vi udskrive noget.
Ellers gør vi noget andet.
>> Temmelig ligetil hidtil tror jeg.
Men stoppe mig, hvis du har spørgsmål.
>> Nu er denne funktion, gennemsnit, tager også nogle argumenter, eller snarere et argument,
som er gradebook, og denne gang kommer til at vende tilbage en dobbelt type.
Fordi det er computing gennemsnittet, og det er
vil faktisk tilbage at beregnede gennemsnit til den kaldende linje.
>> I dette tilfælde vi specificere returnere typen efter en pil.
Og dette kan føle lidt underligt i starten.
Du har vænnet til indstilling af afkast
indtaste, før navnet på funktionen.
Men hvis du tænker på dette i form af matematik,
ligesom når du har matematik at definere en funktion,
du har en funktion med nogle input, og det frembringer et udgangssignal.
Og det er præcis, hvad dette formodes at efterligne.
Og der er et par andre sprog der har lignende syntaks så godt,
men sandsynligvis ingen, du har set i CS50.
Men stadig ikke forveksles med det.
Pilen betyder, hvad der foregår skal returneres i dette tilfælde.
OK, så hvordan skal vi at beregne dette gennemsnit?
Tja, hvis gradebook er tom, ja så er vi
kommer til at vende tilbage 0, hvilket måske en fornuftig måde at behandle dette.
Jeg ved det ikke, lad os komme tilbage til om lidt.
Dette kan faktisk ikke være en rimelig måde
at beregne et gennemsnit, hvis vi har en tom gradebook.
>> Så vil vi blot udføre vores opsummering.
Bemærk, at her vi faktisk har en alternativ version af en
for-løkke, som giver os mulighed for at gentage over hver enkelt element i et array
og placere hvert element i sit eget variabel.
Ved at angive for lønklasse i Karakterbog, hvad vi siger
er, at vi kommer til at implicit oprette en ny konstant kaldet
klasse, der vil repræsentere hver unikt element i gradebook
hver gang, at den for loop gentager.
Så første gang, det køres, grad vil
være det første punkt i Karakterbog.
Den anden gang, det vil være den andet punkt, så videre og så videre
indtil gradebook har udtømt sig af elementer.
Så vil vi være i stand til at opsummere, at kvalitet ind i vores summation variabel
og returnere vores gennemsnitlige som vi har set før.
OK, nogen spørgsmål?
Ja?
PUBLIKUM: Jeg har to spørgsmål.
Nummer et, hypotetisk, kan du kører heltal på denne ene?
Behøver ikke at være en dobbelt, er det korrekt?
DAN AMRMENDARIZ: Kan du gentage det spørgsmål?
PUBLIKUM: Kan jeg gøre heltal som gennemsnittet?
DAN AMRMENDARIZ: Kan du gør heltal som et gennemsnit?
Så returnere et heltal gennemsnit i stedet for en dobbelt?
>> PUBLIKUM: Return-- dig har at lige nu nedenfor.
DAN AMRMENDARIZ: Lige her, returnere 0,0?
PUBLIKUM: Ja, bare returnere 0.
Så det vil være enten 80 eller 85, men ikke 85,2.
>> DAN AMRMENDARIZ: Så i dette tilfælde, så der er et par forskellige måder
at besvare dette.
Lad mig besvare dem i orden.
Så hvis jeg bare gøre denne tilbagevenden 0, et 0 er en heltalsværdi.
Og så vil medføre en typen fejl for denne sag
fordi det forventer en dobbelt men derefter returnere et heltal.
Hvis jeg ønsker at vende tilbage et heltal, kan jeg.
Jeg kan indstille returtypen at int, returnere 0 her,
og ikke udføre dobbelt division.
Men så ville vi være gør heltal division.
Og så vi så ikke ville få den gennemsnit, at vi overhovedet ville forvente.
Men ja, vi kan ændre typerne på den måde.
>> PUBLIKUM: Og for det andet, du har den ene dobbelt på toppen.
Men dernede, når du gør returnere Dobbelt,
det er allerede automatisk tilbage Double format.
Hvorfor har du stadig nødt til at definere det med pilen på toppen med en Double?
>> DAN AMRMENDARIZ: Så i tilfælde, dette er en del
af til-- så at gentage spørgsmålet, fordi det er implicit fra afkastet
typer her, hvilken type det faktisk er vi nødt til at være eksplicit med Swift
om, hvad vi ønsker at tilbage ud af denne funktion
således at når den udfører skrive kontrol, kan det sørge for
at det, vi rent faktisk har skrevet ned under faktisk svarer til denne.
Så det er lidt ligesom en check med dig selv slags situationer.
Men der are--
>> PUBLIKUM: [uhørligt] pil?
>> DAN AMRMENDARIZ: Der er tilfælde, hvor vi kan angive, at vi kan implicit
indstille returtypen.
Men i dette tilfælde, det gør jeg ikke tror, ​​det ville fungere.
Der er nogle andre syntaks at vi vil se senere.
>> Okay, så denne kilde kode er en lille smule anderledes
fordi dette analyserer argumenter fra den funktion, som vi kalder.
Lad mig vise dig, hvordan det fungerer før vi faktisk går videre
til nogle interessante ting der sker i Swift.
>> Så i dette tilfælde, hvis jeg bare køre dette kode, bemærke, at hvad den gør
is-- mens den slags giver mig en underlig fejl.
Jeg har brug for at give det et par heltal som en kommandolinje argument.
Så lad os se, 150 og 80, og hit Enter at finde ud af, hvad det faktisk gør.
Det accepterer hver af disse værdier som hele tal.
Det er indlæst dem i en gradebook.
Og så er det at udføre at den gennemsnitlige beregning
og udsende det som vi ville forvente.
>> Men selvfølgelig er der noget at gå med denne afvisning noget
noget som et heltal.
Som du måske husker fra da vi var beskæftiger sig med kommandolinjeargumenter
i C og andre sprog, den allerførste 0-th element i den kommandolinje argument
Listen er navnet på kommandoen at vi faktisk udføres.
Så i dette tilfælde, jeg bare looping over alle kommandolinjeargumenter.
Men jeg laver ikke nogen form for fancy kontrollere at springe over, at første.
Jeg er bare eksplicit eller jeg er implicit kontrol, hvilke af disse typer
er heltal før jeg faktisk udføre denne beregning.
>> Og det er væsentligt hvad der sker her.
For hver argument den proces argumenter,
Jeg har tænkt mig at udføre nogle check.
Og i dette tilfælde, vil jeg at prøve først at omdanne
dette argument til et heltal af udføre en eksplicit typecast,
fordi det er på input, en snor og ikke i virkeligheden et heltal.
>> Men det er lidt af en underlig syntaks, hvis lad kvalitet lig Int (argument).
Hvad der faktisk sker her er yderst
vigtige for din hjælp Swift.
Det er ved hjælp af, hvad der er kaldes en valgfri type.
>> Så denne funktion, Int (argument), returnerer ikke bare et heltal, men vender tilbage
hvad der kaldes en valgfri heltal.
Og så dette er slags en type på toppen af ​​en type.
Du kan slags forestille mig det ligesom det er tilbage som en pakke.
Og når du åbner det pakke, enten
har et helt tal, der er resultatet, eller det har absolut intet i det overhovedet.
Og det er nyttigt som en fejl kontrol mekanisme, fordi der i dette tilfælde
Vi kan finde ud af, det var typekonvertering succes?
Hvis det var, så er det i virkeligheden vil have et helt tal indeni.
Ellers er det kommer til at have nogle værdi, som vi vil kalde taget nul, hvilket
repræsenterer ingen heltal overhovedet.
Det er virkelig repræsentant for ingenting.
>> Og så dette, hvis konstruktion tillader os at pakke pakken,
at valgfri binding.
Og hvis vi er i stand til at pakke, at pakke og finde et heltal inde,
så hvad vi siger her er, at vi vil derefter
tillader denne værdi skal indstilles til denne konstant kaldet klasse.
Og denne del af, hvis udsagn, den øverste del af den, hvis udsagn
vil køre, fordi det pak lykkedes.
>> Hvis det bare så sker det, at der opstod en fejl måske
i denne eksplicitte typekonvertering fra en streng til et heltal, måske
det er værdien ABC f.eks.
Og det er faktisk ikke vil konverteres til et heltal.
Så det vil vende tilbage nul, som ikke er et heltal.
Og dette, hvis udsagn godt derefter mislykkes.
klasse vil ikke eksistere, fordi det har ingen heltal indhold.
Og det vil køre denne ellers blok i stedet.
Ja?
>> PUBLIKUM: Nil er N-I-L?
DAN AMRMENDARIZ: nul er N-I-L, ja.
>> Så det er måske en af ​​de sværeste ting om Swift,
især når du er i ukrudt på en iOS-app
og du er faktisk forsøger at gøre nogle udvikling der.
Det kommer til at være råben på dig om valgfri.
Det kommer til at spørge dig om spørgsmålstegn og udråbstegn.
Men når du regne out-- hvis du afsætte lidt tid til at finde ud af
hvad der sker med valgfri typer, vil du spare dig selv en masse hovedpine
som du forsøger at skrive en app i Swift.
>> Det er faktisk en meget kraftfuld funktion.
Og du vil bare nødt til at tage mit ord for det for nu.
Men vi vil se denne konstruktion og nogle andre kan lide det
i nogle af de andre kildekode, vi vil vise dig i bare en lille smule.
>> Er der nogen indledende spørgsmål her?
Så det vigtige takeaway er, at en valgfri type er en slags metatype.
Det enten har en værdi, og hvis den gør, så er det
vil måske have denne værdi er forbundet med det, eller det har overhovedet ingen værdi,
og er repræsenteret ved nul.
Resten af ​​dette er måske som du ville forvente.
>> Så lad os rampe op vanskeligheder endnu en gang.
Og denne gang, lad os tage et kig på nogle andre typer, der rent faktisk eksisterer data.
En af dem er ordbøger, som er meget lig Python ordbøger.
Det er noget der ligner en hash tabel i C. Det er hovedsageligt en kortlægning af nøgler
hvor nøgler kan være strenge.
Og når man ser op disse nøgler, disse nøgler vil have en værdi.
Så det er ikke helt et array, men i stedet, mere tæt forbundet
til en hash kort eller et hashtabel.
>> Lad os se, hvordan dette er meningen til at arbejde, før vi faktisk
gå i kildekoden selv.
Hvis jeg bare køre dette, intet virkelig sker.
Det fortæller mig, at jeg forventer nogle parametre af følgende type.
Så jeg har tænkt mig at give det nogle problem sat navne,
så pset0, måske jeg fik 100.
Og pset1, fik jeg en 5.
Og derefter på den eksamen, jeg gjorde det rigtig godt og fik 30.
Og ups, jeg ramte en plads her.
>> Når jeg ramte Enter, kan du se det udfører en beregning.
Den siger gradebook er tre kvaliteter, pset1, pset0, eksamen.
Og gradebook har denne særlige gennemsnit.
Så igen, vi arbejder med denne gradebook idé,
men vi vil fortsætte iteration med kompleksiteten i vores funktion.
>> Så i starten, vi er bare kommer til at oprette en funktion,
er ansvarlig for trykning af brugen.
Og der er denne udgang funktion, som vil bare
magt afslutte programmet.
Det er ikke noget, , du vil bruge i iOS-app.
Dette er kun i dette tilfælde, med en kommandolinje argument.
Næste vil vi begynde at bevæge sig i retning Xcode.
Men det er specifikt for en kommando line stil program i Swift.
>> Lad os tage et kig på nogle af de interessante ting her.
Lad os se, kun et par interessante ting at nævne måske
er, at i min funktion udskrivning af antallet af karakterer,
du måske huske, at jeg havde denne liste af items-- pset1, pset0, og eksamen.
Du kan faktisk hurtigt og nemt gøre dette
ved at tage gradebook, som er en ordbogen som har nøgler og værdier.
Find alle af nøglen er gennem Prikken nøgler metoden her,
og derefter bruge denne joinWithSeparator, som derefter vil tage alle nøglerne
at vi havde skrevet i, pset1-- eller undskyld, pset0, pset1, og exam--
og sammenkæde dem sammen ved hjælp af et komma og et mellemrum
at oprette en lang streng.
Dette slutte operation er bare fænomenalt nyttige i en række sammenhænge.
Og så er det denne joinWithSeparator.
>> Og det er en ting, der er ændret fra Swift 1 til Swift 2.
Der plejede at være en Python style-- hvis du er
fortrolig med Python-- en Python stil slutte metode på strenge.
Men det er ikke længere tilfældet i Swift 2.
Du ønsker at bruge dette, hvis du vil at sammenkæde en række ting
sammen med en snor.
>> Så måske så i vores diskussion af gennemsnittet før,
det gør lidt mere mening for os at sætte den gennemsnitlige funktion
at være en valgfri dobbelt snarere end blot en eksplicit dobbelt.
Fordi vi havde at usædvanlig tilstand, hvor,
hvad nu hvis gradebook faktisk har ingen værdier inden det?
Hvad skal det gennemsnitlige afkast?
>> Nå måske i C du ville have gjort noget
ligesom forudsat en sentinel værdi, ligesom 0,0, eller måske et negativt tal,
eller noget blot repræsenterer det faktum at der var nogle fejltilstand
og du måske ikke rent faktisk har evnen til at beregne gennemsnittet.
Nå skønhed angive en valgfri type ville være at gøre det.
Og jeg nu siger alle disse Ord, men dette rent faktisk ikke bruger optionals.
Men vi vil se, at i blot minutter, hvor vi kan indstille gennemsnit
at være en valgfri datatype, så hvis det rent faktisk returnerer nogle data, så
vi vil vende tilbage, at data.
Ellers vil vi vende tilbage nul, siger, at dette
ikke har nogen meningsfuld beregning.
>> Lad os gå videre til noget andet.
Så herfra, har vi kigget på alle disse eksempler i kommandolinjen.
Men virkelig, hvad du vil til at beskæftige sig med, er Xcode.
Og en af ​​de gode ting ved Xcode er, og specielt i Swift,
er, at vi har denne ting kaldet en legeplads.
Og en legeplads er slet ikke en iOS-app.
Men det giver dig mulighed for at eksperimentere med Swift i en meget nem måde.
Du kan indtaste alle dine kode.
Det er pænt syntaks i fremhævet her.
Når du opretter en ny fil, vil det bede dig, hvis du vil oprette en legeplads.
Men det gode ved Playground er, til højre for dit vindue,
betyder det faktisk vise dig output fra din kode.
Så hvis jeg rulle ned, kan vi se, hvad der produktionen af ​​forskellige linjer kode
faktisk sker for at være.
>> Så i dette tilfælde, vil vi ændre retninger bare en lille smule
og taler om noget, der er virkelig vigtigt at dette høje niveau måde
at Swift opererer, og det er denne idé om lukninger.
Og du har sikkert set dette en lille smule i JavaScript.
For dem af jer, er i CS50, lukninger
er meget populære, meget god måde at gøre højt niveau ting i moderne sprog.
Men det er også slags vanskeligt at wrap dit hoved omkring første gang.
Så hvis du ser på denne første gang, det er OK.
Bare se på kildekoden og se hvis du kan finde ud af det derhjemme.
>> Så i dette tilfælde, lad os sige, at vi ønsker at skabe en masse eksponenter
med nogle fast værdi.
Så i dette tilfælde kan jeg oprette en funktion.
Jeg har tænkt mig at kalde det magt 2 hvis eneste formål i livet
er at tage nogle input og dobbelt det, og returnere denne værdi.
Bemærk, at her er jeg at acceptere én type data.
Det kommer til at være en variabel kaldet x.
Det er af typen dobbelt.
Og jeg har tænkt mig at returnere en dobbelt her.
Og jeg bare gøre et meget ærligt, pretty
naiv måde at fordoble denne værdi.
Og jeg vil vise dig, hvorfor dette er nyttig i bare et sekund.
>> Bemærk, at her har vi denne serie igen. efter noget i 1, prik
dot dot, 2, hvilket betyder, at denne løkke vil køre to gange.
Men dette repræsenterer en dummy variabel.
Det betyder, at jeg er ikke rigtig kommer til at bruge denne variabel overalt
inde i denne sløjfe.
Jeg vil bare have denne linje kode til at køre to gange,
uden at behøve at kende værdien af ​​dette interval.
>> Så i dette tilfælde jeg kører resultat gange to gange på x, som i det væsentlige
betyder, at jeg kvadratur denne værdi.
Og det sker til arbejde som vi ville forvente.
Power of 2, der passerer en værdi på 2,0 giver os en effekt på mindst 4.
3.2 værker for 10,24.
>> Nu kan vi gøre en lignende ting om magten på 3.
Men nu kun ændre området.
For dummy variabel i 1 gennem 3, gange 3 gange,
og gøre det samme.
>> Så det kan føle sig lidt forceret.
Men der er en vigtig ting her som
er, at se på disse to funktioner, der er
kun én ting, der er anderledes, som er denne værdi i området.
Alt andet om disse to funktioner, magt på 3 og effekt af 2,
er faktisk identiske, fordi de arbejder på samme måde.
>> Så på dette punkt, lidt alarmklokke skal gå af.
Forhåbentlig, hvad du siger, du ved, det føles en lille smule
ligesom dobbeltarbejde.
Måske er der en måde, at jeg ville kunne indkapsle alt dette
og giver en funktion eller oprette en funktion,
gør præcis, hvad jeg vil, uden brug for at skrive det ud eksplicit.
Og dette er, hvad magt af en lukning giver os mulighed for at gøre.
Så lad os tage et kig på denne.
Og jeg vil tilbringe et par minutter på denne, fordi dette
er temmelig vigtigt for Swift.
Vi ser det hele tiden.
Vi kommer til at definere en funktion.
Det kommer til at blive kaldt powerOf.
Det kommer til at acceptere en parameter kaldet y af typen Int.
Men tag et kig på afkastet type.
Afkastet type er, i parenteser, Dobbelt pil Double.
Hvilket betyder, at denne funktion, denne funktion powerOf,
returnerer en funktion.
Det er at acceptere en Double og returnere en dobbelt.
Så det lyder måske slags skøre, men lad os rulle ned en lille smule
og se på, hvad der sker.
Vi er inde i denne funktion powerOf.
Vi skaber en ny funktion kaldet exponentiator,
men det er ligegyldigt, hvad det er.
>> Læg mærke til, at dette har et input værdi af x.
Og det tager i et dobbelt og returnere en dobbelt.
Og det er den samme kode, som vi så ovenfor, bortset fra, at værdien af ​​2
eller værdien af ​​3, at øvre grænse i dette område,
er blevet erstattet med denne værdi af y, som
var den oprindelige parameter vores powerOf funktion.
Og på dette punkt, vi returnere exponentiator.
Vi vender tilbage funktionen.
>> Det er lidt ligesom en lille sind blæser.
Men lad os forestille os, hvad der sker når jeg kalder denne funktion powerOf
og passere ind det en vis værdi som 2.
Hvad dette betyder, er, at Jeg har nu værdien
2 for y, hvilket betyder, at denne værdi å i denne exponentiator funktion
vil være, at værdien 2.
Men jeg returnere dette exponentiator funktion.
>> Så mærke til, hvad Swift siger jeg har skabt i dette tilfælde.
lad kvadrat er en definition, er det en funktion, der accepterer en dobbelt
og returnerer en dobbelt.
Jeg har oprettet en funktion at firkanter noget
ved hjælp af denne mekanisme lige her.
Og virkelig, hvad der sker, er at det vender tilbage denne funktion
exponentiator, men denne værdi y er pakket inde i den.
Og så nu hver gang jeg bruger denne variabel eller denne konstant kaldet
firkantet, det går det at opføre sig som en funktion.
Og så jeg kan derefter kalde denne variabel ligesom jeg ville kalde en funktion,
og passerer ind i det et nummer, som i dette tilfælde 3.
Og jeg vil så firkantet denne værdi.
Så 3 kvadreret vil derefter bliver 9, som vi kan se her.
>> Virkelig vanvittigt, men dette nu giver mig mulighed for
at skabe andre powerOf funktioner.
Ligesom jeg kan sige, OK, godt nu ønsker jeg at oprette en ny funktion, powerOf (3),
og gemme det i en konstant kaldes terning.
Og nu terning bliver en separat funktion som også vil
tage en vis værdi som input og kube, værdi, som vi kan se i den nederste linje
her.
terning af 2 vil resultere i 8.
>> Forhåbentlig temmelig pæn ting.
Du har aldrig set det før.
Jeg vil opfordre dig til at se på lukninger og undersøge dette lidt mere.
Det er virkelig kraftfuld ting, vi ser en masse i JavaScript og nogle andre sprog.
Det er virkelig vigtigt at forståelse API samt
at vi vil komme til at på bare et sekund.
Ja?
>> PUBLIKUM: Når du gør powerOf (2), parentes, og derefter
anden parentes, en anden input-- du dybest set erstatte pladsen.
DAN AMRMENDARIZ: Så kig i allersidste linje her.
Det er faktisk helt muligt at gør at kæde som du foreslog.
Så powerOf (5) betyder, at vi skal hen at have en exponentiator af 5 heroppe.
Så dette er hovedsagelig vil være det samme som 4 til femte strøm,
fordi vi har skabt et exponentiating fungere til femte strøm,
og vi passerer ind der fungerer værdien 4.
Og vi får denne værdi at vi forventer, 1024.
PUBLIKUM: Og det er ikke et navn, så det gør det nemmere
at læse, pladsen uanset hvad.
>> DAN AMRMENDARIZ: Right, nøjagtigt.
Så før jeg bare sætte det i en konstant her så
at det gjorde det nemt at bruge det navn.
Ja?
>> PUBLIKUM: I denne sammenhæng powerOf, det er en del
af programmeringssproget i modsætning til den måde, du
tænk på powerOf i [uhørligt]?
DAN AMRMENDARIZ: Så i dette tilfælde, powerOf
er simpelthen navnet på den funktion, som jeg definerede heroppe.
Så det er ikke iboende til selve sproget,
men i stedet, det er bare en funktion, der har
det navn, fordi jeg giver det det navn.
Andre spørgsmål?
Okay.
>> Nu er dette er stor.
Men du kommer ikke til at se en masse lukning funktioner,
er ligesom dette, hvor du definerer, inde af én funktion, en anden funktion.
Og du kan gøre det.
Men det er slags ikke virkelig nødvendigt, ikke?
Ligesom hvorfor jeg definere denne funktion kaldet exponentiator
og derefter straks returnere den.
Hvorfor kan jeg ikke bare med det samme returnere denne funktion?
>> Og i virkeligheden, det er netop ideen bag et koncept kaldet
anonyme funktioner, hvor anonyme funktioner faktisk ikke
har et navn, fordi de behøver ikke at have en.
Og så i dette tilfælde, i 7B, vi kan finde netop det.
Det er alle den samme kode, gør præcis det samme,
men nu har vi ændret det lidt, så at denne powerOf straks,
returnerer en funktion.
Bemærk, at efter tilbagevenden, der er en åben krøllet beslag.
Det forventer denne indgang Dobbelt.
Det forventer, at produktionen Dobbelt.
Og så i nøgleordet adskiller selve koden.
Så dette er en anonym funktion.
Det behøver faktisk ikke har et navn, mens før det blev kaldt exponentiator.
Men som vi så, bare virkelig ikke henvise til exponentiator
uden for denne funktion.
Så det gjorde ikke noget.
Så denne anonyme funktion er såkaldte fordi det er navnløs,
men det er stadig bliver brugt i forbindelse med denne kode.
>> De næste par dem jeg er vil fortsætte forhåbentlig
blæser dit sind en lille smule.
Vi kan forenkle dette endnu mere.
Fordi som var astutely påpegede tidligere,
måske vi faktisk kender, ved udlede denne kode, hvad
produktionen af ​​denne kode vil være.
Og i virkeligheden, i denne anonyme funktion, Vi kan faktisk udlede de typer af data.
>> Så i denne ene, vi ikke længere nødt til eksplicit at definere
den type data, der bliver input og output fra denne funktion
for et par grunde.
Den ene er, at vi har defineret, op på den prototype af den omsluttende funktion,
hvilken type data denne anonyme funktionen skal input og output.
Og fra den anden, vi kan udlede koden
ned her, at vi accepterer input, der er af typen Dobbelt
og returnere en dobbelt.
>> Bemærk, at vi her ikke har eksplicit defineret navnene på de argumenter
at denne funktion er at acceptere.
Og så ser vi, vi kan henvise til disse parametre ved hjælp $ 0, $ 1,
så videre og så videre, afhængig af antallet af denne parameter anvendes
i denne funktion.
>> Det er noget, som du vil at se en masse er denne åbne krøllet beslag
definition efterfulgt af en $ 0, og derefter nogle drift,
og derefter en lukket krøllet beslag.
Det er en anonym funktion der udfører denne operation.
Det har denne parameter, hvor det er type er udledes.
Det første parameter er $ 0.
Og nogle operation er sker på det $ 0.
>> PUBLIKUM: Så dollartegn betyder parameter som udgangspunkt,
og 0 betyder den første?
DAN ARMENDARIZ: Det er korrekt.
Så dollartegn dybest set betyder parameter, og 0 betyder den første.
Men det fungerer specifikt i dette tilfælde, hvor jeg ikke har navngivet
argumenterne i mit anonyme funktion.
>> PUBLIKUM: Er Perl eller noget har denne dollartegn, dollar 0 derinde?
DAN ARMENDARIZ: Er der, jeg er ked af?
PUBLIKUM: Er Perl har denne dollaren 0, dollar 1--
DAN ARMENDARIZ: Jeg er ikke alt for bekendt med Perl,
men PHP hvad definerer variabler baseret på dollartegn.
Og der kan være nogle sprog der har funktioner som denne.
Faktisk Swift låner masse funktioner som denne
fra en masse andre sprog.
Vi ser antydninger af Python i det.
Denne definition af type synes at komme fra OCaml.
Og vi har bare en hel masse ting fra masser af forskellige sprog.
Det er en af ​​de nice ting om Swift
er, at det tager en masse af de bedste ideer fra en flok af sprog
og skohorn dem alle sammen i en super sprog.
Faktisk, hvis du tillader mig at fortsætte med at blæse dit sind,
så vi har gjort alt dette.
Vi kan måske forenkle denne lidt bit ved at indse, at, selvfølgelig,
Swift har en exponentiating funktion indbygget.
Hvis jeg importere Darwin, som er blot det bibliotek,
udstyret med denne funktion kaldes pow, nu Jeg kan forenkle min magt for funktion
til at være følgende.
Det vil vende tilbage disse anonyme funktion.
>> Men se på, hvordan enkle det er nu.
Dette er en anonym funktion, accepterer en form for data,
og det vil være en argument specifikt
refereres på $ 0 der er af typen dobbelt.
Det kommer til at returnere en type dobbelt.
Men afkastet erklæring nu implicit.
>> Og det er netop denne stil, der er meget, meget udbredt i Swift,
over det hele.
Vi kommer til at se denne hele tiden i Swift.
Så jeg viser alt dette til du på grund af denne syntaks.
Dette er meget almindeligt at se, hvilket betyder, at det
er en anonym funktion der udfører
nogle operation på disse argumenter.
Og der er en implicit afkast.
Så det er absolut det samme for os at sige det, lige her.
>> Fordi denne krøllede beslag er en funktion,
vi er udføre denne operation på det første argument.
Vi kommer til at returnere det.
Men denne ydre afkast er tilbage, at hele funktionen,
at hele anonym funktion at vi netop har oprettet.
Andre spørgsmål?
Okay, jeg ved ikke, om du fyre er klar til dette,
men vi kan gå endnu mere skørt med Swift.
Er du klar?
OK, det er fantastisk.
>> Nu vi faktisk har mulighed til, i Swift, på grund af hvordan modulær
og hvordan protokol baseret det er, at definere vores egne freaking operatører.
Ligesom i dette tilfælde, havde vi ingen operatør for exponentiation-- godt,
til at udføre beføjelser noget.
Men jeg kan, i Swift, definere et nyt operatør, der gør netop det.
Så i dette tilfælde er der en flok af syntaks her.
Og jeg vil give dig mulighed for at se på det hjemme, når man ser på dette.
Men vi definerer denne Infix operatør, **, som derefter vil give os mulighed for,
ved at definere, hvad det funktion ** faktisk
betyder, at acceptere en venstre hånd side og en højre side,
og derefter at returnere eksponenten af ​​denne venstre side til højre side.
>> Og så nu lige pludselig, jeg har skabt en ny tæller.
Så 2 ** 3 betyder 2 til den tredje magt.
[Husk blæser SOUND] Dette ved selv bør gøre dig være ligesom,
OK, skrue C. Jeg har tænkt mig Swift hele vejen.
Det her er godt.
Dette er temmelig fantastisk.
>> Selvom dette er et godt eksempel.
Men jeg har aldrig en gang udenfor i dette eksempel faktisk
defineret min egen operatør.
Men stadig, det viser en masse af magt Swift
og hvorfor det er faktisk virkelig meget cool.
OK, ja?
PUBLIKUM: Hvis du er definere din egen operatør,
hvordan kan du vide, at du ikke ved et uheld forsøge at skabe en operatør, der er
i et sted i C, som skjult et sted i Swift,
som en obskur, du måske ikke har set før.
>> DAN ARMENDARIZ: Så hvis du forsøger at definere dine egne operatører,
der er risiko for at definere en over en eksisterende operatør.
Det går ind i en detaljeringsgrad, Jeg tror ikke, vi har tid til at gå over.
Men det er en risiko.
Og det er i virkeligheden selve grunden Jeg brugte ikke indsætningstegn symbol, som
når vi skriver ud magt, vi normalt bruge 4 lidt indskudsmærke 5 eller noget
sådan, netop når vi er Gchatting venner eller hvad.
Men i dette tilfælde, der rent faktisk ville have forårsaget en kollision.
Og så jeg undgik det, bare fordi Jeg sket til at vide, i dette tilfælde
at det ville medføre, at kollision.
>> Okay.
Nu desværre, for de sidste syv minutter,
Jeg er nødt til at holde blæser jeres sind en lille smule.
Så tillad mig at vise dig nogle andre ting også.
>> Vi har vist dig denne idé om have disse anonyme funktioner,
disse lukninger, der giver dig mulighed for at slags pass funktioner rundt.
Du kan returnere dem.
Du kan manipulere dem.
Du kan gøre alle mulige skøre ting.
>> Men en anden ting, sker for at være nyttige
er evnen til at, i modsætning til at returnere disse funktioner
i en funktion, til at passere en funktion som en parameter til en anden funktion.
Du kan tænke godt hvorfor på jorden ville jeg ønsker at gøre sådan noget?
>> Nå, lad os sige, at jeg vil have at tage denne operatør, som jeg
arbejdet så hårdt for at skabe og anvende det til en masse forskellige numre
i et array.
Så i dette tilfælde har jeg en bred vifte af integers-- 1, 4, 7, 2, 5, 10, 56.
Og jeg ønsker at fordoble dem alle.
Den måde, som vi ville typisk gøre det er bare at skrive
en simpel for løkke, gentager end dem alle
og udfører en slags firkantet drift over dem,
indlæsning af disse nye værdier i en ny variabel, eller rettere, en ny matrix her.
Og værdien af ​​produktionen af Resultatet er derefter alle disse arrays,
eller rettere alle de elementer nu potens.
>> Og vi kunne gøre det samme ting for cubing det,
men lidt alarmklokke bør være at gå ud
siger, at måske er der en måde, som vi ville
kunne forenkle denne lidt.
Og i virkeligheden er der.
Hvad hvis vi kunne skabe en funktion, der giver os
at acceptere, som et rovdyr, en funktion?
Så i dette tilfælde, tage en se på disse argumenter.
Vi kommer til at acceptere en liste over double.
Og så vil vi at acceptere en funktion
i en variabel kaldet f, der vil at tage en dobbelt og returnere en Double.
Og hele produktionen af hele denne funktion
kaldes mapper vil returnere et array kaldet dobbelt.
>> Hvad det ville så tillade mig at gøre, er at gentage over listen
og gøre de samme ting, men nu anvende denne funktion på hver
af de enkelte værdier i denne liste.
Så jeg ved ikke rigtig, hvad f er.
Det betyder ikke noget for mig.
Men så længe det tager i en dobbelt, udfører en operation på det,
og derefter returnerer en Dobbelt, ville jeg så være
stand til at kortlægge denne funktion på tværs hvert enkelt element i listen.
>> Og denne form for programmering er kaldet højere ordens funktioner,
hvor vi passerer funktioner rundt som parametre
og gøre tingene med funktioner.
Det er lidt ligesom at tage alle disse idéer, som vi har lært i CS50
og tage dem sortere af til det næste niveau.
Og det er alt CS51 stil stuff.
Og så vil vi gå i dybden mere i klasserne som.
>> Men det er også vigtigt her, fordi vi
se en masse funktioner som anvendes i Swift
at stort set gør dette, hvor vi har
nogle numre, hvoraf nogle matrix af tal.
Vi kommer til at videregive denne array i vores Mapper.
Og vi vil også passerer en funktion, som
vi har allerede defineret heroppe.
Det kommer til at være firkantet.
Og vi vil da square alle disse numre
og gemme disse i dette resultat her.
>> Så dette tilfælde har vi defineret vores egen funktion kaldet Mapper.
Men netop dette ting er, faktisk indbygget i Swift.
Der er en række funktioner kaldes kort.
Der er et kort-funktion, der er en reduktion funktion,
og der er et filter-funktion, som i det væsentlige anvender funktioner
til hver enkelt element i en liste til at ændre dem på nogen måde.
>> PUBLIKUM: Så da du omdanne data i et andet format
gennem en function--
DAN ARMENDARIZ: Right.
Ja, så funktionen at vi accepterer
er at omdanne data i en eller anden måde.
I dette tilfælde var vi enten kvadratur det, eller vi cubing det,
eller virkelig, kunne vi udføre ingen operation på det overhovedet.
>> Men lad mig vise dig så, hvordan dette kommer til at se i praksis.
Og igen, jeg kører en lidt tid. så jeg er ikke
vil være i stand til at gå over alle af kildekoden i detaljer her.
Men jeg vil opfordre dig til at gøre det.
Vi vil sende den så hurtigt som muligt efter denne snak.
>> Men hvis du tager et kig på dette, antage, at vi har en liste af tal,
et array af numre i denne variable kaldte numre.
Så ønsker vi at udføre denne filter operation på disse numre.
Så filter er et højere For funktion,
accepterer et array og også en funktion.
Og på hvert element i det array, det udfører denne funktion.
>> Hvis denne funktion returnerer sandt, det holder denne post.
Hvis denne funktion returnerer falsk, det kaster væk, at elementet.
Og så er det returnerer en liste som derefter består alle
af disse elementer, der er blevet filtreret.
>> Så i et andet ord, dette er den samme idé, Karakterbog.
Vi kan have en række forskellige kvaliteter i denne værdi kaldes numre.
Kunne være 100, og 70, og 40, så videre og så videre.
Hvad dette filter gør, er varsel at dette er, at syntaktisk sukker
for en anonym funktion.
Dette er en anonym funktion siger at den parameter, som jeg accepterer
vil være, hvis den er større end 70,
så vil returnere sandt, hvilket betyder, at denne post vil blive holdt i dette filter.
Så lad os være en lille smule mere konkret om dette.
Hvis jeg har denne vifte af numre og det består af 100, 70 og 40,
Jeg udfører dette filter drift på hver af dem.
Således at første er denne værdi på 100.
100 større end eller lig til 70 er korrekt, hvilket
betyder, at 100 er holdt i denne nye kopi af dette array.
70 også passerer.
Men 40 ikke.
Så hvad der er tilbage i passingCount er den vifte af elementerne 100 og 70--
100, komma, 70.
De var de eneste to elementer, der blev holdt.
Og så grunden til at jeg hurtigt gik igennem en masse af disse slags høj orden
ting er, fordi dette er, at fælles ting, som du vil se i Swift temmelig
hyppigt, udfører nogle operation ved hjælp af denne anonyme funktion syntaks.
>> Der er nogle seje ting.
Skifter er virkelig kraftfuld i Swift, Jeg mener bare som en sindssyg, skør kraftfuld.
Du kan bruge switch, og du kan faktisk anvende dem
til intervaller, hvilket slags skøre, og har lyst til den slags.
>> Men i de sidste par minutter, Jeg ønsker at springe fremad temmelig langt
og vise dig et konkret eksempel på, hvordan vi kan skabe i iOS app ved hjælp af Swift.
Så når du laver dette, vil du nødt til at tage
et kig at-- på Apples dokumentation, de
har en masse rigtig gode tutorials for at skabe din første ansøgning.
Og jeg vil opfordre dig til at gøre at fordi de tager dig
gennem alle trinene hvad til klik på for at oprette en iOS ansøgning.
>> Men her har vi denne iOS app.
Og det er en temmelig simpel app virkelig.
Hvis jeg køre dette, lad mig vise dig, hvad det ligner.
Alt det væsentlige gør, er det trækker fra internettet en JSON-fil
at jeg har lagret på en server.
Og det JSON fil definerer billeder, der tillader
mig derefter cykle igennem, på min app, billeder fra min web-server.
>> Så jeg har her getNextImage.
Den indlæser et billede fra internettet, og så viser det på skærmen.
>> Så det er ret simpelt.
Men målet her er at vise dig, hvordan vi kan kombinere tingene
fra sidstnævnte par uger CS50 til en egentlig iOS ansøgning.
Med andre ord, måske en af ​​de ting, som du gerne vil gøre
er at have en iOS program, kan trække data fra internettet
og vise brugeren nogle oplysninger.
Det er helt punktet af denne kildekode her.
>> Så der er en masse at sige om hvordan man gør selve iOS udvikling.
Der er en masse skøre syntaks at vi ikke har set helt endnu
som en klasse, hvad en klasse egentlig er.
Vi kan stort set ignorere at for tiden.
>> Men se, at vi har indeholdt inden for denne en række ting
at vi allerede har set ligesom funktioner, der har specifikke navne.
Og når vi giver dem fungerer de korrekte navne
der forventes af iOS, i virkeligheden det føles en lille smule magisk.
Men når du opretter en iOS applikation, der
er særlige funktion navne, bliver kaldt af selve telefonen
som ansøgningen indlæser at prøve at skabe den proces, der faktisk
kører din ansøgning.
Så igen, der er en masse ting, som jeg nødt til at glans over her i rækkefølge for os
at tale om dette specifikt.
Men jeg vil opfordre dig til at se på måske den anden iOS seminaret, men også nogle
af tutorials online, som gør en langt bedre stykke arbejde med at beskrive
de specifikke oplysninger.
>> Men vi kan se et par ting, er interessante fra koden her.
Bemærk, at vi har, hvis udsagn.
Af den måde, en vigtig ting om hvis udsagn
er, at parenteserne omkring Boolsk udtryk er valgfri.
Men de krøllede parenteser ikke er valgfri, uanset hvor få eller mange linjer kode
du har i en if-sætning.
Du kan ikke have en, hvis udsagn uden krøllede parenteser i Swift.
>> Og det er, godt, en slags fjollet.
Men der er historiske grunde til.
Det er meningen at redde dig fra dig selv.
Ligesom dette for eksempel, kan du ikke fjerne de krøllede parenteser omkring,
hvis erklæring.
De er faktisk kræves.
Så jeg opfordre dig til at tage et kig på dette.
Men der er endnu en konstruere, at jeg ønsker
til at vise dig om Swift, der er nyt for Swift 2,0 sammenlignet
til ældre versioner af Swift, som er følgende.
Lad os se, hvor jeg sætte det her?
>> Så i denne funktion kaldes fetchJSON, denne funktion
er ansvarlig for at trække, at JSON fil fra en URL, der bare så sker
at køre på min CS50 IDE.
Jeg er lige begyndt Apache, sætte min JSON fil der,
og jeg er i stand til træk derefter at data fra internettet ved hjælp af
denne funktion, og denne webadresse, som leveres af telefonen.
Det er forudsat af en bibliotek, som du bruger, når
du laver nogle iOS app udvikling.
>> Bemærk her, at der er denne usædvanlige syntaktiske konstruktion kaldet vagt.
Og virkelig alt dette er i Swift er en måde at kontrollere
at nogle ting har blevet opfyldt, før du
fortsætte med resten af ​​funktionen.
Så jeg kunne have, hjælp denne valgfri type,
Jeg kunne have fundet den URL ved kører denne NSURL funktion
og lagring af det til en URL konstant, og derefter kontrollere
at se, om URL var nul, fordi det skulle returnere en valgfri type.
Og hvis det var lig nul, så ville jeg udskrive en fejl, og derefter vende tilbage.
>> Men i stedet, hvad vagt lader os gør, er, at meget ting,
men sikre, at det er faktisk sådan, at url
er blevet korrekt indstillet af NSURL.
Og hvis det er, så er det springer i dette, og det
vil tillade dig at gå videre med URL blevet defineret korrekt.
Men hvis det er tilfældet, at url er ikke ordentligt defineret,
hvis denne funktion returnerer en fejl eller nogle andre uventede ting
faktisk finder sted, denne afskærmning konstruktion giver os mulighed for derefter output denne fejl
og vende tilbage med det samme.
Ja?
>> PUBLIKUM: Så det er slags ligesom en hvis da ellers?
DAN ARMENDARIZ: Det er lidt ligesom en hvis da ellers, ja,
bortset fra at denne url er så defineret for alt under dette.
Hvis det passerer denne afskærmning, så er det faktisk vil blive fyldt med data
og anvendelige i den resterende kildekoden i din funktion.
Så jeg formoder, at du kommer til at begynde at se denne afskærmning samt.
Og være opmærksomme på det.
>> Så bare at kigge på et par andre ting, denne ret her er hvad,
tror du, blot baseret på hvad vi talte om før?
>> PUBLIKUM: Tænk det vil køre på listen?
>> DAN ARMENDARIZ: Så det er tæt på.
Dette er en funktion, som vi definerer.
Og vi indtaster denne funktion som et argument for denne funktion her.
>> PUBLIKUM: [uhørligt], hvis ikke nul.
Så det er på listen, ikke?
>> DAN ARMENDARIZ: Hvis fejlen ikke er nul, så is-- så jeg er nødt til at rulle.
Nå, lad os se, jeg kan ikke rigtig rul til højre her.
fejl er et argument, der er ved at blive føres til denne anonyme funktion.
Dette er en anonym funktion.
Det har ikke noget navn.
Men vi accepterer disse tre argumenter, data, respons og fejl.
Og det vil vende tilbage ugyldige, hvilket det kommer ikke til at vende tilbage noget.
Og det er indholdet af denne funktion.
Og så har vi adgang inde, funktion til hver af disse argumenter.
>> Så det er en hvirvelvind rundtur i sproget.
Men jeg håber med dette, forhåbentlig som du tager
et kig på nogle af de tutorials specifik til iOS udvikling med Swift,
især hvis du går til Apples udvikler web page--
de har en masse virkelig god tutorials til at få dig i gang.
Men forhåbentlig bare denne time for at tale om syntaksen selv har givet
du nok til at komme i gang med det.
>> Vi vil sende hele denne kilde kode på seminaret hjemmeside
så hurtigt som muligt, og også slides så du har en reference for alle dem.
Men held og lykke med dine projekter.
Og tak alle meget for at komme.
>> [BIFALD]