>> [MUZIKO Ludante]
>> DAN AMRMENDARIZ: Everyone, bonvenigi al la CS50 seminario,
iOS App Disvolviĝo kun Swift.
Mi estas Dan Armendáriz, kaj mi estas preceptor de komputiko tie en Harvard.
>> Kaj la sekva horo tuj estos ventego turneo de tanta havajxoj
pri tiu temo kiel ni povas persvadi.
Mi afiŝos ĉiujn la fontkodo ke vi vidos hodiaŭ rete.
Ni eble ne povos fakte transiru ĉio
ke mi estas, ke mi estas montrante vin en tiu horo.
Sed almenaŭ espereble tra la komentoj de la fontkodo,
vi povos provi elkompreni ĝuste okazas por tiuj aferoj
ke ni ne tute atingi.
>> Totala, la strukturo de hodiaŭa diskuto estos kiel sekvas.
Ni komencos ekstere faranta kelkajn bazajn sintakso kun la Swift lingvo,
iro en iuj de la pli progresintaj sintakso de la Swift lingvo.
Pro la lingvo estas vere moderna kaj ĝi
havas multajn alta nivelo trajtoj, aĵoj kiujn ni havas ne
vidita en C laŭlonge CS50, aŭ eĉ kelkaj la aliaj lingvoj
ke ni komencis uzante en CS50 kiel PHP,
Do mi estas iranta devi provi enkonduki ankaŭ iuj temoj kiuj
rilatas al pli alta nivelo lingvoj ke vi ne vidos en profundo en CS50,
sed vi vidos en postaj komputiko klasoj.
Do ĝi estas tuj estos pakitaj horo.
Kaj bonvolu permesi min scii se vi havas demandojn.
Do se vi estas interesata farinte disvolviĝo
kun Swift, aŭ vere ajna IOS app disvolviĝo,
ekzistas kelkaj postuloj.
Unue, vi devas esti uzanta Mac, kurante en la ekzemploj
ke ni tuj estos uzante hodiaŭ, relative nova versio de VIN
X. En tiu kazo, Mi kuras X 10.5.
Vi povas kuri 10.11 se vi volas.
Sed cxion vi tuj vidi estas engaĝante Xcode 7 kaj poste,
kiu havas la lastan version de Swift, kiu estas Swift 2.0.
Tiu estas fakte bela grava distingo.
Multa la sintakso havas ŝanĝis bela signife
en iuj kazoj de Swift 1.0, kiu estis liberigita lastan jaron,
Swift 2.0, kiu nur elvenis tiu falo.
Do ni tuj montros Swift 2.0.
Multa la aferoj vi serĉi rete
kiam vi provas akiri aldonan informoj pri vario de aferoj,
vi eble volas eksplicite serĉi Swift 2
anstataŭ nura klara malnova Swift fari certe ke vi akiras la sintakso korekta.
>> Fakte, ĉi tiu estas ĝenerale vera.
Ekzistas rapida kvanto de evoluo okazanta en la Swift lingvo
ekde Apple liberigis ĝin, mi pensas kion, jam pasis iom pli ol jaro
nun.
Kaj aĵoj ŝanĝis drame en tiu tempo.
Kaj do ne estos frustrita se, kiam vi serĉas ĉirkaŭe
por temoj sur Swift aŭ kiel plenumi io uzante iuj ekzemplo kodo
aŭ ion ke ĝi ne reale labori sur Swift 2.0.
Certiĝu vi serĉas specife por tiu versio
provi minimumigi efikojn de malsamaj versioj kaj tiuj specoj de aferoj.
>> Mi provos atentigi nur iuj aferoj ke estas malsamaj al la malnovaj versioj.
Sed estas io rigardi ekstere por.
Ke estas probable tuj estos unu el la plej grandaj kapdoloroj
ke vi havos kun Swift estas trovanta Ekzemple kodo kiu estas pli malnova, eĉ ĵus
de kelkaj monatoj, klopodante uzi ĝin en viaj pli moderna projekto.
Kaj ĝi tutsimple ne funkcias.
Vi fariĝas kompililo eraroj, sintakso eraroj, ĉiaj frenezaj aĵoj.
Do simple estu pacienca kun ke, kaj vi espereble
havi sufiĉe bela sperto kun Swift entute.
>> Nun vi povas reale join-- kaj mi esperas ni fakte ankoraŭ havas ĉi tiun year--
CS 50 Apple app disvolviĝo teamo, kiu
permesos instali ajna apps kiun vi kreas en via iOS aparatoj.
Do rigardu ĉi URL se vi interesas fari tion.
>> Do nur kelkaj aferojn pri Swift mem.
Estas kompilita lingvo.
Sed vi vidos ke iu de la trajtoj kiujn ni uzas
permesas uzi ankaŭ en iom kiel interpretita vojo ankaŭ.
>> Multa la sintakso estas pruntita de C. Ĝi estas bazita kaj skribita en C.
Kaj do ni vidos ke ekzistas multe de takeaways
de via ekzistanta scio de C ke ni povas haveno Swift.
>> Sed estas aĵoj kiuj fari ĝin tre malsama de C.
Ĝi estas tre forte tajpita.
Ekzistas aŭtomatan prizorgadon de memoro.
Vi ne tuj devas uzi malloc aŭ libera ie.
Ĝi estas desegnita por ĝeneraleco.
Do alivorte, vi povas uzi ĝin en ĉiaj kuntekstoj, de Apple Watch
por iPhone tuta vojo supren al OS X, kaj eĉ kelkaj serviloj, eĉ iuj scripting.
Sed ni vidos, ke la subteno por scripting
ne estas tre tie ankoraŭ kiel ĝi estas en aliaj lingvoj.
Do plej verŝajna vi estos uzanta ĉi ekskluzive por disvolviĝo
sur via Mac aŭ via iPhone.
>> Kaj ĝi havas multajn modernajn trajtojn.
Kaj multe da tiuj aferoj estas aĵoj ke ni tuj provos alparoli hodiaŭ,
sed ankaŭ niaj topikoj kiuj sincere, ni povas dediĉi tutan kursoj.
Fakte, CS 51, kio estas proponis sekva semestro,
centras tre sur ĉi tiuj temoj kiu estas priskribitaj sube.
Do vi povas elspezi tutan semestro kompreni tion.
Sed ni tuj provos akiri tra ili
almenaŭ sufiĉe ke vi povas kompreni kio estas
daŭriganta kiam vi rigardas ĉe Swift programo
kaj povos pirati vian vojon tra ĝi por la fina projekto.
>> Nun unu el la plej bonaj manieroj kiuj vi povas ricevi aldonan informon sur ĉi
estas sincere ĵus tra Apple provizis dokumentadon por Swift.
Ekzistas multe de APIs ke estas haveblaj.
Kaj tiu estas bona hejmbazo por vi serĉi, specifaj aferoj, ke vi
volas fari kun API engaĝante iOS.
Se vi volas uzi la ĉambron por Ekzemple, vi povas komenci rigardante tien,
kaj ankaŭ uzi Google kaj Stack Overflow kiel vi farus normale.
>> Demandojn sur tiu antaŭ ni salti bone?
Bone.
Ni movi sur.
>> Do unue, mi havas numeron de ekzemplo dosieroj.
Kaj mi tuj provi paŝi tra ili relative rapide.
Jen la Hello World dosiero por Swift.
Ĝi estas tre simpla.
Tie estas vojo pli komentoj ol ekzistas fakta kodo.
Rimarku la reala kodo estas ĉe la tre fundo sur linio 14.
Ĝi diras presaĵo.
Kaj tiam ĝi estas funkcio alvokon.
Ni pasante en ĝin ŝnuro nomita Saluton CS50.
Rimarku ke estas neniu punktokomojn.
Rimarku ke ne estas int main.
Ekzistas neniu el la cruft ke ni havis kun C.
Kiam ni uzas Swift tiamaniere, kiu estas ĝuste skribita en teksta dosiero
kaj stokita sur mia komputilo, tiam Mi povas kompili ĝin kaj ruli ĝin.
>> Rimarku, ke ĉi tie mi estas ne uzante la CS50 IDE.
Tiu supozas ke mi estas kurante kaj ke mi estas sur OS X,
kaj ke mi Xcode jam instalita sur tiu maŝino en ordo por tiu
efektive funkcio.
Sed tio estas nur normala teksto dosiero ke ni povas tiam kompili kaj redakti.
Do ni vidu kiel ĉi efektive funkcias.
Kio se mi volas kompili ĝin?
swiftc 1.swift.
Post unu du momentoj, ĝi vidos, ke ni havas nun
kompilis ĉi en dosieron nomitan 1.
Kaj nun ni presita nia CS50, niaj Saluton Mondo apliko prefere.
>> Rimarku unu alia aĵo kiel bone estas ke defaŭlte,
ni ne devis enigo a / n presi novan linion.
Defaŭlte, la presita funkcio en Swift presos nova linio por vi.
Vi povas pasi laŭvola aldonan parametro sciigi ne fari tion.
Sed Google por pli informo sur tio.
Defaŭlte, ĝi faros la presaĵo linio.
>> Bone, do ni pluiru tiam al iuj aliaj aferoj.
Do kiel ni povas fakte difini variablojn?
Ni povas fari ke estas uzanta unu el du metodoj.
Kaj kiu mi volas rakonti al vi pri unua estas ĉi let difino.
Kaj tio estas grava ĉar efike
kion ni faras estas difinanta konstanta.
Ni iras al krei variablon, aŭ prefere konstanta nomita nomo,
havigi al ĝi iun data-- en Tiam la ŝnuro Dan.
Sed uzante tiun let ŝlosilvorto, ni diras
ke ĉi variable-- aŭ denove constant-- vokis
nomo neniam tuj estos ŝanĝitaj.
Ĝi okazas esti neŝanĝeblaj ĉie la daŭro de tiu ĉi programo
aŭ tra la daŭro de la kunteksto
ke tiu variablo estas havebla.
>> Tiu estas vere grava ke kiam vi havas iujn datumojn kiuj ne
tuj ŝanĝos en via programo, kaj vi vidos diversajn ekzemplojn
pri kiam ni volas uzi lasu kontre la alia sintakso,
ĝi estas grava ke vi uzas lasu laŭeble ĉar tiu novaĵo
la lingvo kiu ĝi estas Ne tuj estos ŝanĝita,
kaj ĝi efektive povas elfari multajn optimizations
plibonigi la rapidon kaj la sekureco de via programo.
Kaj apud sekureco, mi diras tion, ne lasu ĝi kraŝo kun freneza eraroj
ke ni estu kutimis vidi en C.
>> Tiam ni povas uzi kordoj interpolo encapsular ĉi ene ŝnuro.
Do ni povas vidi en ĉi print line, presi saluton,
kaj tiam uzanta backslash malfermita parens, kaj tiam la nomo de mia variablo,
tiukaze konstanto, fermi la parentezoj.
Mi esence tiam metante la enhavo de ĉi tiu variablo nomita nomon
ene de la kordo kaj tiam presi la rezulton tie.
>> Ekzistas unu alia ŝanĝo al la dosiero kiu estas kiu havas, ĉe la plejsupro,
metis en shebang linion, kiu resume nur precizigas
ke mi volas uzi la Swift interpretisto, kiu
signifas ke mi ne plu devas kompili ĉi aparta programo.
Mi povas nur kuri ĝin kiel lia propra skripto.
Sed tio estas, en tiu kazo, malantaŭ la scenoj estanta kompilita kaj tiam
esti kuro.
Estas nur nevidebla al ni.
>> Bone, do ni pluiru.
Do tie estas iom de trompo ke nur okazita antaŭe.
Mi montris al vi, ke mi povus difini konstanta.
Kaj mi povus havigi iujn datumojn por fari ĝin.
Sed en ĉi tiu kazo, rimarki ke mi ne fakte specifi la tipon de datumoj
ke estas.
Kaj tio estas ĉar la tradukilo, Swift povas
konkludi la tipon de datumoj bazita nur sur la datumoj kiujn mi metas en ĝin.
Ĉar ĝi scias ke per pritaksanta ĉi ŝanĝiĝema dekstra tie, ĉi tiu datumo dekstra
tie, ĝi scias ke ĝi estas ĉeno.
Do tiu konstanta nomo estas do tuj estos ĉeno ankaŭ.
>> Sed ni povas ankaŭ esti eksplicita pri la tipo kiu estas
ni tuj uzos por konstantoj aŭ variabloj
uzante tiun sintakson instead-- lasu nomon dupunkto String egalas
Dan, kiu en ĉi kazo signifas ni estas tuj difini konstanta nomata nomo.
Ĝi okazas al esti de tipo String.
Kaj la valoro tuj estos Dan.
Nun la alia vojo ni povas krei variables--
kaj tio estas ŝanĝebla variabloj, kiuj signifas, ke ni estas, fakte, irante
ŝanĝi iliajn enhavojn iam en la daŭro de la kunteksto
ke tiu variablo estas defined-- ni uzi la var ŝlosilvorto anstataŭ lasu.
Sed denove, implicite, krom se vi scias ke vi bezonas manipuli tiun datumon,
provu uzi lasu por agado plibonigoj.
>> En tiu kazo, mi povas tiam specifi la tipon de datumoj
ke ni atendas esti interne de tiu nova variablo nomata etikedo.
Ĝi tuj estos ĉeno.
Kaj ni tuj poste concatenate du kordoj kune, la kordo saluton,
kaj la kordoj reprezentita de la variablo, aŭ prefere la konstanta nomo.
>> Do tiu estas bela ĉar ĉi Estas iom PHP same kiel en kiuj ni
havas tre facila ĉenon kunmeto.
Ni ne devas aŭtomate uzi ajnan specon de memoro mastrumado
pliigi la grandecon kaj fari omnaspeca amuzajn aferojn tie.
Tio funkcias kiel ni estus reale atendi.
>> Bone, demandojn en ĉi?
>> Nun la alia kialo ke ni bezonas vi havas la kapablon
povi difini kio tipo de datumoj variabloj estas
Estas ĉar kelkfoje ne volas pravalorizi variabloj
kun kelkaj datumoj ĉe la punkto de difino.
Do en ĉi tiu kazo, ni diru ke mi volas komenci inputting
kelkaj gradoj enen lernojaro libron.
Nu mi scias, ke unu el la variabloj, ke mi volas esti
tuj esti mutables lernojaro.
Kaj ni ankaŭ scias ke ni volas esti entjero.
Sed eble ni ankoraux ne havas tiun gradon havebla.
>> En Swift, vi devas difini la tipon de datumoj
kiu estas asociita kun variablo aŭ lasu konstanta
Antaŭ vi povas reale uzi tiun variablon.
Ĉar ĝi estas forte tajpitaj, vi devas asocii tipo
kun ĉi tiuj variabloj.
>> Do en tiu kazo, se mi ne konvene pravalorizitaj la unua kun iu valoro,
tiam mi devas diri al Swift kio Mi atendas la datumtipo esti.
Kaj ĝi tuj restos tiu sama datumtipo
laŭlonge de la historio de tiu programo.
>> Nun vi povus esti tentata kiam Mi kreis ĉi lernojaro ŝanĝiĝema
kaj provizis ĝin entjero 100, nun se mi
volas provi concatenate ŝnureto kun tiu entjero,
eble estus tentita ankoraŭ uzi ke kordoj kunmeto operatoro
kiel ni faris nur kelkaj linioj antauxe.
Sed bedaŭrinde, ĉi efektive ne
labori, ĉar vi estas esence elfarante
operacio sur du malsamaj tipoj.
>> Nun tio estas tre malsama de aliaj lingvoj kiel PHP kiu vere
loosey Goosey kun ilia speco de tipoj.
Ili estas nur ŝatas, jes, ajn, mi ne zorgas.
Nur donu al mi unu tipo, kaj eble mi faros la ĝustan aferon.
>> En tiu kazo, Swift estas ekstreme strikta pri la tipoj
ke vi estas kontraktanta kun.
Ĉi sumado operatoro aŭ kunmeto operatoro
havas esence kelkaj malsamaj eblaj ebloj.
Vi povas fari sumado kun entjeroj, aŭ vi
povas fari ĉenon kunmeto, kaj eble iuj aliaj aĵoj ankaŭ.
Sed se tiu operatoro ne rekonas kio estas ambaŭflanke de ĝi,
aŭ prefere la kombino de tiuj du tipoj, estas ne kio ĝi estas atendanta,
tiam tuj kaŭzi misfunkciadon.
>> Do en ĉi tiu kazo, kion ĝi signifas havi ĉenon plus entjero?
Nu en la kunteksto de tiu, ni probable volas
fari ĉenon kunmeto operacio.
Sed kompreneble la komputilo ne havas tian kuntekston.
Kaj tial ni devas provizi ke aldonan informon
lasi ŝin scii kio estas ke ni volas fari.
>> Do alivorte, la fakto ke Swift estas forte tajpitaj
signifas vi devas fari Iomete de plia laboro
por akiri ĝin funkcii la maniero ke vi dezirus.
Sed kiel rezulto, ĝi estas pli sekura.
Kaj unufoje vi havas prenu konsideri tiujn tipojn,
aferoj nur sincere komenci labori sufiĉe bone.
>> Do en ĉi tiu kazo, ni tiam farus elfari ĉenon kunmeto
per eksplicite ĵetantajn la entjeraj al ŝnuro
envolviendo en ĉi ĉefurbo S String funkcio,
kaj tiam uzante la ĉenon kunmeto operatoro modifi nian etikedo ŝanĝiĝema,
kaj tiam presi ĝin.
>> Ĝis nun, tiel bona?
Bone, ni pluiru.
>> Nun estas vario de datumoj tipoj kiujn ni povas uzi en Swift.
Kiel vi kutimiĝis al, ni povas krei mutables tabelo.
Kaj tiu tabelo povas nur enhavas ununuran tipon.
>> Do en ĉi tiu kazo, ni tuj kreos a mutables arrays de entjeroj, kio
ni nomos gradoj, kaj ni povos stoki ke en tiu kvadrata krampo
formato kiel vi kreskis alkutimiĝis al en vario de aliaj lingvoj.
Sed rimarki ke tie ni estas difini kelkajn aferojn.
gradoj estas mutables variable-- ni ne uzas la Let ŝlosilvorto.
Do tio signifas ke ni povas tiam redakti la enhavo de ĉi tiu tabelo.
Ĝi estas de tipo array Mez, kaj ni povas diri ke
bazitaj sur tiuj rektaj krampoj tie.
>> Nun unu el la agrablaj aferoj pri tio estas ke ni
havas aliron al multaj aldona informo
pri la tabelo nur uzante kelkaj simplaj skalara skribmaniero.
Do ekzemple, grades.count nin havigas
la nombro de eroj kiuj ekzistas en tiu tabelo, kiun ni tiam povas aliri bela
facile simple uzante ke skalara skribmaniero.
>> Se vi volas aldoni pliajn erojn al tiu tabelo,
vi ne povas plenumi la PHP stilo kie vi simple eksplicite difini,
je donita indekso, iu valoro ke vi volas enmeti.
Anstataŭe, uzu la append metodon en la tabelo tipo
al append ke eron, 95, al tiu listo.
>> Do nun tiu tabelo havas la jenan contents-- 100, 0, 90, 85.
Kaj nun ni almuntita 95 por ke tiel.
>> Estas aliaj manieroj ni povas append aferojn.
Vi povas fakte uzi a sumado operatoro,
kiu estos interpretita kiel tabelo append operacio.
Kaj vi tiam povas append alian tabelo, kies enhavo estas 70 kaj 80,
al tiu tabelo.
Do nun ni havas la enhavoj en tiu variablo
grades-- 100, 0, 90, 85, 95, 70, kaj 80.
Tiu estas nur belan sintaksa sukero kiu Swift disponigas al ni.
>> Do se ni volas elprenu la kvalifikojn, ni eble
tuj volas persisti super ĉiu ero en ĉi buklo.
Kaj ni havas, en Swift, la nocio de a por buklo kiel atendite.
Sed la vojo kiun ni indikos gamo estas iomete malsamaj.
Do en ĉi tiu kazo, al Resume ĉio, ni
tuj krei portempan variablo nomata sumo por ke ni
subteni tiun grafo.
>> Kaj rimarki nia por buklo konstruo tie.
Por indekso en 0 .. <grade.count.
Do tiu konstruo, 0 .. <grades.count Estas gamo operacio kie ni estas
dirante ke ni intencas krei gamon de entjeroj de 0 ĝis
al sed ekskludante grades.count.
Do tiu estos 0, 1, 2, 3, 4, 5, supren ĝis tamen multaj unu
antaŭ grades.count.
>> Do tiu estas malsama ol kiom ni estus tipe uzita por bukloj
kie vi havus iujn indekso variablo, starigis ĝin egala al 0 ĉe unua,
kaj tiam integri ke ĝis kelkaj valoro malpli ol la grafo de eroj
en tiu tabelo.
>> Do tie estas modifo al tiu, fakte,
kiu nin permesas tre facile difini malsamajn tipojn de gamoj.
Se vi ŝanĝas ĉi gamo al tri punktoj, 0 ... grade.count,
tio reprezentas la limigo 0 al grades.count inkluziva,
signifante ke tiu nombro estas ankaŭ tiam inkluditaj en tiu gamo.
>> Sed tiu estas tre oportuna por tiuj ĝusta aferojn,
kiam ni devas elfari ripetoj super loop
ĉar tiuj indeksoj estas nulo indeksita, kiel ni vidis en aliaj lingvoj
ankaŭ.
Demandojn sur tiu por buklo?
>> Do ekzistas implica difino de tiu indekso ŝanĝiĝema,
kies valoro komencas je 0, kaj Daŭre ĉe ĉiu iteracio iteration
pliigi per 1 ĝis punkto kiu estas egala al grades.count,
ĉe kiu punkto, la buklo abortas.
>> Rimarku ke en nia kordoj interpolado tie,
ni povas fakte plenumi kelkajn simplajn manipuladoj al tiuj valoroj.
Do indekso plus 1 efektive elfari sumado de tiu valoro
ĉar indekso estas, tiu kazo, entjero.
Kaj je tiu punkto, ĝi volo tiam esti konvertita en kordo
kaj interpolita en tiun ĉenon tie, kaj presita ekster kiel ni atendus. .
>> Kaj la bela afero pri la sensilo tie estas
ke ni ankaŭ povas havi kolektadon valoroj kaj fiksanta valoroj
uzanta la kvadrata krampo skribmaniero kiel ni vidis en aliaj lingvoj ankaŭ.
>> Bone, do de tie, ni nun komputi nia sumon de ĉiuj niaj gradoj.
Nun ia la sekva logika paŝo estus
fari apartigon operacio por trovi el la mezumo de tiuj karakteroj.
Sed io grava tie okazas kiu
estas ke tiu sumo estas eble entjero.
Sed ni bezonas fari kelkajn ia duobla divido.
Kaj tiu tuj estos ekstreme grava kiam
ni volas realigi ĉi tiun operacion, ĉar kion ni diras
estas ke ni devas reale elfari divido en du duoblojn.
Kaj denove, ĉar Swift estas tre forte tajpita,
ni devas eksplicite metis ĉiujn erojn por duobloj antaŭ ni efektive
elfaro operacio.
>> Do, por ke ni elfari duoblan divido,
ĝi ne estas sufiĉa por nur unu de tiuj eroj por esti duobla.
Ambaux devas esti duobla en ordo por rapidkuraj
esti certa, ke tio kion ni volas fari.
Do ni tiam eksplicite typecast la sumo kiun ni komputita supre
kaj la grafo de gradoj al duobloj, kaj tiam elfaro operacio kaj vendejo
ke en tiu nova variablo, aŭ prefere tiu nova konstanta nomita averaĝa,
kiu havos kio tipo, vi imagi?
Duobla, yeah.
Do en ĉi tiu kazo, ni ne devas doni gin
ĉar ĝi povas esti konkludita el la operacio kio tipo de datumoj mezumo
estos.
Kaj Swift estas ĝenerale sufiĉe bona pri povi konkludi la tipoj.
>> Ĉu vi volas vidi ĉi kuri, aŭ mi povas pluiri?
Mi volas plu iri.
Demandojn pri ajna el tio?
Granda.
>> Nun ni iras por komenci atingi la bona stuff-- difinanta funkcioj,
kaj paro de aliaj tipoj kiuj estas unika Swift ke vi havas ne
vidis en aliaj lingvoj supren ĝis tiu punkto,
sed ili ekzistas en aliaj lingvoj kiujn vi povus trovi pli poste.
Do unue, se vi volas difini funkcio,
vi difinas ĝin per la funky vorto funkcio, kaj tiam la funkcio nomo,
kaj tiam en krampoj, la argumentoj ke vi volas tiun funkcion akcepti.
La argumentoj devas ankaŭ specify-- generally--
devas ankaŭ specifi la tipon de datumoj kiuj ili estas, se ili povas esti konkludita.
Kaj ni vidos ke iom averto en nur iomete.
>> Do en ĉi tiu kazo ni havas funkcio nomita printGradeCount.
Ni tuj akcepti variable-- aŭ prefere tiukaze
a constant-- nomita gradebook.
Kaj ĝi tuj estos de tajpu tabelo de entjeroj.
Nun estas io tio estas vere grava tie
ke mi volas ke vi komprenu.
Aŭ estu kiu defaŭlte, tiuj argumentoj ke estas enigaĵoj al tiu funkcio estas
difinita kun implicita liberigite ŝlosilvorto, kio signifas ke mi ne povas modifi ĉi
gradebook variablo tie.
Kaj tiu speco de Indas, ĉar vi pasanta datumojn.
Kaj vi eble ne volas ĝin esti ŝanĝata de sub vi.
Eblas eksplicite mencias ke tiu estas variablo metante
la var ŝlosilvorto ĉi tie.
Sed tio estas Gotcha ke ni rimarkis homoj faris en la pasinteco
estas ke ili supozis ke ĝi tuj esti variablo kiam, fakte, ĝi
estas konstanta.
>> Bone, do jen do, en tiu kazo, ni ne specifante ia reveno tipo.
Ni montros vin kiel fari ke en nur momento.
Sed rimarki ke tie ni havas nur simpla se kondiĉo.
Se la gradebook estas malplenaj, kiu tiukaze
estas nur la propraĵo de tiu entjero tabelo, tiam ni presi ion.
Alie ni faru ion alian.
>> Bela simpla ĝis nun mi pensas.
Sed halti min se vi havas demandojn.
>> Nun tiun funkcion, averaĝe, ankaŭ prenas iuj argumentoj, aŭ prefere unu argumento,
kiu estas la gradebook, kaj ĉifoje tuj revenos duobla tipo.
Ĉar ĝi estas komputanta la mezumo kaj ĝi estas
tuj reale reveni ke kalkulitaj mezumo por kunvokado linio.
>> En tiu kazo, ni specifi la reveni tipo post sago.
Kaj tiu povus senti ia stranga, unue.
Vi kreskis alkutimiĝis al difino de la reveno
tajpi antaŭ la nomo de la funkcio.
Sed se vi pensas pri tiu en terminoj de matematiko,
kiel kiam vi havas matematiko ke difini funkcion,
vi havas funkcion kun iuj enigoj, kaj ĝi produktas eligo.
Kaj tio estas ĝuste kion ĉi laŭsupoze imitas.
Kaj estas kelkaj aliaj lingvoj kiuj havas similan sintakson tiel,
sed probable neniu vi vidis en CS50.
Sed ankoraŭ ne konfuzus ĝin.
La sago signifas kion tuj esti revenis en tiu kazo.
Bone, do kiel ni komputi ĉi mezumo?
Nu, se la gradebook malplenas, bone tiam ni estas
tuj revenos 0, kiu eble racia maniero trakti tion.
Mi ne scias, ni venas revenigu en iomete.
Tio povas ne reale estu racia maniero
komputi mezumo se ni havas malplenan gradebook.
>> Tiam ni simple elfari niajn sumado.
Rimarku, ke ĉi tie ni efektive havas alternan version de
por buklo, kio permesas al ni persisti super ĉiu sola ero en tabelo
kaj meti ĉiu elemento en ĝian propran variablo.
Specifante por grado en gradebook, kion ni diras
estas ke ni tuj implice krei novan konstanta nomata
grado kiu tuj reprezentos ĉiun solan eron en la gradebook
ĉiufoje ke la por buklo ripetas.
Do la unua fojo ke ĝi kuras, lernojaro volo
esti la unua ero en la gradebook.
La dua tempo ĝi estos la dua listero, tiel plu kaj tiel plu
ĝis gradebook havas elĉerpita mem de elementoj.
Tiam ni povos resumi ke grado en nian sumado ŝanĝiĝema
kaj redoni nian duonan kiel ni vidis antaŭe.
OK, demandojn?
Jes?
Publiko: Mi havas du demandojn.
Numero unu, hipoteze, povas vi kuros entjero sur ĉi tiu?
Ne devas esti duobla, estas ke korekta?
DAN AMRMENDARIZ: Ĉu vi povas ripetas tiun demandon?
Publiko: Povas min fari entjero kiel averaĝa?
DAN AMRMENDARIZ: Ĉu vi povas fari entjero kiel mezumon?
Do reveni entjero mezumo anstataŭ duobla?
>> Publiko: Return-- vi havas tiun rajton nun sube.
DAN AMRMENDARIZ: Dekstra tie, reveni 0.0?
Publiko: Yeah, simple reveni 0.
Do estos ĉu 80 aŭ 85, sed ne 85,2.
>> DAN AMRMENDARIZ: Do en tiu kazo, do tie estas kelkaj malsamaj manieroj
respondi tion.
Lasu min respondi ilin en ordo.
Do se mi nur klarigu reveno 0, 0 estas entjero valoro.
Kaj tial kaŭzos tipo eraro por tiu kazo
ĉar ĝi atendas duobla sed tiam reveni entjero.
Se mi volas reveni entjero, mi povas.
Mi povas agordi la reveno tipo al int, revenu 0 tie,
kaj ne plenumos duobla divido.
Sed tiam ni estus faras entjera divido.
Kaj do ni tiam ne akirus la mezumo ke ni eble atendus.
Sed jes ni povas modifi la tipojn en tiu maniero.
>> Publiko: Kaj due, vi havas la duoblan sur la supro.
Sed malsupre, kiam vi fari reveni Double Double,
jen jam aŭtomate reveninte Duobla formato.
Kial vi ankoraŭ bezonas difini ĝin kun sago sur supro kun Duobla?
>> DAN AMRMENDARIZ: Do en kazo, ĉi tiu estas parto
de the-- tiel ripeti la demandon, ĉar ĝi estas implicita de la reveno
tipoj tie, kio tipo ĉi reale estas, ni devas esti eksplicita kun Swift
pri kio ni volas reveni el tiu funkcio
tiel ke kiam elfaras tajpas kontrolanta, ĝi povas certigi
ke kion ni reale skribita malsupre fakte konformas al tio.
Do ĝi estas speco de kiel ĉeko kun vi mem tia situacio.
Sed are--
>> Spektantaro: [inaudible] arrow?
>> DAN AMRMENDARIZ: Estas kazoj kiam ni povas specifi ke ni povas implice
starigis la reveno tipo.
Sed en ĉi tiu kazo, mi ja ne pensas ke ĝi funkcius.
Ekzistas iuj aliaj sintakso ke ni vidos poste.
>> Bone, do ĉi fonto poŝtkodo estas iomete malsama
ĉar ĉi parses argumentoj de la funkcio kiu ni vokas.
Lasu min montri vin kiel ĝi funkcias antaŭ ni efektive movi sur
al iuj interesaj aferoj ke okazas en Swift.
>> Do en tiu kazo, se mi nur kuri ĉi kodon, rimarki ke kio faras
is-- dum, ĝi ia donas al mi strangan eraron.
Mi bezonas por pasi ĝin kelkajn entjeroj kiel komandlinia argumento.
Do ni vidu, 150 kaj 80, kaj batis Enter por eltrovi kio ĝi estas fakte faras.
Ĝi estas akcepti ĉiu el tiuj valoroj kiel entjeroj.
Oni inputting ilin en gradebook.
Kaj tiam ĝi estas elfaranta ke mezumo kalkulo
kaj elirigi ke kiel ni atendus.
>> Sed evidente ekzistas io iranta sur kun ĉi malakcepti ion
io kiel entjero.
Kiel vi eble memoras de kiam ni estis kontraktanta kun komandlinio argumentoj
en C kaj aliaj lingvoj, la plej unua 0-a artikolo en tiu komandlinio argumento
lerta estas la nomo de la komando ke ni efektive ekzekutitaj.
Do en ĉi tiu kazo, mi simple looping super ĉiuj komandlinio argumentoj.
Sed mi ne faras ajnan specon de imago kontroli salti super tiu unua.
Mi estas nur eksplicite aŭ mi estas implice kontrolanta kiu el tiuj tipoj
estas entjeroj antaux mi reale elfari ĉi kalkulado.
>> Kaj tio estas esence kio okazas ĉi tie.
Por ĉiu argumento en la procezo de argumentoj,
Mi tuj plenumi iun ĉeko.
Kaj en ĉi tiu kazo, mi tuj provi unua konvertito
tiu argumento en entjero per plenumante eksplicitan typecast,
ĉar ĝi estas, sur enigo, ŝnuro kaj ne fakte entjero.
>> Sed ĉi tiu estas speco de stranga sintakso, se lasu grado egalas Mez (argumento).
Kio vere okazas tie estas ekstreme
Gravas via uzanta Swift.
Tiu estas uzanta kio estas nomita laŭvola tipo.
>> Do tiu funkcio, Int (argumento), revenas ne nur entjero, sed revenas
kio nomiĝas laŭvola entjero.
Kaj tiel tio estas ia tipo aldone tipo.
Vi povas ordigi de imagi ŝin kiel ĝi estas revenante kiel pako.
Kaj kiam vi malfermos ke pako, ĝi ĉu
havas entjero, kiu estas la rezulto, aŭ ĝi havas absolute nenio en ĝi.
Kaj tio estas utila kiel eraro kontrolanta mekanismo, ĉar tiukaze
Ni povas eltrovi, estis tiu tipo konvertiĝo sukcesa?
Se ĝi estis, tiam ĝi estas fakte havos entjero ene.
Alie ĝi tuj havos iuj valoro kiun ni vokos Nil, kiu
Estas reprezentanto de neniu entjero ajn.
Estas vere reprezentanto de nenio.
>> Kaj tiel ĉi se konstruo permesas al ni unwrap ke pako,
ke nedeviga ligadon.
Kaj se ni kapablas unwrap ke paki kaj trovi entjero ene,
tiam kion ni diras tie estas ke ni estos tiam
permesi ke valoro enkadrigeblaj en tiu konstanta nomita grado.
Kaj tiu parto de la se aserto, la supro porcion de la se aserto
kuros, ĉar tio unwrap sukcesis.
>> Se ĝi nur do okazas ke tie estis eraro eble
en tiu eksplicita tipo konvertiĝo de ŝnuro al entjero, eble
ĝi estas la valoro ABC ekzemple.
Kaj tio estas fakte ne tuj konverti al entjero.
Tiam ĝi revenos nil, Kiu ne estas entjero.
Kaj ĉi se aserto bone tiam malsukcesas.
lernojaro ne ekzistas ĉar ĝi ne havas entjeran enhavo.
Kaj ĝi ruliĝos ĉi alia bloko anstataŭe.
Jes?
>> Publiko: nil estas N-mi-L?
DAN AMRMENDARIZ: nil estas N-mi-L, jes.
>> Do tiu estas eble unu el la malfacilaj aferoj pri Swift,
Precipe kiam vi estas en Junko sur iOS app
kaj vi vere provas fari iun disvolviĝon tie.
Ĝi tuj estos kriante ĉe vi pri laŭvola.
Ĝi estas iranta esti demandanta vin por demandosignojn kaj ekkrion punktoj.
Sed unufoje vi povas diveni fjordon se vi dediĉi iom da tempo por elŝeligi
kio okazas kun laŭvola tipoj, vi ŝparos vin multan kapdoloro
kiel vi provas skribi app en Swift.
>> Ĝi estas fakte tre potenca trajto.
Kaj vi nur devas prenu mian vorton por ĝi nun.
Sed ni vidos ĉi konstruo kaj iuj aliaj ŝatas
en kelkaj el la aliaj fontkodon ke ni montros al vi en nur iomete.
>> Ĉu estas komenca demandojn tie?
Do la grava takeaway estas ke laŭvola tipo estas speco de metatype.
Ĝi ĉu havas valoron, kaj se jes, tiam ĝi
eble havas tiun valoron asociita kun ĝi, aŭ ĝi havas nenian valoron whatsoever,
kaj estas reprezentita fare nil.
La resto de tio estas eble kiel atendite.
>> Do ni deklivirejo supre la malfacilaĵo plue.
Kaj ĉi tiu fojo, ni rigardu iuj aliaj datumtipoj ke reale ekzistas.
Unu el ili estas vortaroj, kiuj estas tre simila al Python vortaroj.
Ĝi estas iom simila al hash tablo en C. Ĝi estas esence mapado de ŝlosiloj
kie klavoj povas esti kordoj.
Kaj kiam vi rigardas tiujn klavojn, tiuj klavoj havas valoron.
Do ĝi ne estas sufiĉe tabelo, sed anstataŭe, pli proksime asociigita
por hash mapo aŭ hash tablo.
>> Ni vidu kiel tiu supozas labori antaŭ ni efektive
iru en la fontkodon mem.
Se mi nur kuras ĉi, nenio vere okazas.
Oni diras al mi, ke mi atendas iuj parametroj de la sekva tipo.
Do mi tuj havigos al ĝi iun problemon aro nomoj,
tiel pset0, eble mi atingis 100.
Kaj pset1, mi ricevis 5.
Kaj poste sur la ekzameno, mi faris vere bone kaj ricevis 30.
Kaj oops, mi batis spacon tie.
>> Kiam mi batis Enter, vi povas vidi ĝi realigas iun kalkulado.
Ĝi diras gradebook estas tri kvalifikojn, pset1, pset0, ekzameno.
Kaj la gradebook havas tiu specifa mezumo.
Do denove, ni laboras kun ĉi gradebook ideo,
sed ni tuj daŭrigi ripetanta kun la komplekseco de nia funkcio.
>> Do je la komenco, ni estas nur tuj krei funkcion kiu
respondecas por presi la uzado.
Kaj tie ĉi eliro funkcio kiu ĵus
perforte forlasi la apliko.
Tiu ne estas iu kiu vi uzos en iOS app.
Tiu estas nur, en tiu kazo, kun komandlinio argumento.
Next ni komencos movi al Xcode.
Sed tio estas specifaj por iu komando linio stilo programo en Swift.
>> Ni rigardu kelkajn el la interesaj aferoj tie.
Ni vidu, nur kelkaj interesajxoj mencii eble
estas ke en mia funkcio de presi la nombro de gradoj,
eble vi memoras ke mi havis tiun liston de items-- pset1, pset0 kaj ekzameno.
Vi povas fakte rapide kaj facile fari tion
prenante la gradebook, kiu estas vortaro kiu havas klavoj kaj valoroj.
Trovu ĉiujn la ŝlosilo estas tra la skalara klavoj metodo tie,
kaj uzu tiun joinWithSeparator, kiu tiam prenas ĉiujn la ŝlosilojn
ke ni tajpis in, pset1-- aŭ bedaŭras, pset0, pset1 kaj exam--
kaj concatenate ilin kune uzante komo kaj spaco
krei longa ŝnuro.
Ĉi aliĝi operacio estas nur fenomene utilaj en diversaj kontekstoj.
Kaj tiel estas ĉi joinWithSeparator.
>> Kaj tiu estas unu afero kiu estas ŝanĝiĝis de Swift 1 Swift 2.
Tie uzita esti Python style-- se vi estas
konanta Python-- Python stilo aliĝi metodo sur kordoj.
Sed tio ne plu estas la kazo en Swift 2.
Vi volas uzi tion se vi volas al concatenate tabelo da taskoj
kune kun kordo.
>> Do eble tiam en nia diskuto de mezumo antaŭ,
ĝi faras iom pli da senco por ni starigis la averaĝa funkcio
esti laŭvola duobla prefere ol nura eksplicita duoblo.
Ĉar ni havis tiun nekutima kondiĉo kie,
kio se gradebook reale havas neniun valoroj ene de ĝi?
Kio devus la duonan rondveturon?
>> Nu eble en C vi estus farinta ion
kiel disponigis sentinelo valoron, kiel 0.0, aŭ eble negativa nombro,
aŭ io simple reprezenti la fakton ke estis iu eraro kondiĉo
kaj vi eble ne vere havas la kapablon komputi ke mezumo.
Nu la beleco de specifi laŭvola tipo estus fari tion.
Kaj mi nun diri samajn vortojn, sed tiu praktiko ne uzas Laŭvolaj.
Sed ni vidos, ke en nur minutoj kie ni povas agordi mezumo
esti laŭvola datumtipo por ke se ĝi reale revenas iuj datumoj, tiam
ni revenos tiu datumo.
Alie ni revenos nulo, dirante ke tiu
havas nenian seriozan kalkuladon.
>> Ni movi sur al io alia.
Do el ĉi tie, ni estis rigardanta ĉiuj tiuj ekzemploj en la komandlinio.
Sed vere kion vi tuj esti pritraktas estas Xcode.
Kaj unu el la belajn vortojn pri Xcode estas, kaj specife en Swift,
estas ke ni havas tiun afero nomata ludejo.
Kaj Playground estas neniom iOS app.
Sed permesas eksperimenti kun Swift en tre facila maniero.
Vi povas tajpi ĉiuj de via kodo.
Ĝi estas bele sintakso reliefigis tie.
Kiam vi kreas novan dosieron, ĝi petos vi se vi deziras krei Playground.
Sed la bela afero pri la Playground estas al la dekstra de via fenestro,
faras ĝi vere montras vi eligo de via kodo.
Do se mi rulumu malsupren, ni povas vidi kion la eligo de diversaj linioj de kodo
fakte hazarde estas.
>> Do en ĉi tiu kazo, ni tuj ŝanĝi direktoj nur iomete
kaj paroli pri iu kiu estas vere Gravas tiu altnivela vojo
ke Swift operacias, kaj ĝi estas tiu ideo de fermoj.
Kaj vi probable vidis tiun iomete en JavaScript.
Por tiuj el vi kiuj estas en CS50, fermoj
estas tre populara, tre bona maniero fari altnivela aferojn en modernaj lingvoj.
Sed estas ankaŭ speco de malfacile envolver via kapo ĉirkaŭ unuafoje.
Do se vi rigardas ĉi unua fojo, ke estas OK.
Nur rigardu la fontkodon kaj vidi se vi povas kompreni ĝin hejme.
>> Do en ĉi tiu kazo, ni diras ke ni volas krei multajn eksponentoj
kun iu fiksa valoro.
Do en tiu kazo mi povas krei funkcion.
Mi tuj vokos ŝin potenco de 2 kies sola celo en la vivo
estas preni iujn enigo kaj duobla ĝin, kaj revenas tiu valoro.
Rimarku, ke ĉi tie mi estas akcepti unu tipo de datumoj.
Ĝi okazas al esti variablo nomata x.
Ĝi estas de tipo double.
Kaj mi tuj resendas Duobla tie.
Kaj mi simple tuj fari tre, sincere, belaj
naiva maniero de duobliganta tiun valoron.
Kaj mi montros al vi kial ĉi estas utilaj en nur dua.
>> Rimarku, ke ĉi tie ni havas ĉi gamo denove. por io en 1, skalara
dot dot, 2, kio signifas ke tiu buklo kuras dufoje.
Sed ĉi reprezentas loka variablo.
Ĝi signifas Mi ne vere tuj esti uzante tiu variablo ie
ene de tiu ciklo.
Mi volas nur tiu linio de kodo kuri dufoje,
sen bezoni scii la valoron de tiu gamo.
>> Do ĉi-kaze mi kurante rezulto fojojn x dufoje, kio esence
signifas ke mi akordi tiun valoron.
Kaj tio okazas al labori kiel ni atendus.
Potenco de 2, pasante valoro de 2.0 donas nin potenco de 4.
3.2 verkojn por 10,24.
>> Nun ni povas fari similan afero por potenco de 3.
Sed nun ŝanĝas nur la gamo.
Por loka variablo en 1 tra 3, multipliki 3 fojojn,
kaj fari la saman aferon.
>> Do tio ĉi povus senti iom artefaritaj.
Sed estas grava afero tie kiu
estas ke rigardante tiujn du funkcioj, ekzistas
nur unu afero, ke estas malsamaj, Kiu estas tiu valoro en la intervalo.
Ĉio alia pri tiuj du funkcioj, potenco de 3 kaj potenco de 2,
estas, fakte, identaj ĉar ili laboras en la sama maniero.
>> Do en ĉi tiu punkto, iom alarmilo devas foriri.
Espereble kion vi diras, vi scias, tiu sentas iomete
kiel duobligo de penado.
Eble tie estas vojo ke mi volus povos encapsular ĉio ĉi
kaj provizi funkcio aŭ krei funkcion kiu
faras precize kion mi volas sen bezonante tajpi ĝin eksplicite.
Kaj tiu estas kio la potenco de fermo nin permesas fari.
Do ni rigardu tiun.
Kaj mi pasigas kelkajn minutoj pri tio, ĉar tiu
estas sufiĉe grava por Swift.
Ni vidas ĉi tutan tempon.
Ni tuj difini funkcion.
Ĝi tuj estos nomita powerOf.
Ĝi tuj akcepti parametro nomita y el tipo Int.
Sed rigardu la reveno tipo.
La reveno tipo estas, krampoj, Duobla arrow Double.
Kio signifas ke tiu funkcio, tiu funkcio powerOf,
revenante funkcio.
Kiu akceptante Duobla kaj revenante Double.
Tiel ke povus soni speco de freneza, sed ni rulumu malsupren iomete
kaj rigardi por vidi kion okazas.
Ni estas ene de tiu funkcio powerOf.
Ni kreas novan funkcion nomata exponentiator,
sed ne gravas kia ĝi estas.
>> Rimarku ke tiu havas eniga valoro de x.
Kaj ĝi prenas en duobla kaj revenante Double.
Kaj estas la sama kodo ke ni vidis supre, krom ke la valoro de 2
aŭ la valoron de 3, tio supra ligis en tiu gamo,
estis anstataŭita per tiu valoro de y, kiu
estis la komenca parametro de nia powerOf funkcio.
Kaj je tiu punkto, ni reveni exponentiator.
Ni reveni la funkcio.
>> Estas ia kiel iom menso blovis.
Sed imagu kio okazas kiam mi nomas tiun funkcion powerOf
migru en ĝin iu valoro kiel 2.
Tio signifas ke Mi nun havas la valoron
2 por Y, kio signifas ke tiu valoro y en ĉi exponentiator funkcio
estos ke valoro 2.
Sed Mi revenos ĉi exponentiator funkcio.
>> Do rimarki kion Swift diras mi esti kreita en tiu kazo.
lasu kvadrato estas difino, estas funkcio kiu akceptas Duobla
kaj resendas Double.
Mi kreis funkcio ke kvadratoj ion
uzante tiun mekanismon tie.
Kaj vere kio okazas estas ke revenas ĉi funkcio
exponentiator, sed tiu valoro y estas envolvita ene de ĝi.
Kaj tial nun ĉiu tempo mi uzas tiun variablo aŭ ĉi konstanta nomata
kvadrata, ĝi estas tuj konduti kiel funkcio.
Kaj tial mi povas tiam nomita tiu variablo kiel mi nomas funkcio,
migru tien numeron, kiel en tiu kazo 3.
Kaj mi tiam akordis tiun valoron.
Do 3 kvadratoj estos tiam fariĝi 9, kiel ni povas vidi ĉi tie.
>> Vere freneza, sed tio nun permesas al mi la ŝanco
krei aliajn powerOf funkcioj.
Kiel mi povas diri, OK, bone nun mi volas krei novan funkcion, powerOf (3),
kaj stoki ke en konstanta nomita kubo.
Kaj nun kubo tuj esti aparta funkcio kiu tiam
preni iun valoron kiel enigo kaj kubo ke valoro kiel ni povas vidi en la funda linio
tie.
kubo de 2 estas tuj rezultigi 8.
>> Espereble bela neta stuff.
Vi neniam vidis tion antaŭe.
Mi kuraĝigas vin rigardi en fermoj kaj enketi ĉi iom pli.
Ĝi estas vere potenca aĵojn ni vidas multajn en JavaScript kaj kelkaj aliaj lingvoj.
Estas vere nemalhavebla al kompreni API tiel
ke ni atingos en nur dua.
Jes?
>> Spektantaro: Kiam vi faras powerOf (2), parentezo kaj tiam
alia parentezo, alia input-- vi esence anstataŭante la kvadrato.
DAN AMRMENDARIZ: Do rigardu je la lasta linio tie.
Estas fakte tute eblas fari tion ĉenante kiel vi sugestis.
Do powerOf (5) signifas ke ni tuj havi exponentiator de 5 ĝis tie.
Do tiu estas esence tuj estos la samon kiel 4 al la kvina potenco,
ĉar ni kreis exponentiating funkcii al la kvina potenco,
kaj ni pasante en ke funkcios la valoro 4.
Kaj ni preni tiun valoron ke ni atendas, 1024.
Publiko: Kaj ĝi ne estas nomo, Por ĝi faciligante
legi, la kvadrata ajn.
>> DAN AMRMENDARIZ: Dekstra, precize.
Do antaux Mi nur metis ĝin en konstanta tie tiel
ke faris ĝin facile uzi tiun nomon.
Jes?
>> Publiko: En tiu kunteksto powerOf, ĝi estas parto
de la programlingvo kontraste al la vojo vi
pensi powerOf en [inaudible]?
DAN AMRMENDARIZ: Do tiukaze powerOf
estas simple la nomo de la funkcio kiun mi difinis supren tie.
Do estas ne imanenta al la lingvo mem,
sed anstataŭe, estas nur funkcio kiu havas
tiu nomo ĉar mi fordonas tiu nomo.
Aliajn demandojn?
Bone.
>> Nun tiu estas granda.
Sed vi ne tuj vidi Multa fermaĵo funkcioj kiuj
estas kiel tiu kie vi difinas, ene de unu funkcio, alia funkcio.
Kaj vi povas fari ĝin.
Sed ĝi estas speco de ne vere necesa, ĉu ne?
Kiel kial mi difinas tiun funkcio nomita exponentiator
kaj tiam tuj revenas ĝi.
Kial mi ne simple tuj reveni ĉi funkcio?
>> Kaj fakte, tiu estas ĝuste la ideo malantaŭ koncepto nomata
anonimaj funkcioj, kie anonimaj funkcioj ne reale
havi nomon ĉar ili ne bezonas havi unu.
Kaj tial en ĉi tiu kazo, en 7B, ni povas trovi ĝuste tio.
Estas ĉio la saman kodon, faras precize la saman aferon,
sed nun ni ŝanĝis ĝin iomete tiom ke ĉi powerOf funkcio tuj
redonas funkcion.
Rimarku ke post reveno, ekzistas malfermita krispa krampo.
Ĝi atendis ĉi eniga Double.
Oni atendus, ke eligo Double.
Kaj tiam la en ŝlosilvorto disigas la kodo mem.
Do tiu estas anonima funkcio.
Ĝi fakte ne havas nomon, dum antaŭ ĝi nomiĝis exponentiator.
Sed kiel ni vidis, nur vere ne rilatas al exponentiator
eksteren de tiu funkcio.
Do ne gravas.
Do tiu anonima funkcio estas tielnomita ĉar ĝi estas sennoma,
sed ĝi estas ankoraŭ uzata en la kunteksto de tiu kodo.
>> La sekva paro ones mi certas tuj daŭrigi espereble
blovanta via menso iomete.
Ni povas simpligi tion eĉ pli.
Ĉar kiel estis ruze atentigis pli frue,
eble ni efektive scias, per Konkludante el tiu kodo, kio
la eligo de ĉi kodo tuj estos.
Kaj fakte, en tiu anonima funkcio, ni povas fakte indukti la tipoj de datumoj.
>> Do en ĉi tiu, ni ne plu devas eksplicite difini
la tipon de datumoj kiu estas estanta enigo kaj eligo de ĉi tiu funkcio
por paro de kialoj.
Unu estas ke ni difinis, supre ĉe la prototipo de la enmetanta funkcio,
kio tipo de datumoj tiu anonima funkcio devus enigo kaj eligo.
Kaj de la alia, ni povas konkludi el la kodo
cxi tie, ke ni akceptas eniga kiu estas de tipo Duobla
kaj revenante Double.
>> Rimarku, ke ĉi tie ni havas ne eksplicite difinis la nomoj de la argumentoj
ke tiu funkcio estas akceptanta.
Kaj tiel ni vidas ni povas rilati al tiuj parametroj uzante $ 0, $ 1,
tiel plu kaj tiel antaŭen, depende la nombro de tiu parametro uzita
en tiu funkcio.
>> Tiu estas iu kiu vi iras vidi tre estas ĉi malfermita krispa krampo
difino sekvita per $ 0, kaj tiam iuj operacio,
kaj tiam fermita krispa krampo.
Ke estas anonima funkcio kiu elfaras tiun operacion.
Ĝi havas ĉi parametro kie ĝi estas tipo estas deduktebla.
Tiu unua parametro estas $ 0.
Kaj iu operacio estas okazas en tiu $ 0.
>> Publiko: Do ​​la dolaro signo signifas parametro esence,
kaj 0 signifas la unua?
DAN Armendáriz: Tio ĝustas.
Do la dolaro signo esence signifas parametro, kaj 0 signifas la unua unu.
Sed ĝi funkcias specife en tiu kazo, kie mi ne nomis
la argumentoj en mia anonima funkcio.
>> Spektantaro: Ĉu Perl aŭ io havas ĉi dolaro signo, dolaro 0 tien?
DAN Armendáriz: Ĉu kiu, mi bedaŭras?
Spektantaro: Ĉu Perl havas ĉi dolaro 0, dolaro 1--
DAN Armendáriz: Mi ne estas tro familiara kun Perl,
sed PHP kio difinas variabloj bazita sur dolaro signoj.
Kaj eble estos iuj lingvoj kiuj havas trajtojn kiel tiu.
Fakte, Swift depruntas a multaj trajtoj kiel ĉi
el multaj aliaj lingvoj.
Ni vidas aludojn de Python en ĝi.
Tiu difino de tipo ŝajnas veni de OCaml.
Kaj ni havas nur tutan faskon da ŝtofo el multaj malsamaj lingvoj.
Tio estas unu el la agrablaj aferojn pri Swift
estas ke ĝi prenas multan el la plej bonaj ideoj de aro da lingvoj
kaj shoehorns ilin ĉiujn kune en unu ekstra lingvo.
Fakte, se vi permesas al mi daŭrigi blovanta via menso,
tiel ni estis farante ĉiuj ĉi.
Ni povas eble simpligi ĉi iom pecon post rimarki ke, kompreneble,
Swift havas exponentiating funkcio enkonstruita.
Se mi importi Darwin, kiu estas nur la biblioteko kiu
prezentas tiun funkcion nomita pow, nun Mi povas simpligi mian povon de funkcio
esti la sekva.
Ĝi tuj estos revenanta tiu anonima funkcio.
>> Sed vidu kiom simpla tio estas nun.
Jen anonima funkcio kiu estas akcepti iun tipon de datumoj,
kaj ĝi tuj estos unu argumento specife,
referenceita ĉe $ 0 kiu estas de tipo double.
Ĝi tuj revenos tipo double.
Sed la reveno deklaro nun estas implicita.
>> Kaj estas precize tiu stilo kiu Estas tre, tre disvastiĝinta en Swift,
tuta loko.
Ni tuj vidos ĉi tutan tempon en Swift.
Do mi montrante ĉion ĉi al Vi pro ĉi sintakso.
Tiu estas tre komuna vidi, kion signifas tio
estas anonima funkcio ke estas elfaranta
iuj operacio pri tiuj argumentoj.
Kaj tie estas implica reveno.
Do ĝi estas absolute la sama afero por ni diri ĉi, ĉi tie.
>> Pro tiu krispa krampo estas funkcio,
ni estas elfari tiun operacion sur la unua argumento.
Ni tuj revenu tio.
Sed tiu ekstera reveno estas reveninte tiu tuta funkcio,
ke tutaj anonima funkcio ke ni ĵus kreita.
Aliajn demandojn?
Bone, mi ne scias ĉu Vi uloj estas pretaj por tio,
sed ni povas iri eĉ pli freneza kun Swift.
Vi preta?
OK, ĉi tiu estas granda.
>> Nun ni efektive havas la kapablon al, en Swift, pro kiel modulaj
kaj kiel protokolo bazita ĝi estas, por difini nian propran freaking operatoroj.
Kiel en ĉi tiu kazo, ni ne havis operatoro por exponentiation-- bone,
por elfaranta potencoj de io.
Sed mi povas, en Swift, difini nova operatoro kiu faras ĝuste tion.
Do en tiu kazo ekzistas faskon de sintakso tie.
Kaj mi permesos ke vi rigardu ĝin hejme kiam vi rigardas tiun.
Sed ni devas difini ĉi infikso operatoro, **, kiu tiam permesus nin,
difinante kion tio funkcio ** reale
does, akcepti maldekstra mano flanko kaj dekstra flanko,
kaj tiam reveni la eksponento de tiu maldekstra flanko al la dekstra flanko.
>> Kaj do nun subite mi kreis novan numeratoro.
Do 2 ** 3 signifas 2 al la tria potenco.
[Menso blovas SOUND] Tiu de mem devus fari vin esti kiel,
OK, ŝraŭbo C. Mi tuj Swift tutan vojon.
Tiu estas bonega.
Tiu estas sufiĉe mirinda.
>> Kvankam ĉi tiu estas granda ekzemplo.
Sed mi havas neniam iam ekster de tiu ekzemplo fakte
difinita mia propra operatoro.
Sed ankoraŭ, ĝi montras Multa la potenco de Swift
kaj kial tio fakte estas vere tre cool.
OK, jes?
Publiko: Se vi estas difini vian propran operatoro,
Kiel vi scias ke vi ne hazarde klopodi krei telefoniston tio
en ie en C, kiel kaŝita ie en Swift,
kiel obskura kiu vi eble ne vidis antaŭe.
>> DAN Armendáriz: Do se vi provas difini vian propran operatoroj,
ekzistas la risko de difinanta unu super ekzistantan operatoro.
Kiu iras al nivelon de detalo kiu Mi ne kredas ke ni havas tempon por pasantoj.
Sed tio estas risko.
Kaj kiu estas fakte la tre kialo kial Mi ne uzis la tekstkursoran simbolo, kiun
kiam ni tajpas el potenco, ni kutime uzi 4 eta ĉapelo 5 aŭ ion
tiel, nur kiam ni estas Gchatting amikoj aŭ kio ajn.
Sed en tiu kazo, ke efektive estus kaŭzinta kolizion.
Kaj tial mi evitis gxin nur cxar Mi hazarde scias tiukaze
ke tio farus ke kolizio.
>> Bone.
Nun bedaŭrinde, por la lastaj sep minutoj,
Mi devas teni blovado viaj mensoj iomete.
Do permesu min montri vin iuj aliaj aĵoj ankaŭ.
>> Ni montris al vi tiun ideon de havanta tiuj anonimaj funkcioj,
tiuj fermoj kiuj permesas vin ia pasi funkcioj ĉirkaŭ.
Vi povas reveni ilin.
Vi povas manipuli ilin.
Vi povas fari ĉiajn freneza stuff.
>> Sed unu alia afero ke hazarde estas utila
estas la kapablo, kontraste por reveni tiuj funkcioj
en funkcio, por pasi funkcio kiel parametron al alia funkcio.
Vi eblas esti pensanta bone kial sur la Tero mi volas fari ion tian?
>> Nu, ni diru ke mi volas preni ĉi operatoro ke mi
laboris tiel forte por krei kaj apliki ĝin faskon de malsamaj nombroj
en tabelo.
Do en tiu kazo mi havas tabelo de integers-- 1, 4, 7, 2, 5, 10, 56.
Kaj mi volas duobligi ĉiujn.
La maniero kiun ni volus tipe fari estas simple skribi
simplan por buklo ke ripetas la tuta militistaro
kaj elfari ian kvadrataj operacio super ili,
inputting tiuj novaj valoroj en novan variablo, aŭ prefere, nova tabelo tie.
Kaj la valoro de la eligo de rezulto estas tiam ĉiuj tiuj aroj,
aŭ prefere ĉiu el tiuj elementoj nun kvadrato.
>> Kaj ni povus fari la saman afero por cubing ĝi,
sed iom alarmo sonorilo devus esti pafante
dirante ke eble tie estas iel ke ni farus
povos simpligi ĉi iom.
Kaj fakte ekzistas.
Kio se ni povus krei funkcion kiu ebligas
akcepti, kiel rabobesto, funkcio?
Do en ĉi tiu kazo, preni rigardi tiujn argumentojn.
Ni tuj akcepti listo de duobloj.
Kaj tiam ni tuj akcepti funkcio
en variablo nomata f kiu tuj preni Duobla kaj resendas Double.
Kaj la tuta eligo de tiu tuta funkcio
nomata Mapper tuj reveni tabelo nomita duobla.
>> Kio ĉi tiam permesas min fari estas persisti super tiu listo
kaj fari la saman aferon, sed nun apliku tiun funkcion al ĉiu
de la individuaj valoroj en tiu listo.
Do mi ne vere scias kion f.
Ne gravas al mi.
Sed tiel longe kiel ĝi prenas en duobla, elfaras iun operacion sur ĝi,
kaj tiam resendas Duobla, mi estus tiam
povis mapi domadministranto trans ĉiu unuopa elemento en la listo.
>> Kaj ĉi tiu tipo de programado estas nomata alta ordo funkcioj,
kie ni pasante funkcioj ĉirkaŭe kiel parametroj
kaj fari aferojn kun funkcioj.
Ĝi estas speco de kiel preni ĉiujn tiujn ideoj kiujn ni lernis en CS50
kaj prenante ilin ia de la sekva nivelo.
Kaj tiu estas ĉiu CS51 stilo stuff.
Kaj tial ni iros en profundon pli en klasoj tiel.
>> Sed tio estas ankaŭ grava tie ĉar ni
vidi multajn funkciojn kiuj estas uzitaj en Swift
kiu esence faras tiu, kie ni havas
iuj nombroj, iuj tabelo de nombroj.
Ni tuj preterpasonta tabelo en nian Mapper.
Kaj ni ankaŭ tuj pasi iun funkcion, kiu
ni jam difinita supren tie.
Ĝi okazas esti kvadrataj.
Kaj ni tuj poste akordis ĉiuj tiuj nombroj
kaj stoki tio sur ĉi tiu rezulto tie.
>> Do tiu kazo ni difinis niajn propra funkcio nomita Mapper.
Sed precize tiu afero estas, fakte, konstruita en Swift.
Estas vario de funkcioj nomata mapo.
Ekzistas mapo funkcio, Tie estas redukti funkcio,
kaj jen mia filtrilo funkcio, kiu esence apliki funkcioj
al ĉiu unuopa elemento en listo modifi ilin iel.
>> Publiko: Do ​​ĉar vi estas transformante la datumoj en alian formaton
tra function--
DAN Armendáriz: Dekstra.
Jes, do la funkcio ke ni akceptas
transformas la datumojn iel.
En tiu kazo, ni estis aŭ akordi ĝin, aŭ ni cubing ĝi,
aŭ vere, oni povis elfari neniu operacio sur gxin.
>> Sed lasu min montri vin, kia tiu ĉi tuj serĉos en praktiko.
Kaj denove, mi kuras iom da tempo. do mi ne
tuj povos iri super ĉiuj de la fontkodo tie detale.
Sed mi kuraĝigas vin fari tion.
Ni afiŝi ĝin tiel frue kiel ebla post tiu diskuto.
>> Sed se vi prenas rigardi ĉi, supozas ke ni havas liston de nombroj,
tabelo de nombroj en ĉi variablo nomis nombroj.
Tiam ni volas realigi ĉi filtrilo operacio sur tiuj nombroj.
Do filtrilo estas pli alta Por funkcio kiu
akceptas tabelo kaj ankaŭ funkcio.
Kaj de ĉiu elemento en tiu tabelo, ĝi elfaras tiun funkcion.
>> Se tiu funkcio redonas vera, ĝi gardas tiun eron.
Se tiu funkcio redonas malvera, ĝi ĵetas for la eron.
Kaj tiam ĝi resendas liston kiu tiam farita supren ĉiuj
de tiuj eroj kiuj estis filtritaj.
>> Do en alia vortoj, tio estas la sama ideo, la gradebook.
Ni havu varion de gradoj en tiu valoro nomis nombroj.
Povus esti 100, kaj 70, kaj 40, tiel plu kaj tiel antaŭen.
Kio ĉi filtrilo faras estas avizo ke tio estas kiu sintaksa sukero
por anonima funkcio.
Jen anonima funkcio dirante ke la parametro ke mi akcepti
tuj estos, se estas pli granda ol 70,
tiam tiu revenos vera, signifante ke ke artikolo restos en tiu filtrilo.
Do ni estu iomete pli konkretan pri tio.
Se mi havas ĉi tabelo de nombroj kaj ĝi konsistas de 100, 70, kaj 40,
Mi plenumos tiun filtrilon operacion sur ĉiu de tiuj.
Por ke unua estas tiu valoro de 100.
100 pli granda ol aŭ egala 70 Estas vero, ke
signifas ke 100 estas konservita en tiun novan kopion de tiu tabelo.
70 ankaŭ pasas.
Sed 40 ne.
Do kio estas redonita en passingCount estas la tabelo de elementoj 100 kaj 70--
100, komo, 70.
Tiuj estis la nuraj du erojn kiuj estis konservitaj.
Kaj tiel la kialo mi rapide trapasis multe de tiuj speco de alta ordo
aferoj estas ĉar tio ĉi estas ke komuna afero ke vi vidos en Swift bela
ofte, estas elfaranta kelkaj operacio uzante tiu anonima funkcio sintakso.
>> Tie estas iu cool stuff.
Ŝaltiloj estas vere potenca en Swift, Mi volas diri nur kiel freneza, freneza potenca.
Vi povas uzi ŝaltilon, kaj vi povas efektive apliki ilin
al rangoj, kiu estas speco de freneza, kaj fari imago da tio.
>> Sed en la lastaj kelkaj minutoj, Mi volas salti antaŭen tute malproksima
kaj montri al vi specifa ekzemplo de kiel ni povas krei en iOS app uzanta Swift.
Do kiam vi faras tiu, vi devos preni
rigardo at-- sur Apple dokumentado, ili
havas multajn vere bonajn lernilojn por krei vian unuan aplikon.
Kaj mi kuraĝigas vin fari ke ĉar ili prenas vin
tra ĉiuj paŝoj de kio ĝuste al alklaku krei IOS apliko.
>> Sed ĉi tie ni havas ĉi IOS app.
Kaj ĝi estas bela simpla app vere.
Se mi kuras ĉi, mi povas montri vi kio ĝi aspektas.
Ĉiuj ĝi esence faras estas ĝi tiras el interreto JSON dosieron
ke mi stokitaj en servanto.
Kaj ke JSON dosieron difinas bildoj kiuj permesas
mi tiam ciklo tra, sur mia app, bildoj de mia retservilo.
>> Do mi havas tie getNextImage.
Ĝi ŝarĝas bildon el interreto, kaj montras ĝin sur la ekrano.
>> Do ĝi estas bela simpla.
Sed la celo tie estas montri vi kiom ni povas kombini aferojn
de la lasta malmultaj semajnoj de CS50 en fakta IOS apliko.
En aliaj vortoj, eble unu el la aferoj vi deziras fari
Estas havi IOS apliko kiu povas tiri datumoj el interreto
kaj montri al la uzanto iu informo.
Tio estas tute la punkto de tiu fontkodo tie.
>> Do ekzistas multe diri pri kiel fari fakta IOS disvolviĝo.
Ekzistas multe de freneza sintakso ke ni ne vidis sufiĉe ankoraŭ
kiel klaso, kio klaso reale estas.
Ni povas grandparte ignoras ke provizore.
>> Sed rimarki ke ni enhavis ene tiu vario de aferoj
ke ni jam vidis kiel funkcioj kiuj havas specifajn nomojn.
Kiam ni donas tiujn Funkcioj La korekta nomoj
kiuj atendas de iOS, fakte ĉi sentas iom magia.
Sed kiam vi kreas IOS apliko, tie
Estas specifaj funkciaj nomoj kiujn portas sur la telefono mem
kiel la aplikaĵo prepariĝas provi krei la procezo kiu reale
kuras via kandidatiĝo.
Do denove, ekzistas multaj aferoj kiujn mi havas forgliti super tie por ke ni
paroli pri tiu specife.
Sed mi kuraĝigas vin rigardi eble la alia iOS seminario, sed ankaŭ kelkaj
de la lernilojn rete farantojn multe pli bone priskribi
la specifa informo.
>> Sed ni povas vidi paron de aĵoj kiuj estas interesaj el la kodo tie.
Rimarku ke ni havas se deklaroj.
Parenteze, unu grava afero pri se deklaroj
estas ke la krampoj ĉirkaŭ la Bulea esprimo estas laŭvolaj.
Sed la krispa krampoj ne estas opciaj, negrave kiom malmultaj aŭ multaj linioj de kodo
vi havas en se aserto.
Vi ne povas havi se deklaroj sen buklaj krampoj en Swift.
>> Kaj tio estas, nu, ia stulta.
Sed estas historiaj kialoj por tio.
Ĝi estas supozita por savi vin de vi mem.
Kiel ĉi ekzemple, vi ne povas forigi la krispa krampoj ĉirkaŭ tiu
se aserto.
Tiuj estas fakte postulata.
Do mi kuraĝigas vin rigardu ĉi.
Sed estas pli konstrui ke mi volas
montri vin pri Swift ke Estas nova Swift 2.0 komparite
al malnovaj versioj de Swift, kio estas la jena.
Vidu kien mi metis ĝin ĉi tie?
>> Do en ĉi tiu funkcio nomita fetchJSON, tiu funkcio
estas respondeca tiranta ke JSON file de URL, kiu ĝuste tiel okazas
ruli en mia CS50 IDE.
Mi ĵus komencis Apache, metis mia JSON dosiero tie,
kaj mi plu povos tiam tiri ke datumoj de la interreto uzante
tiu funkcio kaj ĉi URL, kiu estas provizita per la telefono.
Ĝi estas provizita per biblioteko kiu uzas kiam
vi faras iuj IOS app disvolviĝo.
>> Rimarku tie ke ekzistas tiu nekutima sintaksa konstrukcio nomita korpogardistoj.
Kaj vere ĉio estas en Swift estas maniero de kontroli
ke iuj aferoj havas estis renkontita antaŭ vi
procedi kun la resto de la funkcio.
Do mi povis havi, uzanta ĉi laŭvola tipo,
Mi povus esti trovita la URL per kurante ĉi NSURL funkcio
kaj stokante ke en URL konstanta, kaj tiam kontrolanta
ĉu URL estis nula, ĉar tuj revenos laŭvola tipo.
Kaj se ĝi estis nula, tiam mi volus elprinti eraron kaj tiam revenu.
>> Sed anstataŭe, kion korpogardistoj permesas nin fari estas ke precize tion,
sed certigi ke oni fakte la kazo ke url
estis konvene metita fare NSURL.
Kaj se ĝi estas, tiam saltas super tio, kaj ĝi
permesos al procedi kun url esti konvene difinita.
Sed se ĝi estas la kazo, ke url estas ne konvene difinita,
se tiu funkcio redonas eraron aŭ alian neatendita
fakte okazas, ĉi korpogardistoj konstrukcio nin permesas tiam eligo ke eraro
kaj revenu tuj.
Jes?
>> Publiko: Do ​​ĝi estas speco de kiel se tiam alia?
DAN Armendáriz: Estas ia kiel se tiam alian, jes,
krom ke ĉi url estas tiam difinita por ĉio sube ĉi.
Se pasas ĉi kuristoj tiam efektive estos plenaj datumoj
kaj uzebla en la ceteraj fontkodon en via funkcio.
Do mi suspektas ke vi tuj komencas vidi ĉi korpogardistoj ankaŭ.
Kaj memoras ke.
>> Do simple rigardante kelkaj aliaj aferojn, ĉi tie ĉi estas kio,
ĉu vi opinias, bazita sur kio ni parolis pri antaŭe?
>> Publiko: Pripensu kuros en la listo?
>> DAN Armendáriz: Do jen proksime.
Tiu estas funkcio kiu ni difinanta.
Kaj ni inputting domadministranto kiel argumento por ĉi tiu funkcio ĉi tie.
>> Spektantaro: [inaudible] se ne nulaj.
Do estas en la listo, ĉu ne?
>> DAN Armendáriz: Se eraro estas ne nulaj, por ke is-- do mi devas rulumi.
Nu, ni vidu, mi ne povas vere rulumu dekstren tie.
eraro estas argumento kiu estante pasis al tiu anonima funkcio.
Jen anonima funkcio.
Ĝi ne havas nomon.
Sed ni devas akcepti tiujn tri argumentoj, datumoj, respondo, kaj eraro.
Kaj tuj revenos malplenon, tial ĝi ne tuj reveni nenion.
Kaj tiu estas la enhavo de tiu funkcio.
Kaj tiam ni havas aliron ene ol funkcion al ĉiu el tiuj argumentoj.
>> Do estas ventego tour de la lingvo.
Sed mi esperas kun ĉi, espereble kiel vi prenas
Rigardu kelkajn el la lernilojn specifaj al IOS disvolviĝo kun Swift,
speciale se vi iros al Apple desarrollador retejo page--
ili havas multajn vere bonajn lernilojn akiri vin komencis.
Sed espereble nur tiun horo de paroli pri la sintakso mem donis
vin sufiĉe por starti kun tiu.
>> Ni afiŝos ĉiujn ĉi fonto kodo en la seminario paĝaro
kiel eble plej baldaŭ, kaj ankaŭ la diapozitivojn tiel vi havos referenco por ĉiuj tiuj.
Sed bona fortuno kun via projektoj.
Kaj dankon ĉiuj tre multe por venado.
>> [Aplaŭdo]