>> [MUSIC JOC]
>> DAN AMRMENDARIZ: Toată lumea, bun venit la seminarul CS50,
iOS App Dezvoltare cu Swift.
Sunt Dan Armendariz, si eu sunt un preceptor de informatică aici la Harvard.
>> Și următoarea oră va fi un tur vârtej de vânt de la fel de mult lucruri
despre acest subiect așa cum putem potrivi.
Voi posta toate codul sursă că veți vedea astăzi on-line.
S-ar putea să nu fim în stare să de fapt, du-te peste tot
că sunt că sunt arătându-vă în această oră.
Dar cel puțin sperăm prin comentariile codul sursă,
vei putea să încercați să dau seama ce exact se întâmplă pentru acele lucruri
că nu destul de a ajunge la.
>> În general, structura de Discuție de astăzi va fi după cum urmează.
Vom începe în a face unele de bază sintaxă cu limba Swift,
a intra în unele dintre cele mai avansate sintaxă a limbii Swift.
Deoarece limba este într-adevăr modernă și
are o multime de nivel înalt caracteristici, lucruri pe care nu le-am
văzut în C de-a lungul CS50, sau Chiar și unele celelalte limbi
pe care le-am început utilizarea în CS50 ca PHP,
așa că am de gând să aibă de a încerca să introduce, de asemenea unele subiecte care
sunt legate de limbaje de nivel superior ca să nu vadă în profunzime în CS50,
dar veți vedea mai târziu clase de informatică.
Asa ca va fi un bine ambalate oră.
Și vă rugăm să nu ezitați să mă lase știu dacă aveți întrebări.
Deci, dacă sunteți interesat în a face dezvoltare
cu Swift, sau într-adevăr orice dezvoltare app iOS,
există o serie de cerințe.
Mai întâi de toate, trebuie să fie folosind un Mac, care rulează în exemplele
că vom folosi astăzi, o relativ nouă versiune a sistemului de operare
X. În acest caz, eu sunt difuzate X 10.5.
Puteți fi difuzate 10.11, dacă doriți.
Dar tot ceea ce ai de gând să vezi este de a implica Xcode 7 și mai târziu,
care are cea mai recentă versiune de Swift, care este Swift 2.0.
Aceasta este de fapt o destul de distincție importantă.
O mulțime de sintaxa are schimbat destul de semnificativ
în unele cazuri, de la Swift 1.0, care a fost lansat anul trecut,
Swift 2.0, care tocmai a ieșit în această toamnă.
Așa că am de gând să arate Swift 2.0.
O mulțime de lucruri pe care te pentru Online
atunci când sunteți încercarea de a obține suplimentare informații despre o varietate de lucruri,
poate doriți în mod explicit căuta Swift 2
mai degrabă decât pur și simplu vechi Swift pentru a face sigur că veți obține sintaxa corectă.
>> De fapt, acesta este în general adevărat.
Există o cantitate rapid de dezvoltare întâmplă în limba Swift
încă de la Apple a lansat, cred că ce, a fost un pic mai mult de un an
acum.
Și lucrurile s-au schimbat dramatic în acest timp.
Și așa că nu fi frustrat dacă, atunci când sunteți în căutarea în jurul valorii de
pentru subiecte pe Swift sau modul de a realiza ceva folosind un cod de exemplu
sau ceva care nu face lucrează efectiv pe Swift 2.0.
Asigurați-vă că sunteți în căutarea în mod special pentru această versiune
pentru a încerca să reducă la minimum efectele diferite versiuni și cele felul de lucruri.
>> Voi încerca să subliniez doar câteva lucruri care sunt diferite de versiuni mai vechi.
Dar e ceva să fiți atenți pentru.
Asta, probabil, va fi una dintre cele mai mari dureri de cap cele mai
pe care le va avea cu Swift este găsirea exemplu cod care este mai veche, chiar și numai
de câteva luni, încearcă să folosească l în proiectul dvs. mai modern.
Și-l pur și simplu nu funcționează.
Vei primi erori de compilare, sintaxă erori, tot felul de chestii nebun.
Deci, doar să fie pacient cu că, și, sperăm, veți
au o experiență destul de frumos cu ansamblu Swift.
>> Acum puteți de fapt join-- și sper am de fapt, încă acest acest year--
CS 50 de Apple App echipa de dezvoltare, care
vă va permite să instalați aplicații care vă creați pe dispozitivele iOS.
Deci, să ia o privire la acest URL dacă sunteți interesat în a face asta.
>> Deci, doar o pereche de lucruri despre Swift însuși.
Este un limbaj compilat.
Dar veți vedea că unele din caracteristicile pe care le folosim
Permiteti-i sa fie utilizate, de asemenea, într-un pic ca un mod interpretat, de asemenea.
>> O mulțime de sintaxa este împrumutat de la C. Se bazează și scris în C.
Și așa vom vedea că există o mulțime de takeaways
de la cunoștințele existente de la C care putem port pentru Swift.
>> Dar există lucruri pe care face foarte diferit de C.
Este foarte puternic tastat.
Nu e de management automat al memoriei.
Nu te va trebui să utilizați malloc sau oriunde liber.
Este proiectat pentru generalitate.
Deci, cu alte cuvinte, îl puteți folosi în tot felul de contexte, de la Apple Watch
la iPhone tot drumul până la OS X, și chiar unele servere, chiar și unele scripting.
Dar vom vedea că suport pentru scripting
nu este destul de acolo încă ca este în alte limbi.
Deci, cel mai probabil vei utilizați acest exclusiv pentru dezvoltare
pe Mac-ul sau iPhone-ul.
>> Si are o multime de caracteristici moderne.
Și o mulțime de aceste lucruri sunt lucruri pe care vom încerca să abordeze astăzi,
dar, de asemenea subiecte noastre, care sincer, putem dedica cursuri întregi.
De fapt, CS 51, care este oferit semestrul viitor,
se concentrează foarte mult pe aceste teme care sunt descrise mai jos.
Astfel încât să puteți petrece un semestru întreg înțelegerea acestor lucruri.
Dar vom încerca să pentru a obține prin intermediul lor
cel puțin suficient ca tu poate înțelege ce este
întâmplă atunci când te uiți la un program de Swift
și să fie capabil de a hack-ți de drum prin ea pentru proiectul final.
>> Acum, unul dintre cele mai bune moduri în care puteți obține informații suplimentare cu privire la acest
este sincer doar prin Apple prevăzut documentație pentru Swift.
Există o mulțime de API-uri care sunt disponibile.
Și aceasta este o bază bună acasă pentru tine să caute, anumite lucruri pe care le
vrei sa faci cu un API care implica iOS.
Dacă doriți să utilizați camera pentru exemplu, puteți începe căutarea aici,
și, de asemenea, folosi Google și stiva Preaplin în timp ce în mod normal.
>> Orice întrebări cu privire la acest înainte de a ne sari chiar în?
In regula.
Să mergem mai departe.
>> Deci în primul rând, am o Numărul de exemplu fișiere.
Și am de gând să încerc să-și intensifice prin ele relativ repede.
Acesta este fișierul Hello World pentru Swift.
Este foarte simplu.
Nu e cale mai multe comentarii decât există codul actual.
Observați codul actual este la foarte jos pe linia 14.
Se spune de imprimare.
Și atunci este un apel de funcție.
Suntem într-un mod string numit Hello CS50.
Observați că nu există nici punct și virgulă.
Observați că nu există nici principal Int.
Nu e nici unul dintre cruft că am avut-o cu C.
Când folosim Swift în acest fel, care este doar scris într-un fișier text
și stocate pe computerul meu, apoi Pot să-l compilați și a alerga it.
>> Observați că aici eu sunt nu folosesc IDE CS50.
Acest lucru presupune că eu sunt de funcționare și că eu sunt pe OS X,
și că am Xcode deja instalate pe această mașină, pentru acest
a de fapt funcția.
Dar aceasta este doar un fisier text normal că putem compila și edita apoi.
Deci, să vedem cum funcționează de fapt.
Ce se întâmplă dacă vreau să-l compilați?
1.swift swiftc.
După o clipă sau două, l va vedea că acum avem
alcătuit această într-un fișier numit 1.
Și acum ne-am imprimat CS50 nostru, aplicatia noastra Hello World destul de.
>> Observați un lucru ca bine este faptul că în mod implicit,
nu am avut pentru a introduce o / n pentru a imprima o nouă linie.
În mod implicit, funcția de imprimare în Swift va imprima o nouă linie pentru tine.
Puteți trece o suplimentare opționale parametru pentru a spune nu să facă acest lucru.
Dar Google pentru mai multe informații cu privire la acest lucru.
În mod implicit, se va face pe linia de imprimare.
>> Bine, așa că să trecem mai departe apoi la alte lucruri.
Deci, cum putem defini de fapt variabile?
Putem face asta cu ajutorul unul dintre cele două metode.
Iar cel pe care vreau să-ți spun despre prima este această definiție lit..
Și acest lucru este important deoarece în mod eficient
ceea ce facem este definirea unui constantă.
Vom crea o variabilă pentru a, sau mai degrabă un nume numit constant,
oferă să-l unele data-- în acest caz, șirul Dan.
Dar, prin utilizarea acestui lit. cuvinte cheie, spunem
că această variable-- sau din nou constant-- numit
Numele nu va fi schimbat.
O să fie de-a lungul imuabile durata acestui program
sau întreaga Durata de contextul
că variabila este disponibil.
>> Acest lucru este foarte important ca atunci când aveți unele date care nu sunt
va schimba în programul tău, și veți vedea o varietate de exemple
când vrem să utilizați lasa față de celălalt sintaxa,
este important să utilizați lasa ori de câte ori este posibil, deoarece acest sesizează
limba pe care este nu va fi schimbat,
și se poate efectua de fapt o mulțime de optimizări
pentru a îmbunătăți viteza și siguranța programul.
Și de siguranță, nu înseamnă să accident cu erori nebun
că am putea fi obișnuiți să vadă în C.
>> Atunci putem folosi șir interpolare a încapsula acest într-un șir.
Astfel încât să putem vedea în acest linie de imprimare, imprimați Salut,
și apoi folosind backslash parens deschise, și apoi numele variabilei mea,
în acest caz continuă, închide paranteze.
Sunt, în esență, atunci punerea conținutul acestei variabile numite nume
în interiorul șirului și apoi imprimarea rezultatul acolo.
>> Există o altă modificare a acestui fișier care este faptul că am, la foarte de sus,
pus într-o linie shebang, care practic doar specifică
că doriți să utilizați Interpret Swift, care
înseamnă că nu mai trebuie să compila acest program special.
Pot rula la fel ca și propria script.
Dar acest lucru este, în acest caz, în spatele scenele fiind compilate și apoi
fiind a alerga.
E doar invizibil pentru noi.
>> Bine, așa că să trecem mai departe.
Deci, există un pic de șmecherie că sa întâmplat înainte.
Ți-am arătat că ar putea defini o constantă.
Și am putea oferi unele date pentru a face acest lucru.
Dar în acest caz, observați că nu am făcut specificați fapt tipul de date
asta e.
Și asta pentru că compilator, Swift poate
deduce tipul de date pe bază de doar pe datele pe care am pus în ea.
Pentru că știe că prin evaluarea această variabilă chiar aici, acest drept date
aici, se știe că este un șir.
Și așa mai departe acest nume este, prin urmare constantă O să fie un șir, de asemenea.
>> Dar putem fi, de asemenea, în mod explicit despre tipul asta e
vom folosi pentru a constante sau variabile
prin utilizarea acestui sintaxa instead-- să String nume de colon este egal
Dan, care în acest caz înseamnă că suntem merge pentru a defini un nume numit constant.
O să fie de tip String.
Iar valoarea va fi Dan.
Acum, un alt mod care putem crea variables--
și acestea sunt variabile mutabile, care înseamnă că suntem, de fapt, merge
pentru a schimba conținutul lor candva în durata contextului
că variabilă este defined-- noi utilizați cuvântul cheie var în loc de să.
Dar, din nou, în mod implicit, dacă nu știi care aveți nevoie pentru a manipula aceste date,
încercați să utilizați lasa pentru îmbunătățiri de performanță.
>> În acest caz, pot apoi specifica tipul de date
care ne așteptăm să fie în interiorul acest nou variabilă numită etichetă.
O să fie un șir.
Și vom apoi la înlănțui două șiruri împreună, șirul salut,
și șirul reprezentat de variabilă, sau mai degrabă numele constantă.
>> Deci acest lucru este frumos, pentru că acest lucru este oarecum ca în PHP pe care le
au foarte usor șir concatenare.
Noi nu trebuie să în mod automat folosi orice fel de management al memoriei
pentru a crește mărimea și de a face orice fel de lucruri amuzante acolo.
Aceasta funcționează ca ne-am astepta, de fapt.
>> Bine, orice întrebări cu privire la acest lucru?
>> Acum, motivul pentru care alte avem nevoie de tine au capacitatea de
pentru a putea defini ceea ce tip de variabile de date sunt
este pentru că, uneori, noi nu doresc să inițializa variabilele
cu unele date de la punct de definiție.
Deci, în acest caz, să zicem pe care vreau să încep introducerea
unele clase într-o carte grad.
Ei bine, știu că una dintre variabile pe care vreau să fie
va fi un grad mutabil.
Și noi, de asemenea, știu că am vrei sa fie un întreg.
Dar poate că nu încă au acest grad disponibil.
>> În Swift, trebuie să defini tipul de date
care este asociat cu un variabilă sau o lasa constant
înainte de a putea de fapt utiliza variabila.
Pentru ca este puternic tastat, trebuie să asocieze un tip
cu aceste variabile.
>> Deci, în acest caz, dacă nu Am în mod corespunzător inițializat primul cu o valoare,
apoi m-am nevoie să-i spun ce Swift Mă aștept ca tipul de date sa fie.
Și o să rămână același tip de date
de-a lungul istoriei acest program.
>> Acum s-ar putea fi tentat de îndată ce Am creat această variabilă grad
și o furnizat număr întreg de 100, acum dacă am
doriți să încercați să înlănțui un șir cu care întreg,
ar putea fi tentat să folosească în continuare care operatorul de concatenare string
cum am făcut doar câteva linii înainte.
Dar din păcate, de fapt, acest lucru nu se va
locul de muncă, pentru că sunteți efectuarea, în esență,
o operație pe două tipuri diferite.
>> Acum, acest lucru este foarte diferit de alte limbi, cum ar fi PHP, care sunt într-adevăr
goosey Loosey cu fel de tipuri lor.
Sunt la fel ca, da, orice, nu-mi pasă.
Dă-mi un singur tip, și poate voi face ceea ce trebuie.
>> În acest caz, este Swift extrem de stricte cu privire la tipurile
pe care le-a face cu.
Acest operator de însumare sau operatorul de concatenare
are în esență o pereche de diferite opțiuni posibile.
Puteți face însumării cu numere întregi, sau
poate face șir concatenare, și probabil alte lucruri la fel de bine.
Dar dacă operatorul nu recunoaște ceea ce este pe fiecare parte a acestuia,
sau mai degrabă o combinație a celor două tipuri, nu este ceea ce se așteaptă,
atunci va provoca o defecțiune.
>> Deci, în acest caz, ceea ce înseamnă pentru a avea un șir plus un număr întreg?
Ei bine, în contextul acest lucru, probabil că ne-o dorim
pentru a face o operație șir concatenare.
Dar, desigur calculatorului nu are acest tip de context.
Și așa trebuie să oferim că informații suplimentare
pentru a lasa sa stiu ce este că vrem să facem.
>> Deci, cu alte cuvinte, faptul care este puternic tastat Swift
înseamnă că trebuie să faci o pic de lucru suplimentare
să-l pentru a opera mod care le-ar dori.
Dar, ca rezultat, este mai sigur.
Și odată ce ai lua seama de aceste tipuri,
lucrurile începe sincer la locul de muncă destul de bine.
>> Deci, în acest caz, ne-am apoi ar efectua string concatenare
prin turnare în mod explicit întreg la un șir
de ambalaj-l în acest capitalul funcția S String,
și apoi folosind concatenarea string Operatorul de a modifica variabila noastră etichetă,
și apoi imprimați-l.
>> Până acum, bine?
Bine, să trecem mai departe.
>> Acum există o varietate de date tipuri care le putem folosi în Swift.
După cum v-ați obișnuit să, putem crea o gamă mutabil.
Și că matrice poate doar conțin un singur tip.
>> Deci, în acest caz, vom crea o matrice de numere întregi, mutabil care
vom numi note, și vom putea pentru a stoca că în această categorie de piață
format ca ai crescut obișnuit la o varietate de alte limbi.
Dar observați că aici suntem definirea câteva lucruri.
clasele este o variable-- mutabil Nu vom folosi cuvântul cheie lit..
Asta înseamnă că putem modifica apoi conținutul acestei matrice.
Este de tip Array Int, și putem spune că
pe baza acestor paranteze pătrate aici.
>> Acum, unul dintre lucrurile frumoase despre acest lucru este că noi
au acces la o mulțime de Informatii aditionale
despre matrice folosind doar unele simplu notație punct.
Deci, de exemplu, grades.count oferă pentru a ne
numărul de elemente care exista in acea matrice, care apoi putem accesa destul de
ușor, pur și simplu, folosind ca punct notație.
>> Dacă doriți să adăugați suplimentare articole la această matrice,
nu se poate face stilul PHP în cazul în care tocmai ați defini explicit,
la un anumit index, o anumită valoare pe care doriți să introduceți.
În schimb, utilizați append metodă în tipul matrice
pentru a adăuga acel element, 95, la această listă.
>> Deci, acum această matrice are urmatoarele contents-- 100, 0, 90, 85.
Și acum am anexat 95 și la aceasta.
>> Există și alte modalități putem adăuga lucruri.
Puteți folosi de fapt, un operator de însumare,
care va fi interpretat ca o operație matrice adăugare.
Și puteți adăuga apoi un alt matrice, al căror conținut sunt 70 și 80,
pentru că matrice.
Deci, acum avem Cuprins în această variabilă
grades-- 100, 0, 90, 85, 95, 70, și 80.
Acesta este doar un mic sintactică zahar, care Swift ofera noi.
>> Deci, dacă vrem să socotească clasele, suntem probabil
O să vrea să repeta peste fiecare element în această buclă.
Și noi avem, în Swift, noțiunea de o buclă pentru ca v-ați aștepta.
Dar modul în care ne indica o gamă este ușor diferit.
Deci, în acest caz, pentru a concluzie totul, vom
de gând să creeze un temporar variabilă numită sumă pentru a ne
pentru a menține acest număr.
>> Și observați pentru nostru construcție buclă aici.
Pentru index în 0 .. <grade.count.
Deci această construcție, 0 .. <grades.count este o operațiune gamă unde suntem
spunând că vom crea o gamă de numere întregi de la 0 până
la, dar excluzând grades.count.
Deci acest lucru va fi 0, 1, 2, 3, 4, 5, până la toate acestea mulți o
înainte grades.count.
>> Deci, aceasta este diferită de modul în care ar folosi de obicei pentru bucle
în cazul în care v-ar avea unele index variabilă, ea egală cu 0 stabilit la prima,
și apoi integra că până la unele Valoarea mai mică decât numărul de articole
în matrice.
>> Deci, există o modificare la acest fapt,
care ne permite să foarte usor set diferite tipuri de intervale.
Dacă schimbați acest interval de trei puncte, 0 ... grade.count,
aceasta reprezintă intervalul 0 la grades.count inclusiv,
ceea ce înseamnă că acest număr este, de asemenea, apoi incluse în acel interval.
>> Dar acest lucru este foarte util pentru aceste lucruri exacte,
atunci când avem de a efectua iterații peste buclă
deoarece aceste indicii sunt zero indexate, așa cum am văzut în alte limbi
deasemenea.
Orice întrebări cu privire la acest buclă pentru?
>> Deci nu e definiție implicită de această variabilă index,
a căror valoare începe la 0, și continuă la fiecare iterație bucla
să crească cu 1 până un punct care este egal cu grades.count,
moment în care, bucla intrerupe.
>> Observați că în șir nostru interpolare aici,
putem efectua de fapt, unele simplu manipulări la aceste valori.
Deci, indicele plus 1 va de fapt efectua o însumare de care valoare
deoarece indicele este, în acest caz, un număr întreg.
Și în acel moment, se va apoi fi transformat într-un șir
și interpolate în acest șir de aici, și tipărite ca ne-am astepta. .
>> Și lucrul frumos despre matrice de aici este
că suntem, de asemenea, posibilitatea de a avea valorile și valorile de setare preiau
folosind notația suport pătrat ca am văzut în alte limbi, precum și.
>> Bine, deci de aici, acum calcula suma nostru de toate gradele noastre.
Acum un fel de alta pas logic ar fi
pentru a face o operație divizie pentru a găsi din media acestor note.
Dar ceva important aici se întâmplă care
este că această sumă este probabil un număr întreg.
Dar avem nevoie pentru a efectua unele un fel de divizare dublu.
Și acest lucru va fi extrem de important atunci când
vrem pentru a efectua această operație, pentru că ceea ce spunem
este că avem nevoie pentru a de fapt, efectua divizare pe două duble.
Și din nou, pentru că Swift este foarte puternic tastat,
noi trebuie să stabilească în mod explicit cele de mai produse în dublu înainte de a ne de fapt
efectua această operațiune.
>> Deci, pentru ca noi să efectua divizare dublu,
nu e suficient pentru un singur de aceste elemente să fie o dublă.
Ambii trebuie să fie o dublu pentru rapidă
pentru a fi sigur că acest este ceea ce vrem să facem.
Deci atunci vom typecast în mod explicit suma pe care le-am calculat mai sus
și numărul de grade în camere duble, și apoi efectuați această operațiune și se păstrează
că în această nouă variabilă, sau mai degrabă acest nou constant numit medie,
care va avea ce tip, sa-ti imaginezi?
Dublu, da.
Deci, în acest caz, ne-am Nu trebuie să-l specificați
deoarece aceasta poate fi dedusă din operațiune ce tip de mediu de date
va fi.
Și Swift este în general destul de bine despre a fi capabil de a deduce tipurile.
>> Vrei sa vezi asta a alerga, sau pot merge mai departe?
Vreau să continui.
Orice întrebări cu privire la toate astea?
Grozav.
>> Acum vom începe pentru a ajunge la bune funcțiile stuff-- definirea,
și o serie de alte tipuri care sunt unic pentru Swift că nu ați
văzut în alte limbi până în acest moment,
dar ele sunt prezente și în alte Limbi pe care le-ar putea găsi mai târziu.
Deci, în primul rând, dacă doriți pentru a defini o funcție,
ai defini cu cuvântul funky, Funcția, iar apoi numele funcției,
și apoi în paranteze, argumentele pe care doriți această funcție pentru a accepta.
Argumentele trebuie, de asemenea, specify-- generally--
trebuie să precizeze, de asemenea, tipul de date pe care ele sunt, cu excepția cazului în care pot fi deduse.
Și vom vedea că puțin avertisment în doar un pic.
>> Deci, în acest caz, avem o functie numita printGradeCount.
Vom accepta o variable-- sau mai degrabă în acest caz,
un constant-- numit cartea de note.
Și se va fi de tip matrice de numere întregi.
Acum e ceva asta e foarte important aici
că vreau să înțelegeți.
Asta este că, prin implicit, aceste argumente că sunt intrări la această funcție sunt
definită cu un cuvânt cheie let implicit, ceea ce înseamnă că nu pot modifica această
variabilă Gradebook aici.
Și ca un fel de sens, pentru ca esti transmită date în.
Și tu, probabil, nu-l vreau care urmează să fie schimbat de sub tine.
Este posibil să se menționeze explicit că aceasta este o variabilă de a pune
cuvântul cheie var aici.
Dar asta este un Te-am prins că am oamenii au observat au făcut în trecut
este că ei presupus ca va să fie o variabilă atunci când, în fapt, ea
este o constantă.
>> Bine, asa ca aici apoi, în acest caz, noi nu sunt specificând orice tip de întoarcere.
Vă vom arăta cum se face că într-o clipă.
Dar observați că aici avem doar un simplu dacă starea.
În cazul în care cartea de note este gol, care în acest caz
este doar proprietatea acestui număr întreg matrice, atunci vom imprima ceva.
În caz contrar, vom face altceva.
>> Destul de simplu până acum cred.
Dar mă opresc, dacă aveți întrebări.
>> Acum această funcție, medie, de asemenea, ia unele argumente, sau mai degrabă un argument,
care este cartea de note, și de această dată este de gând să se întoarcă un tip dublu.
Deoarece este de calcul media și IT
O să se întoarcă de fapt care mediu calculat la linia de asteptare.
>> În acest caz, am specifica reveni tip după o săgeată.
Și acest lucru ar putea sa se simta cam ciudat la început.
Ai crescut obișnuit la stabilirea întoarcerea
tastați înainte de numele functiei.
Dar dacă te gândești la acest în ceea ce privește matematica,
ca atunci când ai matematica care definesc o funcție,
ai o funcție cu unele intrări, și produce o ieșire.
Și asta este exact ceea ce acest lucru este ar trebui să imite.
Și există o serie de alte limbi care au sintaxă similară, de asemenea,
dar, probabil, nici unul care ați văzut în CS50.
Dar încă nu fi confundat de către aceasta.
Săgeata înseamnă ceea ce se întâmplă să fie returnat în acest caz.
OK, deci cum vom pentru a calcula această medie?
Ei bine, în cazul în care cartea de note este gol, bine atunci suntem
O să se întoarcă 0, care poate un mod rezonabil de a trata acest lucru.
Nu știu, să vin Înapoi la care într-un pic.
Acest lucru nu poate, de fapt fi un mod rezonabil
pentru a calcula o medie în cazul în care avem o cartea de note goală.
>> Atunci vom efectua doar însumarea nostru.
Observați că aici suntem de fapt au o versiune alternativă a unui
pentru buclă, care ne permite sa repeta peste fiecare element unic într-o matrice
și locul fiecare element în propria variabilă.
Prin specificarea de grad în Gradebook, ceea ce spunem
este că vom implicit a crea un nou constant numit
grad care este de gând să reprezinte fiecare element unic în cartea de note
de fiecare dată că pentru reiterează bucla.
Deci, prima dată că este administrat, de grad va
fi primul element din cartea de note.
A doua oară Va fi Al doilea articol, așa mai departe și așa mai departe
până Gradebook are sine epuizat de elemente.
Atunci vom fi în măsură să rezuma că grad în variabila noastră însumării
și să se întoarcă medie nostru cum am văzut mai înainte.
OK, orice întrebări?
Da?
Audiența: Am două întrebări.
Numărul unu, ipotetic, poate executați întreg pe asta?
Nu trebuie să fie un dublu, este corect?
DAN AMRMENDARIZ: Poți repet această întrebare?
Audiența: Pot face număr întreg ca medie?
DAN AMRMENDARIZ: Poți face întreg în medie?
Deci reveni un număr întreg medie în loc de un dublu?
>> Audiența: tu Return-- au acest drept acum de mai jos.
DAN AMRMENDARIZ: Chiar aici, întoarce 0.0?
Audiența: Da, doar întoarce 0.
Asa ca va fi, fie 80 sau 85, dar nu 85.2.
>> DAN AMRMENDARIZ: Deci, în acest caz, astfel încât există o cuplu moduri diferite
a răspunde la această.
Lasă-mă să-i răspundă în ordine.
Deci, dacă am face doar acest retur 0, un 0 este o valoare întreagă.
Și astfel încât va provoca o eroare de tip pentru acest caz
deoarece se așteaptă un dublu dar este apoi întoarce un număr întreg.
Dacă vreau să se întoarcă un întreg, pot.
Pot seta tipul de retur la int, a reveni 0 aici,
și nu efectua diviziune dublu.
Dar atunci ne-ar fi face divizie număr întreg.
Și așa ne-am atunci nu s-ar obține mediu pe care ne-am aștepta, eventual.
Dar da, putem modifica tipurile în acest mod.
>> Audiența: Și în al doilea rând, vă au un pat dublu pe partea de sus.
Dar mai jos, atunci când se întorc dublă,
care este deja în mod automat revenind format dublu.
De ce este necesar să-l definească cu săgeata în partea de sus, cu o dublă?
>> DAN AMRMENDARIZ: Deci în cazul în care, aceasta este parte
de the-- astfel să se repete întrebarea, deoarece este implicit de la revenirea
Tipuri de aici, ce tip de fapt acest este, trebuie să fie explicit cu Swift
despre ceea ce vrem să reveni din această funcție
astfel încât atunci când se efec- tip verificarea, asigurați-vă că se poate
că ceea ce am scris, de fapt jos, de fapt conformă cu asta.
Deci e ca un fel de verificare cu tine un fel de situație.
Dar nu are--
>> Audiența: [inaudibil] săgeată?
>> DAN AMRMENDARIZ: există cazuri când putem specifica că putem implicit
seta tipul de retur.
Dar, în acest caz, eu nu cred că ar funcționa.
Există un alt sintaxa că vom vedea mai târziu.
>> Bine, deci această sursă cod este un pic diferit
pentru că acest analizează argumentele din funcția pe care suntem de asteptare.
Lasă-mă să-ți arăt cum funcționează înainte de a ne de fapt trece
la unele lucruri interesante care se întâmplă în Swift.
>> Deci, în acest caz, dacă am doar rula acest cod, observați că ceea ce face
în timp ce este--, un fel de dă-mi o eroare de ciudat.
Am nevoie pentru a trece un cuplu de întregi ca un argument în linia de comandă.
Deci, să vedem, 150 și 80, și apăsați Enter pentru a afla ce este de fapt face.
Este acceptarea fiecare aceste valori ca numere întregi.
E le introducerea într-un cartea de note.
Și apoi se efectuează acest calcul medie
și scoate că, ne-am astepta.
>> Dar, evident, se întâmplă ceva cu acest respingerea ceva
ceva ca un întreg.
După cum s-ar putea aminti de când am fost care se ocupă cu argumente în linia de comandă
în C și în alte limbi, primul 0-lea element în acest argument în linia de comandă
Lista este numele comenzii că am deja executate.
Deci, în acest caz, eu sunt doar looping peste toate argumentele din linia de comandă.
Dar nu fac nici un fel de fantezie verifica pentru a trece peste asta primul.
Sunt doar în mod explicit sau implicit că sunt verificarea care dintre aceste tipuri
sunt numere întregi înainte de fapt am efectua acest calcul.
>> Și asta e în esență, ce se întâmplă aici.
Pentru fiecare argument în argumentele procesul de,
Am de gând să efectua unele verificare.
Și în acest caz, am de gând pentru a încerca să primul convertit
acest argument într-un întreg de efectuarea unei typecast explicit,
pentru că este, la intrare, un șir și nu, de fapt, un număr întreg.
>> Dar aceasta este un fel de sintaxă ciudat, dacă gradul lasa egal Int (argument).
Ce se întâmplă de fapt aici este extrem de
important să folosind Swift.
Acest lucru este ceea ce este cu ajutorul numit un tip opțional.
>> Deci această funcție, Int (argument), întoarce nu doar un întreg, dar se întoarce
ceea ce se numește un număr întreg opțional.
Și astfel încât acesta este un fel de un tip pe partea de sus de un tip.
Puteți fel de imagina ca se întoarce ca un pachet.
Iar atunci când deschizi pachet, aceasta fie
are un număr întreg, care este rezultatul, sau nu are absolut nimic în ea, la toate.
Și acest lucru este util ca o verificarea erorilor mecanism, deoarece în acest caz
putem afla, a fost aceasta conversie de succes de tip?
Dacă ar fi fost, atunci este de fapt va avea un număr întreg în interiorul.
În caz contrar, va avea unele Valoarea pe care o vom suna zero, care
este reprezentativ pentru întreg nu la toate.
Este într-adevăr reprezentativ al nimic.
>> Și așa mai departe acest lucru dacă constructii ne permite să despachetez acest pachet,
care opțional obligatoriu.
Și dacă suntem capabili să despachetez că pachet și de a găsi un număr întreg în interiorul,
atunci ceea ce spunem aici este că vom apoi
permit ca valoarea să fie stabilite în această constantă numit grad.
Și această parte a instrucțiunii if, partea de sus a if
va rula, pentru că Unwrap a avut succes.
>> Dacă doar așa se întâmplă că a apărut o eroare, probabil
în această conversie tip explicit dintr-un șir la un întreg, poate
e ABC valoare de exemplu.
Și asta e de fapt, nu merge pentru a converti la un întreg.
Apoi se va întoarce zero, care nu este un număr întreg.
Și această declarație dacă bine, atunci nu.
clasa nu va exista pentru că nu are nici un conținut întreg.
Și se va desfășura această altceva bloc în loc.
Da?
>> Audiența: Nil este N-I-L?
DAN AMRMENDARIZ: zero este N-I-L, da.
>> Deci, aceasta este, poate, una dintre cele mai mai grele lucruri despre Swift,
mai ales atunci când sunteți în buruienile de pe o aplicatie iOS
și esti de fapt încercarea de pentru a face unele dezvoltare acolo.
O să fie striga la tine despre opțională.
O să fie vă cere pentru semne de întrebare și de exclamare. puncte
Dar, odată ce îți dai seama dacă ai out-- dedica ceva timp pentru a imaginind
ceea ce se întâmplă cu tipuri de opționale, veți economisi vă o mulțime de dureri de cap
în timp ce încearcă să scrie o aplicație în Swift.
>> Este de fapt o caracteristică foarte puternic.
Și va trebui să ia cuvântul meu pentru asta de acum.
Dar vom vedea această construcție și altele place
în unele din alt cod sursă care vă vom arăta în doar un pic.
>> Există întrebări inițiale aici?
Deci important este ca un Takeaway tip opțional este un fel de metatype.
Acesta fie are o valoare, și dacă o face, atunci
va avea, probabil, că o valoare asociată cu ea, sau nu are nici un fel de valoare,
și este reprezentată prin zero.
Restul este probabil cum v-ați aștepta.
>> Deci, haideți să sol până dificultate din nou.
Și de această dată, haideți să aruncăm o privire la unele alte tipuri de date care există de fapt.
Una dintre ele este dicționare, care este foarte asemănătoare cu dicționare Python.
Este oarecum similar cu un tabel hash în C. Este, în esență, o cartografiere de chei
în cazul în care cheile pot fi siruri de caractere.
Și atunci când te uiți la acele chei, aceste chei va avea o valoare.
Deci, nu e chiar o matrice, dar în schimb, mai strâns asociat
la o hartă hash sau o masă hash.
>> Să vedem cum este aceasta ar trebui la locul de muncă înainte de a ne de fapt
du-te în codul sursă în sine.
Dacă am alerga aceasta, într-adevăr se întâmplă nimic.
Este spunându-mi că mă aștept unii parametri de tipul următor.
Deci, am de gând să le furnizeze se unele nume problemă set,
așa pset0, poate m-am 100.
Și pset1, am un 5.
Și apoi pe la examen, am a făcut foarte bine și a luat 30.
Și Hopa, am lovit un spațiu aici.
>> Când m-am lovit Enter, puteți vedea se efectuează unele calcule.
Se spune cartea de note este de trei clasele, pset1, pset0, examen.
Și cartea de note are această medie specifică.
Deci, din nou, lucrăm cu această idee cartea de note,
dar vom continua iterarea cu complexitatea funcției noastre.
>> Deci, la debut, suntem doar va crea o funcție care
este responsabil pentru tipărirea utilizarea.
Și nu e acest ieșire funcție care va doar
iesi cu forța cererea.
Acest lucru nu este ceva care vei folosi în aplicație iOS.
Aceasta este doar, în acest caz, cu un argument linie de comandă.
Apoi, vom începe să se deplasează spre Xcode.
Dar acest lucru este specific pentru o comandă Programul stil de linie in Swift.
>> Să aruncăm o privire la unele dintre lucrurile interesante de aici.
Să vedem, doar o pereche de lucruri interesante pentru a menționa, probabil,
este că, în funcție de meu imprimarea numărului de clase,
s-ar putea aminti că am avut această listă de pset1 items--, pset0, și examen.
Puteți, de fapt rapid și ușor de a face acest lucru
prin luarea de cartea de note, care este o Dicționar care are cheile și valorile.
Găsi toate cheia este prin metoda chei dot aici,
și apoi să utilizați acest joinWithSeparator, care va avea apoi toate tastele
că ne-am tastat în, pset1-- sau Ne pare rău, pset0, pset1, și exam--
și le înlănțui împreună folosind o virgulă și un spațiu
pentru a crea un șir lung.
Această operațiune se alăture este doar fenomenal utile într-o varietate de contexte.
Și așa este această joinWithSeparator.
>> Și acesta este un lucru care e schimbat de la 1 la Swift Swift 2.
Nu folosit pentru a fi un Style-- Python dacă sunteți
familiar cu Python-- un Python Stilul se alăture metodă pe siruri de caractere.
Dar care nu mai este în cazul în Swift 2.
Doriți să utilizați această opțiune dacă doriți a înlănțui o serie de lucruri
împreună cu un șir.
>> Deci, probabil, apoi, în nostru discuție de mediu înainte,
face un pic mai mult sens pentru noi pentru a seta funcția de mediu
să fie un dublu opțional, mai degrabă mult decât un dublu explicit.
Pentru că am avut ca condiție neobișnuit în cazul în care,
Ce se întâmplă dacă cartea de note de fapt nu are valori în ea?
Ce ar trebui să randamentul mediu?
>> Ei bine, poate în C vă ar fi făcut ceva
ca a oferit o valoare Sentinel, cum ar fi 0.0, sau poate un număr negativ,
sau ceva care reprezintă doar faptul că au existat unele stare de eroare
și, probabil, nu au de fapt capacitatea de a calcula că media.
Ei bine, frumusetea de a specifica o Tipul opțional ar fi să faci asta.
Iar eu spun acum toate aceste cuvinte, dar acest fapt nu utilizează optionale.
Dar vom vedea că, în doar minute în cazul în care putem stabili mediu
să fie un tip de date opțional, astfel încât în cazul în care se întoarce de fapt, unele date, apoi
ne vom întoarce că datele.
În caz contrar, ne vom întoarce zero, spunând că acest
nu are nici o calcul semnificativ.
>> Să trecem la altceva.
Deci de aici, ne-am uitat la Toate aceste exemple în linia de comandă.
Dar, de fapt ceea ce ai de gând să fie a face cu Xcode.
Și unul dintre lucrurile frumoase despre Xcode este, și în special în Swift,
este că avem această lucru numit un loc de joacă.
Un loc de joacă este și deloc o aplicatie iOS.
Dar vă permite să experimentați cu Swift intr-un mod foarte usor.
Aveți posibilitatea să tastați tot codul.
Este sintaxa frumos evidențiate aici.
Atunci când creați un nou fișier, acesta va cere tine, dacă doriți să creați un loc de joacă.
Dar lucrul frumos despre Playground este faptul că în partea dreaptă a ferestrei,
nu vă arăt de fapt de ieșire de la codul.
Deci, dacă am defila în jos, putem vedea ce ieșirea din diverse linii de cod
de fapt, se întâmplă să fie.
>> Deci, în acest caz, vom schimba traseu doar un pic
și vorbesc despre ceva care este într-adevăr important în acest fel la nivel înalt
că Swift funcționează, și este această idee de închidere.
Și ați văzut, probabil, acest un pic în JavaScript.
Pentru cei dintre voi care sunt în CS50, închidere
sunt foarte populare mod, foarte buna de a face de nivel înalt lucruri în limbile moderne.
Dar este, de asemenea, un fel de dificil de a înfășurați capul în jurul pentru prima dată.
Deci, dacă te uiți la acest prima dată, e OK.
Uită-te la codul sursă și a vedea dacă vă puteți da seama de la domiciliu.
>> Deci, în acest caz, să spunem că ne-am doriți să creați o mulțime de exponenți
cu o valoare fixă.
Deci, în acest caz, pot crea o funcție.
Am de gând să-l numesc putere de 2 scop a cărui unic în viață
este de a lua unele de intrare și dublu l, și a reveni acea valoare.
Observați că aici mă acceptând un singur tip de date.
O să fie o variabilă numit X.
Este de tip Double.
Și am de gând să se întoarcă o dublă aici.
Și Mă duc să fac un foarte, sincer, destul de
mod naiv de dublare această valoare.
Și am să-ți arăt de ce acest este util în doar o secundă.
>> Observați că aici avem acest interval din nou. pentru ceva în 1, dot
dot dot, 2, ceea ce înseamnă că această buclă va rula de două ori.
Dar acest lucru reprezintă o variabilă dummy.
Înseamnă că nu sunt cu adevărat de gând să folosi variabila oriunde
interiorul această buclă.
Vreau doar această linie de cod pentru a rula de două ori,
fără a fi nevoie să știe valoarea acestei game.
>> Deci, în acest caz, am rulează rezultat ori x de două ori, în esență, ceea ce
înseamnă că am cuadratura această valoare.
Și acest lucru se întâmplă pentru a lucra ca ne-am astepta.
Puterea de 2, care trece o valoare de 2.0 ne dă o putere de 4.
3.2 lucrări de 10,24.
>> Acum putem face o similară lucru pentru putere de 3.
Dar schimba acum doar gama.
Pentru variabilă dummy în 1 prin 3, multiplica de 3 ori,
și de a face același lucru.
>> Deci, acest lucru ar putea sa se simta un pic contrived.
Dar există o importantă lucru care aici
este că se uită la aceste două funcții, nu e
doar un singur lucru care este diferit, care este această valoare în intervalul.
Orice altceva despre aceste două funcții, putere de 3 și putere de 2,
sunt, de fapt, identice deoarece lucrează în același mod.
>> Deci, la acest punct, un pic clopot de alarmă ar trebui să fie merge off.
Sperăm că ceea ce spui, Știi, acest lucru se simte un pic
ca dublarea eforturilor.
Poate există o cale care mi-ar putea încapsula toate acestea
și asigură o funcție sau pentru a crea o funcție care
face exact ceea ce vreau fără au nevoie să-l introduceți în mod explicit.
Și aceasta este ceea ce putere de o închidere ne permite să facem.
Deci, haideți să aruncăm o privire la acest lucru.
Și voi petrece câteva minute în acest sens, deoarece această
este destul de important pentru Swift.
Vedem acest lucru tot timpul.
Vom defini o funcție.
O să fie numit powerOf.
O să accepte o parametru numit y de tip int.
Dar ia o privire la tipul de retur.
Tipul de retur este, în paranteze, dublu double arrow.
Ceea ce înseamnă că această funcție, Această funcție powerOf,
se întoarce o funcție.
Care acceptă o dublă și returnarea o dublă.
Astfel încât s-ar putea suna un fel de nebun, dar hai sa defilați în jos un pic
si uita-te pentru a vedea ce se întâmplă.
Suntem în interiorul această funcție powerOf.
Vom crea o nouă funcție numit exponentiator,
dar nu contează ce este.
>> Observați că acest lucru are o valoare de intrare de x.
Și se ia intr-un dublu și returnarea o dublă.
Și aceasta este același cod pe care le văzut mai sus, cu excepția faptului că valoarea 2
sau valoarea 3, care sus legat în acest interval,
a fost înlocuit cu această valoare a lui y, care
a fost parametrul inițială de funcția noastră powerOf.
Și în acest moment, ne-am reveni exponentiator.
Ne întoarcem funcția.
>> E un fel de mic suflare minte.
Dar să ne imaginăm ce se întâmplă când eu numesc această funcție powerOf
și să treacă în el o anumită valoare ca 2.
Ce înseamnă acest lucru este că Am acum valoarea
2 pentru y, ceea ce înseamnă că această valoare y în această funcție exponentiator
va fi ca valoarea 2.
Dar eu sunt revenind acest Funcția exponentiator.
>> Deci, observați ce spune Swift I au creat în acest caz.
să pătrat este o definiție, este o funcție care acceptă o dublă
și returnează un dublu.
Am creat o funcție că pătrate ceva
folosind acest mecanism chiar aici.
Și într-adevăr ceea ce se întâmplă este că se întoarce această funcție
exponentiator, dar această valoare Y este înfășurat în interiorul acestuia.
Și așa acum de fiecare dată când am folosi acest variabilă sau constantă numit acest
pătrat, îl va să se comporte ca o funcție.
Și așa că am putea apela atunci că variabila ca mi-ar apela o funcție,
și să treacă în el un număr, ca în acest caz 3.
Și voi pătrat atunci această valoare.
Deci, 3 pătrat va apoi devin 9, așa cum se poate vedea aici.
>> Într-adevăr nebun, dar acest lucru acum mi permite posibilitatea de
pentru a crea alte funcții powerOf.
Cum am putea spune, OK, bine, acum vreau pentru a crea o nouă funcție, powerOf (3),
și se păstrează ca într-o constant numit cub.
Și acum cub va fi un funcție separată care va apoi
ia o valoare ca intrare și cub care Valoarea cum putem vedea în linia de jos
Aici.
cub de 2 este de gând să conducă la 8.
>> Să sperăm că lucrurile destul de elegant.
Nu ați mai văzut așa ceva.
Am să vă încurajez să te uiți în închidere și să investigheze acest lucru un pic mai mult.
Este lucruri foarte puternic vom vedea o mulțime în JavaScript și alte limbi.
Este într-adevăr esențial să se înțelegerea API-uri, precum și
că vom ajunge la doar o secundă.
Da?
>> Audiența: Când faci powerOf (2), paranteze, și apoi
un alt paranteze, un alt input-- te înlocuirea practic pătrat.
DAN AMRMENDARIZ: Deci uite în ultimul linie aici.
Acesta este, de fapt absolut posibil să face acest lucru înlănțuirea așa cum ați sugerat.
Deci powerOf (5), înseamnă că vom pentru a avea o exponentiator de 5 până aici.
Deci, aceasta este, în esență, va fi cel același lucru ca și 4 la a cincea putere,
pentru că am creat o exponentiating funcționează la puterea a cincea,
și suntem trecerea în Această funcție de valoarea 4.
Și ajungem ca valoarea că ne așteptăm, 1,024.
Audiența: Și nu e un nume, așa că face mai ușor
pentru a citi, pătrat indiferent.
>> DAN AMRMENDARIZ: dreapta, exact.
Deci, înainte de Tocmai am pus într-o constantă aici, așa încât
că a făcut-o ușor de utilizat acest nume.
Da?
>> Audiența: În acest context, powerOf, e parte
a limbajului de programare spre deosebire de modul în care
cred că de powerOf în [Inaudibil]?
DAN AMRMENDARIZ: Deci În acest caz, powerOf
este pur și simplu numele de Funcția pe care am definit aici.
Deci nu e inerent la limba în sine,
dar în schimb, e doar o funcție care are
acest nume pentru că am da numele.
Orice alte întrebări?
In regula.
>> Acum, acest lucru este mare.
Dar nu te duci pentru a vedea o mulțime de funcții de închidere care
sunt ca aceasta în cazul în care ați defini, în interiorul de o funcție, o altă funcție.
Si o poti face.
Dar nu este un fel de într-adevăr necesar, nu?
Ca de ce am defini acest Funcția numit exponentiator
și apoi a reveni imediat.
De ce nu pot doar imediat reveni această funcție?
>> Și, de fapt, acest lucru este exact ideea din spatele unui concept numit
funcții anonime, în cazul în care Funcțiile anonime nu face de fapt
au un nume, deoarece acestea nu au nevoie de unul.
Și astfel, în acest caz, în 7B, putem găsi cu precizie că.
Este tot același cod, face exact același lucru,
dar acum ne-am schimbat atât de ușor că această funcție powerOf imediat
returnează o funcție.
Observați că după întoarcerea, există un suport cret deschis.
Se așteaptă această intrare dublă.
Se așteaptă că producția dublă.
Și apoi, în cuvântul cheie separă codul de sine.
Deci aceasta este o funcție anonim.
Ea nu are de fapt un nume, în timp ce înainte de a fi fost numit exponentiator.
Dar, așa cum am văzut, doar într-adevăr nu a făcut referire la exponentiator
în afara acestei funcții.
Deci nu conta.
Deci, această funcție este anonim așa-numitele pentru că este fără nume,
dar este încă în curs de utilizat în contextul acestui cod.
>> Următoarele două Cei Sunt va continua, sperăm,
suflare mintea ta un pic.
Putem simplifica acest lucru chiar mai mult.
Pentru că așa cum a fost abilitate a subliniat mai devreme,
Poate că știu de fapt, de deduce din acest cod, ceea ce
producția de acest cod va fi.
Și, de fapt, în această funcție anonim, De fapt, putem deduce tipurile de date.
>> Deci, în aceasta, nu mai Trebuie să definească în mod explicit
tipul de date care fiind intrare și ieșire din această funcție
pentru o pereche de motive.
Una dintre ele este că ne-am definit, până la prototip al funcției de închidere,
ce tip de date anonime acest Funcția trebuie intrare și de ieșire.
Și de la celălalt, am poate deduce din codul
aici că suntem accepta intrare care este de tip dublă
și returnarea o dublă.
>> Observați că aici nu avem în mod explicit definit numele argumentelor
că această funcție este acceptarea.
Și așa vom vedea ne putem referi la acești parametri folosind $ 0, $ 1,
așa mai departe și așa mai departe, în funcție de numărul de acel parametru utilizat
în această funcție.
>> Acest lucru este ceva care aveți de gând pentru a vedea o mulțime este acest suport cret deschis
definiție urmată de o $ 0, și apoi o operație,
și apoi o acoladă închisă.
Aceasta este o funcție anonim care efectuează această operațiune.
Ea are acest parametru în cazul în care este de tip se deduce.
Că primul parametru este de $ 0 ° C.
Și o operație este întâmplă pe care $ 0 ° C.
>> Audiența: Deci semnul dolar înseamnă parametru în esență,
și 0 înseamnă primul?
DAN Armendariz: Asta-i corect.
Deci semnul dolarului înseamnă în esență parametru, și 0 înseamnă prima.
Dar funcționează în mod special în acest caz în care nu am numit
argumentele în funcția mea anonim.
>> Audiența: Are Perl sau ceva au acest semn dolar, dolar 0 acolo?
DAN Armendariz: Are care, îmi pare rău?
Audiența: Are Perl au acest dolar 0, dolarul 1--
DAN Armendariz: Nu sunt prea familiarizat cu Perl,
dar PHP ce definește variabile bazate pe semne dolar.
Și pot exista unele limbi care au caracteristici cum ar fi acest lucru.
De fapt, Swift împrumută o mulțime de caracteristici ca aceasta
dintr-un lot de alte limbi.
Vedem indicii de Python în ea.
Această definiție de tipul pare să vină de la OCaml.
Și avem doar o grămadă de chestii de la o mulțime de limbi diferite.
Acesta este unul de la Nisa lucruri despre Swift
este că este nevoie de o mulțime de cele mai bune idei de la o grămadă de limbi
și-le pe toate împreună shoehorns într-o singură limbă super-.
De fapt, dacă-mi permiteți să continua suflare mintea ta,
așa că am făcut toate astea.
Poate putem simplifica acest lucru un pic bit prin realizarea că, desigur,
Swift are un exponentiating Funcția construit în.
Dacă aș import Darwin, care este doar biblioteca care
Caracteristici această funcție numită Pow, acum Pot simplifica puterea mea a funcției
să fie următoarele.
Acesta va întoarce Această funcție anonim.
>> Dar uita-te la cat de simplu acest lucru este acum.
Aceasta este o funcție anonim care accepta un anumit tip de date,
și va fi una argument specific,
referință de la $ la 0, care este de tip Double.
Se va reveni la un tip de dublă.
Dar declarația de returnare este acum implicit.
>> Și este acest stil exact care este foarte, foarte răspândită în Swift,
peste tot.
Vom vedea acest tot timpul în Swift.
Așa că eu sunt arătând toate acestea pentru tine, pentru că de această sintaxă.
Acest lucru este foarte frecvente pentru a vedea, care înseamnă
este o funcție anonim care funcționează
unele operare pe aceste argumente.
Și există o întoarcere implicit.
Deci, este absolut același lucru pentru noi să spunem acest lucru, chiar aici.
>> Deoarece acest buclat suport este o funcție,
suntem efectua această operație pe primul argument.
Vom reveni la asta.
Dar această revenire exterior este revenind această funcție întreg,
această funcție întreg anonim că tocmai am creat.
Orice alte întrebări?
Bine, eu nu știu dacă voi sunteți gata pentru asta,
dar putem merge chiar mai nebun cu Swift.
Ești gata?
OK, aceasta este mare.
>> Acum avem de fapt capacitatea de la, în Swift, din cauza modului modular
și cum pe bază de protocol este, la defini propriile noastre operatori sperii.
Ca și în acest caz, am avut nici o Operatorul de exponentiation-- bine,
pentru efectuarea puteri de ceva.
Dar pot, în Swift, definesc un nou Operatorul care face exact acest lucru.
Deci, în acest caz, nu este o grămadă de sintaxă aici.
Și o să vă permit să se uite la ea la domiciliu atunci când te uiți la asta.
Dar noi suntem definirea acestei infix Operatorul, **, care va permite apoi ne,
prin definirea despre ce Funcția ** de fapt
nu, pentru a accepta o stanga laterale și o parte dreaptă,
și apoi să se întoarcă exponentul care stanga la dreapta.
>> Și astfel acum dintr-o brusc am au creat un nou numărător.
Deci 2 ** 3 înseamnă 2 la puterea a treia.
[Minte SUFLARE] acest lucru prin în sine ar trebui să vă fie ca,
OK, șurub C. am de gând Swift tot drumul.
Asta e super.
Acest lucru este destul de fantastic.
>> Deși acest lucru este un exemplu foarte bun.
Dar n-am avea din afara din acest exemplu de fapt
definit propria mea operatorului.
Dar totuși, arată o mulțime de puterea de Swift
și de ce acest lucru este de fapt într-adevăr foarte cool.
OK, da?
Audiența: Daca esti Definirea propriului operator
cum a face tu știi că nu accidental încercați și de a crea un operator care este
undeva în C, cum ar fi ascuns undeva în Swift,
ca unul obscur pe care nu fi văzut înainte.
>> DAN Armendariz: Deci, dacă sunteți încercarea de pentru a defini propriile operatori,
există riscul de a defini unul peste un operator existent.
Care merge într-un nivel de detaliu care Nu cred că avem timp pentru a trece peste.
Dar asta este un risc.
Și care este, de fapt, foarte motivul Nu am folosit simbolul caret, care
când suntem tastați din putere, am de obicei, utilizați 4 mic cursor 5 sau ceva
așa, doar atunci când suntem Gchatting prieteni sau orice altceva.
Dar, în acest caz, că, de fapt ar fi cauzat o coliziune.
Și așa că am evitat doar pentru că I sa întâmplat să cunosc în acest caz
că ar provoca asta coliziune.
>> In regula.
Acum, din păcate, pentru ultimele șapte minute,
Trebuie să păstreze suflare mințile voastre un pic.
Deci, permiteți-mi să vă arăt alte lucruri la fel de bine.
>> V-am arătat această idee de având aceste funcții anonime,
aceste închideri care vă permit să fel de a trece în jurul valorii de funcții.
Aveți posibilitatea să le returna.
Aveți posibilitatea să le manipula.
Puteți face tot felul de chestii nebun.
>> Dar un alt lucru care se întâmplă să fie utile
este abilitatea de a, spre deosebire a se întoarce aceste funcții
într-o funcție, pentru a trece o funcție ca un parametru la altul funcție.
S-ar putea fi de gândire bine de ce de pe Pamant aș vrea să fac ceva de genul asta?
>> Ei bine, să zicem că vreau de a lua acest operator pe care am
muncit din greu pentru a crea și de a aplica l la o grămadă de numere diferite
într-o matrice.
Deci, în acest caz, am o serie de integers-- 1, 4, 7, 2, 5, 10, 56.
Și vreau să-le pe toate dubla.
Modul în care ne-ar de obicei face este de a scrie doar
un simplu pentru buclă care reiterează peste toate
și de a efectua un fel de operațiune pătrat peste ele,
introducerea acestor noi valori într-o nouă variabilă, sau mai degrabă, o nouă gamă de aici.
Și valoarea de ieșire a Rezultatul este apoi toate aceste tablouri,
sau mai degrabă toți cei elemente pătrat acum.
>> Și am putea face același lucru lucru pentru cubaj ea,
dar un pic semnal de alarmă Ar trebui să fie merge off
spunând că poate exista un fel care ne-ar
putea simplifica acest lucru un pic.
Și, de fapt nu există.
Ce dacă am putea crea o funcție care ne permite
să accepte, ca un animal de pradă, o funcție?
Deci, în acest caz, să ia o uita-te la aceste argumente.
Vom accepta o listă de camere duble.
Și apoi vom merge să accepte o funcție
într-o variabilă numită f care va să ia o dublă și a reveni o dublă.
Și întreaga producție din tot acest funcție
numit Mapper este de gând să returna un array numit dublu.
>> Ce acest lucru ar permite apoi să mă faci este să itera peste această listă
și de a face același lucru, dar acum se aplică această funcție pe fiecare
din valorile individuale din această listă.
Deci, eu nu știu cu adevărat ce este f.
Nu contează pentru mine.
Dar atâta timp cât este nevoie într-o dublă, efectuează o operație pe el,
și apoi returnează un Dublu, aș fi atunci
capabil să hartă care funcția peste fiecare element unic în listă.
>> Și acest tip de programare este numitele funcții superioare de ordine,
în cazul în care ne trece funcții în jurul valorii de ca parametri
și de a face lucruri cu funcții.
E un fel de a lua toate acestea idei pe care le-am învățat în CS50
și luându-i un fel de la nivelul următor.
Și acest lucru este toate lucrurile stil CS51.
Și așa vom merge în profunzime mai mult în clasele de genul asta.
>> Dar acest lucru este, de asemenea, importantă aici pentru că am
a se vedea o mulțime de funcții care sunt utilizate în Swift
care, în esență, nu acest, unde avem
unele numere, unele serie de numere.
Vom trece că matrice în mapper nostru.
Și noi te, de asemenea, de gând să trece o funcție, care
am definit deja aici.
O să fie pătrat.
Și am de gând să atunci pătrat toate aceste numere
și se păstrează ca în acest rezultat de aici.
>> Deci, acest caz ne-am definit nostru Funcția propriu numit mapper.
Dar acest lucru este exact, De fapt, construit în Swift.
Există o varietate de funcții numit harta.
Există o funcție de hartă, există o funcție reduce,
și există o funcție de filtru, care se aplică, în esență, funcții
pentru fiecare element unic într-o lista a le modifica într-un fel.
>> Audiența: Deci din moment ce sunt de transformare datele în alt format
printr-o function--
DAN Armendariz: dreapta.
Da, așa funcția că suntem accepta
este transformarea datelor într-un fel.
În acest caz, am fost fie Cuadratura ea, sau am fost o cubaj,
sau într-adevăr, am putea efectua nici o operație pe el, la toate.
>> Dar lasă-mă să-ți arăt cum acest atunci este de gând să se uite în practică.
Și din nou, eu rulează un pic de timp. așa că nu sunt
va fi capabil să meargă peste tot a codului sursă aici, în detaliu.
Dar eu vă încurajez să faci asta.
Vom posta cât mai curând posibil după această discuție.
>> Dar, dacă aruncăm o privire la acest lucru, presupunem că avem o listă de numere,
o serie de numere în acest variabile numite numere.
Apoi ne-am dori pentru a efectua această operațiune filtru pe aceste numere.
Deci, este o mare filtru Funcția pentru ca
acceptă o matrice și, de asemenea, o funcție.
Și pe fiecare element în matrice, se efectuează această funcție.
>> Dacă asta se întoarce funcție adevărat, pastrand acel element.
Dacă această funcție returnează false, se aruncă acel element.
Și apoi se întoarce o listă care este apoi adusă tot
de acele elemente care au fost filtrate.
>> Deci, în alte cuvinte, acest lucru este aceeași idee, The cartea de note.
Am putea avea o varietate de clase în acest număr valoare numit.
Ar putea fi de 100, și 70, și 40, așa mai departe și așa mai departe.
Ce acest filtru nu este o notificare că acest lucru este că zahărul sintactic
pentru o funcție anonim.
Aceasta este o funcție anonim spune că parametrul pe care am accepta
va fi, în cazul în care este mai mare decât 70,
atunci acest lucru va reveni adevărat, ceea ce înseamnă că acel element vor fi păstrate în acest filtru.
Deci, hai sa fie un pic mai concret despre acest lucru.
Dacă am această matrice de numere și este alcătuită din 100, 70, și 40,
Am efectua acest filtru operație pe fiecare dintre acestea.
Așa că primul dintre ele este această valoare de 100.
100 mai mare sau egală la 70 este adevărat, care
înseamnă că 100 este menținută în această nouă copie a acestui tablou.
70, de asemenea, trece.
Dar 40 nu.
Deci, ceea ce este returnat în passingCount este matricea de elemente 100 și 70--
100, virgulă, 70.
Acestea au fost doar doi elemente care au fost păstrate.
Și astfel motivul pentru care am trecut prin rapid o mulțime de aceste tipuri de ordine de mare
lucrurile sunt pentru că acest lucru este faptul că comuna lucru pe care îl veți vedea în Swift destul de
frecvent, efectuează o operație folosind această sintaxă funcție anonim.
>> Există niște chestii misto.
Switch-uri sunt foarte puternic în Swift, Adică la fel ca un nebun, nebun puternic.
Puteți folosi switch, și le puteți aplica de fapt
la intervale, care este un fel de nebun, și de a face chestii de lux de genul asta.
>> Dar, în ultimele câteva minute, Vreau să treceți destul de departe
și-ți arăt un exemplu specific al modului putem crea în app iOS folosind Swift.
Așa că atunci când faci acest lucru, va trebui să ia
o privire at-- pe Apple documentație, ei
au o mulțime de tutoriale foarte bune pentru crearea de prima aplicare.
Și eu vă încurajez să faci că, deoarece acestea să luați
prin toate etapele de ce anume la click pentru a crea o aplicație iOS.
>> Dar aici avem această aplicație iOS.
Și este o aplicatie destul de simplu într-adevăr.
Dacă aș alerga acest lucru, să-mi arate tu ceea ce pare.
Tot ce face, în esență, este trage de pe internet un fișier JSON
care le-am stocate pe un server.
Și că fișierul JSON definește imagini care permit
mi să apoi parcurge, pe meu app, imagini de la serverul meu de web.
>> Așa că am aici getNextImage.
Se încarcă o imagine de pe internet, și apoi afișează pe ecran.
>> Deci, este destul de simplu.
Dar scopul aici este de a arăta vă cum putem combina lucruri
din ultimele câteva săptămâni de CS50 într-o aplicație reală iOS.
Cu alte cuvinte, poate una dintre cele mai lucruri pe care le va dori să facă
este de a avea o aplicație iOS care poate trage de date de pe internet
și arată utilizatorului unele informații.
Aceasta este în întregime punctul din acest cod sursă aici.
>> Deci, există o mulțime de spus despre cum se face actual de dezvoltare iOS.
Există o mulțime de sintaxă nebun că nu am văzut destul de încă
ca o clasă, ceea ce este de fapt o clasă.
Putem ignora în mare măsură că pentru moment.
>> Dar observați că am conținut în cadrul acestei o varietate de lucruri
pe care le-am văzut deja ca Funcțiile care au denumiri specifice.
Și când ne-am da celor funcționează numele corect
care sunt de așteptat de iOS, de fapt acest lucru se simte un pic magic.
Dar atunci când creați un aplicație iOS, acolo
sunt nume de funcții specifice care sunt numite de telefonul în sine
ca cererea este de încărcare pentru a încerca pentru a crea procesul care de fapt
rulează aplicația.
Deci, din nou, există o mulțime de lucruri pe care eu Trebuie să treacă peste aici pentru a ne
să vorbim despre asta în mod special.
Dar eu vă încurajez să te uiți la, probabil, pe de altă seminar iOS, dar, de asemenea, unele
de tutoriale online, care face un loc de muncă mult mai bine de a descrie
informațiile specifice.
>> Dar putem vedea o serie de lucruri pe care sunt interesante de codul aici.
Observați că avem, dacă declarații.
Apropo, unul important lucru despre if
este că parantezele din jurul Expresie booleană sunt opționale.
Dar acolade nu sunt opționale, indiferent de cât de puține sau mai multe linii de cod
aveți într-o declarație, dacă.
Nu poți avea o if fără acolade în Swift.
>> Și acest lucru este, de asemenea, un fel de prostie.
Dar există motive istorice pentru asta.
Ar trebui să vă salva de la tine.
Ca și aceasta, de exemplu, nu poți elimina acolade în jurul valorii de faptul că
if.
Acestea sunt, de fapt, necesare.
Așa că vă încurajez să aruncăm o privire la acest lucru.
Dar nu e una mai mult construi pe care vreau
să-ți arăt despre Swift că este nou la Swift 2.0, comparativ
la versiuni mai vechi ale Swift, care este după cum urmează.
Să vedem unde am pus-o aici?
>> Deci, în această funcție numită fetchJSON, această funcție
este responsabil pentru tragerea care JSON fișier de la o adresă URL, care se întâmplă așa
care urmează să fie difuzate pe IDE meu CS50.
Tocmai am început Apache, pune dosarul meu JSON acolo,
și eu sunt în măsură pentru a trage apoi că datele de pe Internet folosind
această funcție și această adresă URL, care este furnizată de telefon.
Este furnizat de un bibliotecă pe care le folosiți atunci când
ce faci unele de dezvoltare app iOS.
>> Observați aici că nu există acest neobișnuit construct sintactică numit paza.
Și într-adevăr toate acestea sunt în Swift este un mod de a verifica
că unele lucruri au fost îndeplinite înainte de a
continua cu restul funcției.
Așa că am putea avea, folosind acest tip opțional,
Aș fi putut găsit URL-ul de care rulează această funcție NSURL
și stocarea într-un URL care constantă, și apoi verificarea
pentru a vedea dacă a fost zero URL, pentru că a fost de gând să se întoarcă un tip opțional.
Și dacă a fost zero, atunci aș imprima o eroare și apoi să se întoarcă.
>> Dar, în loc, ceea ce permite de paza ne facem este că foarte lucru,
dar să se asigure că acesta este de fapt, cazul în care url
a fost stabilit în mod corespunzător de către NSURL.
Și dacă este, atunci sare peste acest lucru, și
vă va permite să continuați cu URL a fost definită în mod corespunzător.
Dar dacă este cazul în care url nu este definită în mod corespunzător,
dacă această funcție returnează o eroare sau un alt lucru neașteptat
apare de fapt, acest construct de paza ne permite să apoi de ieșire această eroare
și să se întoarcă imediat.
Da?
>> Audiența: Deci e un fel de ca un dacă, atunci altceva?
DAN Armendariz: Este un fel de ca o dacă, atunci altceva, da,
cu excepția faptului că această adresă URL este apoi definit pentru tot sub acest.
Dacă trece această pază, atunci va fi de fapt umplut cu date
și utilizabile în restul codul sursă în funcția.
Deci bănuiesc că ai de gând să începe să privească acest paza, de asemenea.
Și să fie conștient de acest lucru.
>> Deci, sa ne uitam la o pereche de altă lucruri, acest drept aici este ceea ce,
crezi, doar bazat pe ceea ce vorbeam despre înainte?
>> Audiența: cred că va rula în listă?
>> DAN Armendariz: Deci care este aproape.
Aceasta este o funcție care suntem definirea.
Și noi suntem introducerea acestei funcții ca un argument pentru a această funcție aici.
>> Audiența: [inaudibil] dacă nu zero.
Deci, este pe lista, nu?
>> DAN Armendariz: Dacă eroarea nu este zero, astfel încât este--, așa că am avea pentru a defila.
Ei bine, să vedem, nu pot într-adevăr derulați la dreapta aici.
eroare este un argument care este în curs de trecut la această funcție anonim.
Aceasta este o funcție anonim.
Nu are nici un nume.
Dar noi suntem acceptarea acestor trei argumente, date, răspuns, și de eroare.
Și se va întoarce gol la, astfel încât nu va să se întoarcă nimic.
Și acest lucru este conținutul de această funcție.
Și apoi avem acces în interiorul că Funcția de fiecare dintre aceste argumente.
>> Deci e un vârtej de vânt tur al limbii.
Dar sper cu acest lucru, sperăm ca să luați
o privire la unele dintre tutoriale specific pentru dezvoltarea iOS cu Swift,
mai ales daca te duci la Apple web developer page--
au o mulțime de foarte bună Tutoriale a obține ai început.
Dar sperăm că doar această oră de a vorbi despre sintaxa în sine a dat
vă suficient pentru a începe cu.
>> Vom posta toate acestea surse cod pe site-ul seminarului
cât mai curând posibil, și, de asemenea diapozitive astfel încât să aibă o referință pentru toți cei.
Dar noroc cu proiectele dumneavoastră.
Și vă mulțumesc tuturor foarte mult pentru venirea.
>> [APLAUZE]