>> [REPRODUCCIÓ DE MÚSICA]
>> DONEN AMRMENDARIZ: Tothom, la benvinguda al seminari CS50,
iOS desenvolupament d'aplicacions amb Swift.
Estic Dan Armendariz, i jo sóc un preceptor de la informàtica aquí a Harvard.
>> I la propera hora serà un viatge llampec de tantes coses
sobre aquest tema com podem encaixar.
Vaig a publicar tot el codi font que es poden veure en línia avui.
Potser no som capaços de realment anar per sobre de tot
que sóc que sóc que li mostra en aquesta hora.
Però almenys espero que a través de els comentaris del codi font,
vostè serà capaç de tractar d'esbrinar el que exactament que està passant per aquestes coses
que ni bé arribem a.
>> En general, l'estructura de la xerrada d'avui serà el següent.
Anem a començar a terme fent una mica bàsic la sintaxi de la llengua Swift,
entrar en alguns dels més avançats la sintaxi de la llengua Swift.
A causa de que l'idioma és molt modern i
té un munt d'alt nivell característiques, les coses que no tenim
vist en C al llarg de CS50, o fins i tot alguns dels altres idiomes
que hem començat utilitzant en CS50 com PHP,
així que vaig a haver de tractar de introduir també alguns temes que
estan relacionats amb llenguatges d'alt nivell que vostè no pot veure a fons en CS50,
però es veurà en endavant classes d'informàtica.
Així que serà un atapeïda hores.
I no dubteu a deixar-me saber si vostè té alguna pregunta.
Així que si vostè està interessat en fer el desenvolupament
amb Swift, o realment qualsevol desenvolupament d'aplicacions iOS,
hi ha un parell de requisits.
En primer lloc, vostè ha d'estar fent servir un Mac, corrent en els exemples
que utilitzarem avui en dia, una relativament nova versió d'OS
X. En aquest cas, m'estic quedant X 10.5.
Pot estar executant 10.11 si vols.
Però tot el que vas a veure és que implica Xcode 7 i versions posteriors,
que té la versió més recent de Swift, que és Swift 2.0.
Això és realment una bonica distinció important.
Una gran quantitat de la sintaxi té canviat molt significativament
en alguns casos de Swift 1.0, que va ser llançat l'any passat,
a Swift 2.0, que acaba de sortir aquesta tardor.
Així que anem a mostrar Swift 2.0.
Moltes de les coses que vostè busca en línia
quan vostè està tractant d'aconseguir addicional informació sobre una varietat de coses,
és possible que desitgi de forma explícita buscar Swift 2
en comptes de vella Swift fer Assegureu-vos que vostè obtingui la sintaxi correcta.
>> De fet, això és cert en general.
Hi ha una quantitat ràpida del desenvolupament succeint en l'idioma Swift
des que Apple va llançar, crec el, que ha estat una mica més d'un any
ara.
I les coses han canviat dramàticament en aquest moment.
I el que no es va frustrar si, quan vostè està mirant al seu voltant
per temes Swift o com dur a terme alguna cosa usant un codi d'exemple
o alguna cosa que no ho fa realment treballar en Swift 2.0.
Assegureu-vos que vostè està buscant específicament per a aquesta versió
per intentar minimitzar els efectes de diferents versions i aquest tipus de coses.
>> Vaig a tractar d'assenyalar només algunes coses que són diferents a les versions anteriors.
Però és una cosa a tenir en compte.
Això és probablement serà un dels majors mals de cap
que va tenir amb Swift és trobar exemple de codi que és més antic, encara que només
per uns pocs mesos, tractant d'usar en el seu projecte més modern.
I simplement no funciona.
Vostè està rebent errors del compilador, la sintaxi errors, tot tipus de coses boges.
Així que ser pacient amb això, i ho faràs amb sort
tenir una experiència bastant agradable amb total Swift.
>> Ara pots fer-ho realitat join-- i espero que en realitat encara tenim present aquest any--
CS 50 aplicació d'Apple equip de desenvolupament, que
li permetrà instal·lar qualsevol aplicació el que crea en els seus dispositius iOS.
Així que mireu aquest URL si vostè està interessat en fer això.
>> Així que només un parell de coses sobre si Swift.
Es tracta d'un llenguatge compilat.
Però veuràs que alguns de les característiques que utilitzem
Deixeu que es pot utilitzar també en una mica interpretar com una manera també.
>> És prestat Una gran quantitat de la sintaxi de C. Es basa i escrit en C.
I així veurem que hi ha un munt de menjar per emportar
del seu coneixement existent de C que podem port a Swift.
>> Però hi ha coses que fan que sigui molt diferent de C.
Està molt inflexible de tipus.
No hi ha gestió de memòria automàtica.
No hauràs de utilitzar malloc o en qualsevol lloc lliure.
Està dissenyat per a la Generalitat.
En altres paraules, vostè pot utilitzar-lo en tot tipus de contextos, des d'Apple Seguir
per a iPhone tot el camí fins OS X, i fins i tot alguns servidors, fins i tot algunes seqüències d'ordres.
Però anem a veure que el suport per scripting
no ha arribat encara com ho és en altres idiomes.
Així que el més probable podràs fer servir aquesta exclusivament per al desenvolupament
en el seu Mac o un iPhone.
>> I té un munt de característiques modernes.
I moltes d'aquestes coses són coses que tractarem de fer front avui en dia,
sinó també els nostres temes que, francament, podem dedicar cursos sencers.
De fet, CS 51, que és va oferir el proper semestre,
se centra molt en aquests temes que es descriuen a continuació.
Així que vostè pot passar tot un semestre entendre aquestes coses.
Però anem a tractar aconseguir a través d'ells
almenys prou perquè vostè pot entendre el que és
passant quan es mira en un programa de Swift
i ser capaç d'obrir-se pas a través d'ell per al projecte final.
>> Ara una de les millors maneres que vostè pot obtenir informació addicional sobre aquest
és francament només a través d'Apple proporcionat documentació de Swift.
Hi ha una gran quantitat d'APIs que estan disponibles.
I aquesta és una bona base d'operacions per a vostè buscar, coses específiques que vostè
vull fer amb una API que implica iOS.
Si voleu utilitzar la càmera durant exemple, pot començar a buscar aquí,
i també utilitzar Google i Pila Desbordament com ho faria normalment.
>> Teniu alguna pregunta respecte aquest abans de saltar a la dreta dins?
Tot bé.
Anem a passar.
>> Així que primer, tinc un nombre d'arxius d'exemple.
I jo vaig a intentar fer un pas a través d'ells amb relativa rapidesa.
Aquest és l'arxiu Hello World per Swift.
És molt simple.
No hi ha manera més comentaris que hi ha codi real.
Observeu el codi real està en la part inferior en la línia 14.
Diu impressió.
I llavors és una crida a la funció.
Estem passant en ella una string anomenat Hola CS50.
Recordeu que no hi ha punt i coma.
Recordeu que no hi ha int main.
No hi ha cap dels crosta que teníem amb C.
Quan estem utilitzant Swift d'aquesta manera, que només s'escriu en un arxiu de text
i s'emmagatzema a l'ordinador, a continuació, Puc compilar i executar-lo.
>> Noteu que aquí estic no fer servir l'IDE CS50.
Això suposa que sóc córrer i que estic en OS X,
i que he Xcode ja instal·lat en aquesta màquina perquè aquest
per realment funció.
Però això és només un arxiu de text normal que llavors podem recopilar i editar.
Així que anem a veure com funciona en realitat.
I si vull compilar?
1.Swift swiftc.
Després d'un moment o dos, veurà que tenim ara
compilat aquesta en un arxiu anomenat 1.
I ara hem imprès nostra CS50, la nostra aplicació Hello World lloc.
>> Note altra cosa com així és que, per defecte,
que no teníem a l'entrada a / per imprimir una nova línia.
Per defecte, la funció d'impressió en Swift s'imprimirà una nova línia per a vostè.
Pot passar un opcional addicional paràmetre per dir-li que no ho fes.
Però Google per obtenir més informació al respecte.
Per defecte, es farà la línia d'impressió.
>> Molt bé, així que anem a passar després a algunes altres coses.
Llavors, com podem realment definir variables?
Podem fer això és l'ús de un de dos mètodes.
I el que vull dir-te sobre primera és aquesta definició let.
I això és important perquè efectivament
el que estem fent és definir una constant.
Crearem una variable, o més aviat una crida nom de constant,
proporcionar a ella alguns data-- en aquest cas, la cadena de Dan.
Però a través d'aquest let paraula clau, estem dient
que aquest variable-- o nou constant-- anomenada
nom mai va ser canviat.
Serà immutable al llarg la durada d'aquest programa
o en tot el durada del context
que aquesta variable està disponible.
>> Això és molt important que quan vostè ha algunes dades que no és
canviarà en el seu programa, i veuràs una varietat d'exemples
de quan volem usar deixar que contra l'altra sintaxi,
és important que utilitzi deixes sempre que sigui possible, perquè aquesta notifica
l'idioma que és no canviarà,
i que en realitat pot dur a terme un munt d'optimitzacions
per millorar la velocitat i la la seguretat del seu programa.
I per la seguretat, no em refereixo a deixar accident amb errors bojos
perquè siguem acostumat a veure en C.
>> Llavors podem utilitzar la interpolació cadena per encapsular aquesta dins d'una cadena.
Així que podem veure en aquest línia d'impressió, imprimir hola,
i després utilitzant barres invertides parens obertes, i després el nom de la meva variable
en aquest cas constant, tancar els parèntesis.
Estic bàsicament després posar la continguts d'aquesta variable anomenada nom
interior de la cadena i després imprimir el resultat allà.
>> Hi ha un altre canvi en aquest arxiu que és el que tinc, al capdamunt,
posar en una línia de muntatge, que bàsicament només especifica
que vull utilitzar el Intèrpret Swift, que
vol dir que ja no he de compilar aquest programa en particular.
Jo només puc córrer com si fos el seu propi guió.
Però això és, en aquest cas, darrere de les escenes estan recopilant i després
s'executa.
És simplement invisibles per a nosaltres.
>> Molt bé, així que seguirem endavant.
Així que hi ha una mica d'engany que acaba de succeir abans.
Et vaig mostrar que jo podria definir una constant.
I podria proporcionar algunes dades per fer-ho.
Però en aquest cas, noto que no ho vaig fer realitat especificar el tipus de dades
que és.
I això és degut a que la compilador, Swift pot
inferir el tipus de dades només es basa en les dades que he posat en ell.
Perquè sap que mitjançant l'avaluació d'aquesta variable d'aquí, aquest dret les dades
aquí, se sap que és una cadena.
I pel que aquest nom de constant, per tant és serà una cadena també.
>> Però també podem ser explícita sobre el tipus que és
utilitzarem per constants o variables
mitjançant l'ús d'aquesta sintaxi instead-- deixi Cadena nom de còlon és igual
Donen, que en aquest cas vol dir que estem va definir una crida nom de constant.
Va a ser de tipus String.
I el valor serà Dan.
Ara l'altra de manera que podem crear variables--
i aquestes són variables mutables, que vol dir que som, de fet, anem
canviar el seu contingut en algun moment en la durada del context
que aquesta variable es defined-- ens utilitzeu el terme clau var en lloc de deixar.
Però, de nou, per defecte, llevat que sàpiga que necessita per manipular aquestes dades,
tractar d'usar per permetre que millores en el rendiment.
>> En aquest cas, pot llavors especificar el tipus de dades
que esperem estar dins de aquesta nova variable anomenada etiqueta.
Serà una cadena.
I anem a continuació, concatenar dues cordes juntes, la cadena hola,
i la cadena representada per la variables, o més aviat el nom de constant.
>> Així que això és bo perquè aquest és un tant PHP com en la que estem
tenen molt fàcil concatenació de cadenes.
Nosaltres no tenim que automàticament utilitzar qualsevol tipus de gestió de memòria
per augmentar la mida i fer qualsevol tipus de coses divertides allà.
Això funciona com ens hagués fet esperar.
>> Molt bé, alguna pregunta sobre això?
>> Ara l'altra raó per la qual hem de vostè té la capacitat
per ser capaç de definir el tipus de variables de dades són
és perquè de vegades no ho fem voleu inicialitzar variables
amb algunes dades al punt de definició.
Així que en aquest cas, diguem que vull començar a introduir
alguns graus en un llibre de qualificacions.
Bé, jo sé que un dels variables que vull ser
serà un grau mutable.
I també sabem que nosaltres vull que sigui un nombre sencer.
Però potser encara no tenir aquesta qualitat disponible.
>> En Swift, vostè ha de definir el tipus de dades
que s'associa amb una variable o una decepció constant
abans que vostè realment pot utilitzar aquesta variable.
A causa de que està fortament tipat, vostè ha d'associar un tipus
amb aquestes variables.
>> Així que en aquest cas, si jo no tinc adequadament inicialitzat el primer amb algun valor,
llavors he de dir-li el que Swift Espero que el tipus de dades que sigui.
I seguirà sent aquest mateix tipus de dades
en tota la història d'aquest programa.
>> Ara vostè pot tenir la temptació tan aviat com sigui He creat aquesta variable grau
i sempre que una sencer de 100, ara si
Intenta-ho de nou per concatenar una cadena amb aquest sencer,
podria tenir la temptació d'usar encara que l'operador de concatenació de cadenes
com ho vam fer només unes poques línies abans.
Però, per desgràcia, això en realitat no ho farà
treballar, perquè vostè és essencialment realitzar
una operació en dos tipus diferents.
>> Ara bé, això és molt diferent d'altres llenguatges com PHP que són realment
goosey arronsa amb la seva classe de tipus.
Només estan agrada, sí, el que sigui, no m'importa.
Només dóna'm un tipus, i potser jo vaig a fer el correcte.
>> En aquest cas, és Swift molt estricte pel que fa als tipus
que vostè està tractant.
Aquest operador sumatòria o operador de concatenació
té essencialment un parell de diferents opcions possibles.
Vostè pot fer la suma amb nombres enters, o que
pot fer la concatenació de cadenes, i potser algunes altres coses també.
Però si aquest operador no reconeix el que està en cada costat d'ella,
o més aviat la combinació dels dos tipus, no és el que està esperant,
llavors va a conduir a la caiguda.
>> Així que en aquest cas, ¿què significa tenir una cadena més un nombre enter?
Bé en el context de això, és probable que volem
fer una operació de concatenació de cadenes.
Però, és clar, l'ordinador no té aquest tipus de context.
I el que hem d'oferir que la informació addicional
per fer-li saber el que és que nosaltres volem fer.
>> Així, en altres paraules, el fet que Swift és fortament tipat
vol dir que vostè ha de fer un mica de treball addicional
per aconseguir que funcioni el manera que vostè desitja.
Però com a resultat, és més segur.
I una vegada que tens prendre en compte aquests tipus,
les coses comencen amb franquesa que funciona prou bé.
>> Així que en aquest cas, llavors ho faria realitzar la concatenació de cadenes
per colada explícitament el nombre sencer a una cadena
embolicant-lo en aquest capital de la funció S String,
i després utilitzant la concatenació de cadenes operador modificar la nostra variable etiqueta,
i després imprimir-lo.
>> Fins ara, tot bé?
Molt bé, anem a passar.
>> Ara bé, hi ha una varietat de dades tipus que podem utilitzar en Swift.
Com han acostumat a, podem crear una matriu mutable.
I aquesta matriu només pot contenir un sol tipus.
>> Així que en aquest cas, crearem 1 mutables arrays d'enters, els quals
l'anomenarem graus, i podrem per emmagatzemar que en aquest claudàtor
format que t'has acostumat en una varietat d'altres idiomes.
Però notem que aquí estem la definició d'un parell de coses.
graus és un variable-- mutable No fem servir la paraula clau let.
Així que això significa llavors podem modificar el contingut d'aquesta matriu.
És de tipus Array Int, i podem dir que
en base a aquests claudàtors aquí.
>> Ara una de les coses bones sobre això és que
tenir accés a una gran quantitat de informació adicional
sobre la matriu només usar alguna notació de punt simple.
Així, per exemple, grades.count ofereix a nosaltres
el nombre d'elements que hi ha en aquest matriu, que podrem accedir a pràcticament
fàcilment usant simplement que la notació de punt.
>> Si voleu afegir addicional articles a aquesta matriu,
no es pot fer l'estil de PHP on s'acaba de definir de manera explícita,
a un índex donat, algun valor que vols inserir.
En el seu lloc, utilitzeu el append mètode en el tipus de matriu
per afegir que el tema, el 95, a aquesta llista.
>> Així que ara aquesta matriu té la següent contents-- 100, 0, 90, 85.
I ara que hem adjuntem 95 perquè també.
>> Hi ha altres maneres podem afegir coses.
Vostè pot utilitzar realment un operador de suma,
el qual serà interpretat com una operació de matriu de dades annexades.
I a continuació, pot afegir un altre matriu, el contingut és el 70 i el 80,
a aquesta matriu.
Així que ara tenim la continguts en aquesta variable
grades-- 100, 0, 90, 85, 95, 70, i 80.
Això és només una petita sintàctica sucre que Swift ofereix a nosaltres.
>> Així que si volem resumir la graus, estem potser
voldrà repetir sobre tots els elements d'aquest bucle.
I nosaltres tenim, en Swift, la noció d'un bucle for com era d'esperar.
Però la forma en què li indiquem una gamma és lleugerament diferent.
Així doncs, en aquest cas, per Resumint tot, anem a
crearà un temporal anomenada suma variable en ordre per a nosaltres
per mantenir aquest recompte.
>> I noti la nostra per construcció de bucle aquí.
Per índex en 0 .. <grade.count.
Així que aquesta construcció, 0 .. <grades.count és una operació de rang on estem
dient que crearem una gamma de nombres enters de 0 fins
però excloent grades.count.
Així que aquest serà 0, 1, 2, 3, 4, 5, fins que no obstant això molts un
abans grades.count.
>> Així que això és diferent de la manera en què que normalment s'utilitza per als bucles
on tindria algun índex variables, configurar igual a 0 al principi,
i després integrar que fins a alguns valor menor que el nombre d'elements
en aquesta matriu.
>> Així que hi ha una modificació a aquest, en realitat,
el que ens permet molt fàcilment establir diferents tipus de rangs.
Si canvia aquesta gamma de tres punts, 0 ... grade.count,
això representa l'interval de 0 a grades.count inclusiva,
el que significa que aquest nombre és també a continuació, s'inclou en aquest rang.
>> Però això és molt pràctic per a aquestes coses exactes,
quan hem de realitzar iteracions més de bucle
perquè aquests índexs s'indexen zero, com hem vist en altres idiomes
tant be.
Teniu preguntes sobre aquest per bucle?
>> Així que no hi ha definició implícita d'aquesta variable índex,
el valor comença a 0, i continua en cada iteració del bucle
augmentar en un 1 fins a un punt que és igual a grades.count,
en el punt, el bucle avorta.
>> Tingueu en compte que a la nostra cadena interpolació aquí,
en realitat podem realitzar algunes senzilles manipulacions a aquests valors.
Així índex més 1 farà realitat realitzar una suma d'aquest valor
perquè índex és, en aquest cas, un nombre sencer.
I en aquest punt, ho farà a continuació, es converteix en una cadena
i interpolat en aquesta cadena aquí, i imprès com esperaríem. .
>> I el bo sobre els arrays aquí és
que també som capaços de tenir valors d'anar a buscar i els valors d'ajust
utilitzant el suport de notació quadrada com que hem vist en altres idiomes també.
>> Molt bé, pel que des d'aquí, ara calcular la nostra suma de tots els nostres graus.
Ara espècie de la propera pas lògic seria
fer una operació de divisió per trobar la mitjana d'aquests graus.
Però alguna cosa important aquí està succeint que
és que aquesta suma és potser un nombre sencer.
Però hem de fer alguna mena de doble divisió.
I això serà extremadament important quan
volem realitzar aquesta operació, perquè el que estem dient
és que necessitem en realitat realitzar la divisió en dos dobles.
I de nou, perquè Swift és molt inflexible,
hem d'establir explícitament tota la articles a dobles abans que realment
realitzar aquesta operació.
>> Així que per a nosaltres realitzar doble divisió,
no és suficient per a un sol d'aquests elements per ser un doble.
Tots dos han de ser un doble amb la finalitat d'accelerar la
per assegurar-se que aquest és el que volem fer.
Així que anem a continuació encasellat explícitament la suma que hem calculat més amunt
i el recompte dels graus als dobles, i a continuació, realitzar aquesta operació i emmagatzemar
que en aquesta nova variable, o millor dit, aquesta nova constant anomenada mitjana,
el qual tindrà de quin tipus, t'imagines?
Doble, si.
Així que en aquest cas, no han de especificar
ja que pot deduir-se de la operació de quin tipus de mitjana de dades
serà.
I Swift és en general bastant bona sobre ser capaç d'inferir els tipus.
>> Vols veure això rotllana, o puc seguir endavant?
Vull seguir endavant.
Qualsevol pregunta sobre alguna cosa d'això?
Gran.
>> Ara anem a començar a arribar a les bones funcions definitòries stuff--,
i un parell d'altres tipus que són única de Swift que no té
vist en altres idiomes fins a aquest punt,
però estan presents en una altra idiomes que es poden trobar més endavant.
Així que primer si vols per definir una funció,
es defineix amb la paraula covard funció, i després el nom de la funció,
i després entre parèntesi, els arguments que desitja que la funció d'acceptar.
Els arguments han de també specify-- generally--
També ha d'especificar el tipus de dades que que són, tret que puguin ser inferits.
I veurem que poc advertència en només una mica.
>> Així que en aquest cas tenim una funció crida printGradeCount.
Anem a acceptar una variable-- o més bé en aquest cas,
1 constant-- anomenat llibre de qualificacions.
I que serà de escrigui matriu d'enters.
Ara hi ha alguna cosa això és realment important aquí
que jo vull que entenguis.
És a dir que, per defecte, aquests arguments que són entrades per a aquesta funció són
definit amb una paraula clau implícita let, el que significa que no puc modificar aquesta
variable de llibre de qualificacions aquí.
I aquest tipus de té sentit, perquè vostè està passant dades.
I potser no ho vols de canviar de sota de tu.
És possible esmentar explícitament que aquesta és una variable posant
la paraula clau var aquí.
Però aquesta és una de gotcha que hem persones notat han fet en el passat
és que ells van assumir que es va ser una variable quan, de fet,
és una constant.
>> Molt bé, així que aquí, llavors, en aquest cas, no estem especificant qualsevol tipus de retorn.
Mostrarem com fer-ho que, en un moment.
Però cal notar que aquí tenim només un simple si la condició.
Si el llibre de qualificacions és buit, que en aquest cas
és només la propietat d'aquest sencer matriu, llavors imprimir alguna cosa.
Altrament ho fem una altra cosa.
>> Bastant senzill fins ara crec.
Però aturar-me si té alguna pregunta.
>> Ara aquesta funció, la mitjana, també pren alguns arguments, o més aviat un argument,
que és el llibre de qualificacions, i aquest cop va a tornar un tipus de matrimoni.
A causa que està calculant de la mitjana i és
va tornar realitat que mitjana calculat a la línia que truca.
>> En aquest cas, s'especifica la tornar tipus després d'una fletxa.
I això pot sentir una mica estrany al principi.
Has crescut acostumats a fixar el retorn
escrigui abans del nom de la funció.
Però si et sembla aquest en termes de les matemàtiques,
com quan tens les matemàtiques que defineixen una funció,
vostè té una funció amb alguns entrades, i es produeix una sortida.
I això és exactament el això se suposa que imitar.
I hi ha un parell d'altres llengües que tenen una sintaxi similar també,
però probablement cap que que has vist a CS50.
Però encara no es deixi confondre per això.
La fletxa significa el que està passant per ser retornat en aquest cas.
OK, així que com anem per calcular aquesta mitjana?
Bé, si el llibre de qualificacions està buit, així llavors estem
va a tornar 0, el que potser una forma raonable per tractar això.
No sé, arribarem tornar a això en una mica.
Aquesta realitat no pot ser una manera raonable
per calcular una mitjana si tenim un llibre de qualificacions buida.
>> Després només haurem de realitzem la nostra suma.
Noteu que aquí estem en realitat tenir una versió alternativa d'un
de llaç, el que ens permet iterar sobre cada article en una matriu
i col·locar cada element en la seva pròpia variable.
En especificar per al grau en llibre de qualificacions, el que estem dient
és que anem a implícitament crear una nova constant anomenada
grau que representarà cada article únic en el llibre de qualificacions
cada vegada que el bucle for itera.
Així que la primera vegada que està dirigit, grau ho farà
ser el primer element en el llibre de qualificacions.
La segona vegada que va a ser el segon element, etc., etc.
fins al llibre de qualificacions té esgotat d'elements.
Llavors serem capaços de resumir que grau en la nostra variable sumatòria
i tornar nostre mitjana com hem vist abans.
OK, alguna pregunta?
Sí?
AUDIÈNCIA: Tinc dues preguntes.
Número u, hipotèticament, pot executar sencer en aquest cas?
No ha de ser un doble, és això correcte?
DONEN AMRMENDARIZ: Pot vostè repetir la pregunta?
AUDIÈNCIA: Puc fer sencer com la mitjana?
DONEN AMRMENDARIZ: Pot vostè fer sencer com una mitjana?
Així retornar un enter mitjana en lloc d'un doble?
>> AUDIÈNCIA: vostè Return-- tenir aquest moment de sota.
DONEN AMRMENDARIZ: Aquí mateix, retorni 0.0?
AUDIÈNCIA: Sí, només tornar 0.
Per tant, serà o bé 80 o 85, però no 85.2.
>> DONEN AMRMENDARIZ: Així que en aquest cas, així que hi ha un parell de maneres diferents
per respondre a això.
Deixin-me els responc en ordre.
Així que si jo només faig aquest retorn 0, un 0 és un valor sencer.
I pel que li causarà una error de tipus per a aquest cas
perquè està esperant un doble però després torna un enter.
Si vull tornar un sencer, puc.
Puc fixar el tipus de retorn a int, retorna 0 aquí,
i no realitzar la doble divisió.
Però llavors estaríem fent la divisió entera.
I pel que llavors no aconseguir la mitjana que hauríem possiblement esperar.
Però sí podem modificar els tipus d'aquesta manera.
>> AUDIÈNCIA: ¿I en segon lloc, tenen el doble a la part superior.
Però a baix, quan fer tornar Doble Doble,
que ja és de forma automàtica tornar format doble.
Per què vostè encara ha de definir- amb la fletxa a la part superior amb un doble?
>> DONEN AMRMENDARIZ: Així en el cas, això és part
d'ell-- el que repetir la pregunta, perquè és implícita de la declaració
tipus aquí, quin tipus d'aquesta realitat És a dir, hem de ser explícit amb Swift
sobre el que volem tornaran d'aquesta funció
de manera que quan es realitza escrigui comprovació, es pot assegurar
que el que en realitat hem escrit baix realitat s'ajusta a això.
Així que és una cosa així com un xec amb un mateix tipus de situació.
Però no tracti:
>> AUDIÈNCIA: [inaudible] fletxa?
>> DONEN AMRMENDARIZ: hi ha casos en què podem especificar que podem implícitament
establir el tipus de canvi.
Però en aquest cas, no ho faig crec que això funcionaria.
Hi ha alguna altra sintaxi que veurem més endavant.
>> Molt bé, pel que aquesta font codi és una mica diferent
perquè aquest analitza els arguments de la funció que estem cridant.
Et vaig a ensenyar com funciona abans que realment seguir endavant
a algunes coses interessants que està succeint en Swift.
>> Així que en aquest cas, si jo només corro aquesta codi, observi que el que està fent
mentre que és-, quin tipus de em dóna un error estrany.
He de passar un parell de sencers com un argument de línia d'ordres.
Així que anem a veure, 150 i 80, i prem enter per esbrinar el que està fent en realitat.
S'accepta cadascuna de aquests valors com a nombres enters.
Se'ls està introduint en un llibre de qualificacions.
I després hi ha la realització de que el càlcul mitjana
i la sortida que, com és d'esperar.
>> Però òbviament hi ha alguna cosa que fer amb això algú rebutjant
alguna cosa com un sencer.
Com es pot recordar de quan érem es tracta d'arguments de la línia d'ordres
en C i altres llenguatges, la primera 0-èsim element en què l'argument de línia d'ordres
llista és el nom de la comanda que en realitat executem.
Així que en aquest cas, només estic bucle sobre tots els arguments de la línia d'ordres.
Però jo no estic fent cap tipus de luxe comprovar per passar per alt que la primera.
Estic explícitament o implícitament que sóc comprovar quin d'aquests tipus
són sencers abans que realment realitzar aquest càlcul.
>> I això és en essència ¿Què està passant aquí.
Per a cada argument en els arguments del procés,
Vaig a fer alguna comprovació.
I en aquest cas, em vaig per tractar de primer convers
aquest argument en un sencer per realitzar una conversió de tipus explícita,
perquè és, a l'entrada, una cadena i no de fet un nombre sencer.
>> Però això és una espècie d'una sintaxi estranya, si el grau és igual a deixar Int (argument).
Què està succeint realment aquí és extremadament
important per al seu ús de Swift.
Això és usant el que és anomenat un tipus opcional.
>> Així que aquesta funció Int (argument), retorna no només un sencer, però torna
el que es diu un sencer opcional.
I pel que aquesta és una espècie de un tipus en la part superior d'un tipus.
Pot espècie d'imaginar com està tornant com un paquet.
I en obrir que paquet, ja sigui
té un nombre sencer, que és el resultat, o no té absolutament res en ella en absolut.
I això és útil com a comprovació d'errors mecanisme, perquè en aquest cas
podem esbrinar, era això conversió reeixida tipus?
Si ho fos, llavors és, de fet, tindrem un nombre enter a l'interior.
En cas contrari, va a tenir una mica de valor que anomenarem nul·la, el que
és representant de cap sencer en absolut.
És realment representativa de res.
>> I pel que aquest si la construcció ens permet desenvolupar el paquet,
que opcional d'unió.
I si som capaços de desenvolupar que empaquetar i trobar un nombre enter a l'interior,
llavors el que estem dient aquí és que ho farem a continuació,
permeten que el valor que s'estableix en aquesta constant anomenat grau.
I aquesta part de la sentència if, la part superior de la sentència if
s'executarà, perquè això desenvolupi amb èxit.
>> Si dóna la casualitat que hi va haver un error potser
en aquesta conversió de tipus explícita a partir d'una cadena en un enter, potser
que és l'ABC de valor, per exemple.
I això és realment no anar per convertir a un enter.
Llavors tornarà a zero, que no és un enter.
I aquesta sentència if bé llavors falli.
grau no existirà perquè no té contingut sencer.
I va a executar aquest bloc cosa al seu lloc.
Sí?
>> AUDIÈNCIA: Nul és N-I-L?
DONEN AMRMENDARIZ: nil és N-I-L, si.
>> Així que aquest és potser un dels les coses més difícils sobre Swift,
especialment quan vostè està en les males herbes en una aplicació per iOS
i en realitat estàs tractant fer una mica de desenvolupament allà.
Va a estar cridant a vostè sobre opcional.
Serà vostè demanar signes d'interrogació i d'exclamació.
Però una vegada que figura fora-- si dedicar algun temps a esbrinar
el que està passant amb els tipus opcionals, s'estalviarà una gran quantitat de mal de cap
com vostè està tractant de escriure una aplicació en Swift.
>> En realitat és una característica molt poderosa.
I vostè només haurà de prengui la meva paraula per a ella de moment.
Però anem a veure aquesta construcció i alguns altres com ell
en alguns dels altres codi font que li mostrarem en només una mica.
>> Hi ha alguna pregunta inicials aquí?
Així que el menjar per emportar important és que una Tipus opcional és una espècie de metatipo.
O bé té un valor, i si ho fa, llavors
potser haurà de valor associat amb ell, o no té cap valor,
i es representa per nul·la.
La resta d'aquest és potser com era d'esperar.
>> Així que anem a la rampa sobre de la dificultat una vegada més.
I aquesta vegada, anem a fer una ullada a alguns altres tipus de dades que existeixen en realitat.
Un d'ells és dels diccionaris, que és molt similar als diccionaris de Python.
És una cosa similar a una taula hash en C. Es tracta essencialment d'un mapeig de tecles
on les claus poden ser cadenes.
I quan vostè mira cap amunt aquestes claus, aquestes claus tindran un valor.
Així que no és del tot un arsenal, però en canvi, més estretament associat
a un mapa de hash o una taula hash.
>> Anem a veure com això es suposa a treballar abans que realment
entrar en el propi codi font.
Si jo només corro això, res realment succeeix.
M'està dient que estic esperant alguns paràmetres del tipus següent.
Així que vaig a donar a que alguns noms de problemes,
així pset0, potser em van donar 100.
I pset1, tinc maig 1.
I després en l'examen, em ho va fer molt bé i va aconseguir 30.
I vaja, em va colpejar un espai aquí.
>> Quan vaig arribar a Enter, es pot veure que realitzi un càlcul.
Diu llibre de qualificacions és de tres graus, pset1, pset0, examen.
I el llibre de qualificacions té aquesta mitjana específic.
Així que de nou, estem treballant amb aquesta idea del llibre de qualificacions,
però continuarem la iteració amb la complexitat de la nostra funció.
>> Així que en l'inici, només som crearà una funció que
és responsable de la impressió de l'ús.
I hi ha aquesta sortida funció que acaba de
la força sortir de l'aplicació.
Això no és una cosa que que utilitzarà en iOS.
Això només és, en aquest cas, amb un argument de línia d'ordres.
A continuació anem a començar a avançar cap a Xcode.
Però això és específic d'un comandament programa d'estil de línia en Swift.
>> Fem una ullada a alguns les coses interessants aquí.
Anem a veure, només un parell de coses interessants per esmentar potser
és que en la meva funció de imprimir el nombre de graus,
es pot recordar que vaig tenir aquesta llista de pset1 articles--, pset0 i examen.
Vostè pot realment ràpid i fàcil de fer això
prenent el llibre de qualificacions, que és una diccionari que té claus i valors.
Trobar tots els de la clau és a través de el mètode tecles de punts aquí,
i després utilitzar aquest joinWithSeparator, que després prengui totes les claus
que havíem escrit en, o pset1-- ho sento, pset0, pset1 i exam--
i concatenar junts usant una coma i un espai
per crear una cadena llarga.
Aquesta operació de combinació és simplement fenomenal útil en una varietat de contextos.
I el que és aquest joinWithSeparator.
>> I això és una cosa que és canviat d'1 a Swift Swift 2.
Solia haver-hi un Style-- Python si estàs
familiaritzats amb Python-- 1 Python estil unir mètode de cordes.
Però això ja no és en el cas de Swift 2.
Vostè vol utilitzar aquesta opció si voleu per concatenar una sèrie de coses
juntament amb una cadena.
>> Així que potser llavors en el nostre discussió de mitjana abans,
fa una mica més de sentit per a nosaltres per ajustar la funció mitjana
ser un doble opcional en lloc que un doble explícit.
Perquè havíem de condició inusual en el qual,
¿I si en realitat llibre de qualificacions no té valors dins d'ella?
Què li dec la rendibilitat mitjana?
>> Bé, potser en C que hauria fet alguna cosa
com sempre un valor sentinella, com 0.0, o potser un nombre negatiu,
o alguna cosa només representa el fet de que hi havia alguna condició d'error
i que potser en realitat no té la capacitat de calcular aquesta mitjana.
Bé, la bellesa de l'especificació d'un Tipus opcional seria fer això.
I ara estic dient totes aquestes paraules, però això en realitat no utilitza opcionals.
Però anem a veure que en tan sols minut en el qual podem establerts mitjana
ser un tipus de dades opcional de manera que si en realitat retorna algunes dades, a continuació,
tornarem aquestes dades.
Altrament, tornarem nil, dient que aquest
no té còmput significatiu.
>> Anem a passar a una altra cosa.
Així que des d'aquí, hem estat veient tots aquests exemples en la línia d'ordres.
Però en realitat el que vas que es tracta d'és Xcode.
I una de les coses bones de Xcode és, i específicament en Swift,
és que tenim aquest El va anomenar un parc infantil.
I un parc infantil és no és en absolut una aplicació per iOS.
Però li permet experimentar amb Swift en una manera molt fàcil.
Pot escriure tot el codi.
Està molt bé la sintaxi ressaltada aquí.
Quan es crea un nou arxiu, se us demanarà si voleu crear un parc infantil.
Però el millor de la Zona lúdica és que a la dreta de la finestra,
és el que realment li mostri sortida des del codi.
Així que si em desplaço cap avall, podem veure el que la sortida de diverses línies de codi
en realitat passa a ser.
>> Així que en aquest cas, anem a canviar de direcció una mica
i parlar d'alguna cosa que és realment important d'aquesta manera d'alt nivell
que Swift opera, i és aquesta idea de tancaments.
I del que has vist aquesta una mica de JavaScript.
Per a aquells de vostès que estan en CS50, tancaments
són molt populars molt bona manera de fer-ho, coses d'alt nivell en les llengües modernes.
Però també és una mica difícil de embolicar el seu cap al voltant de la primera vegada.
Així que si vostè busca en aquest primera vegada, això està bé.
Només cal mirar el codi font i veure si vostè pot resoldre a casa.
>> Així que en aquest cas, diguem que tenim que vulgueu crear una gran quantitat d'exponents
amb algun valor fix.
Així que en aquest cas puc crear una funció.
Vaig a dir-poder de 2 l'únic propòsit en la vida
és prendre alguna entrada i doble ella, i tornar aquest valor.
Noteu que aquí estic acceptar un tipus de dades.
Serà una variable anomenada x.
És de tipus Double.
I jo vaig a tornar un doble aquí.
I jo només vaig a fer un molt, francament, bastant
manera ingènua de duplicar aquest valor.
I et vaig a mostrar per què això és útil en només un segon.
>> Noteu que aquí tenim aquest rang de nou. alguna cosa en 1, punt
dot dot, 2, el que significa que aquest bucle s'executarà dues vegades.
Però això representa una variable fictícia.
Significa que no estic realment va a estar usant aquesta variable en qualsevol lloc
dins d'aquest bucle.
Només vull aquesta línia de codi per executar dues vegades,
sense necessitat de conèixer el valor d'aquest rang.
>> Així que en aquest cas m'estic quedant resultat X vegades dues vegades, que essencialment
vol dir que jo estic quadrant aquest valor.
I això passa a treballar com esperaríem.
Potència de 2, passant un valor de 2.0 ens dóna una potència de 4.
3.2 obres per 10.24.
>> Ara podem fer un de semblant cosa pel poder de 3.
Però ara canviar només la gamma.
Per variable fictícia en 1 a 3, multiplica 3 vegades,
i fer el mateix.
>> Així que això podria sentir una mica artificial.
Però hi ha una important cosa aquí que
és que mirant a aquests dues funcions, hi ha
només una cosa que és diferent, que és aquest valor en la gamma.
Tota la resta en aquests dos funcions, poder de 3 i la potència de 2,
són, de fet, idèntics perquè funcionen de la mateixa manera.
>> Així que en aquest punt, una mica campana d'alarma ha d'anar fora.
Esperem que el que estàs dient, ja saps, això se sent una mica
com la duplicació d'esforços.
Potser hi ha una forma en què ho faria ser capaç d'encapsular tot això
i proporcionar una funció de o crear una funció que
fa exactament el que vull sense necessitat d'escriure-ho explícitament.
I això és el que el poder d'un tancament ens permet fer.
Així que anem a fer una ullada a això.
I vaig a passar un parell minut en això, perquè aquest
és molt important per a Swift.
Veiem això tot el temps.
Anem a definir una funció.
Serà anomenat powerof.
Es va a acceptar una paràmetre anomenat i de tipus int.
Però fer una ullada a el tipus de retorn.
El tipus de retorn és, en parèntesi, doble fletxa doble.
El que vol dir que aquesta funció, powerof aquesta funció,
està tornant una funció.
Això està acceptant una doble i el retorn d'una doble.
Així que pot sonar una mica boig, però anem a desplaçar-se cap avall una mica
i mira a veure què passa.
Estem dins d'aquesta funció powerof.
Estem creant una nova funció anomenada exponenciador,
però no importa el que és.
>> Tingueu en compte que això no té un valor d'entrada de x.
I que està prenent en una doble i el retorn d'una doble.
I aquest és el mateix codi que ens va veure anteriorment, excepte que el valor de 2
o el valor de 3, que límit superior d'aquest rang,
ha estat substituït amb aquest valor de i, que
va ser el paràmetre inicial de la nostra funció powerof.
I en aquest punt, tornar exponenciador.
Estem tornant a la funció.
>> És una cosa així com una mica de bufat ment.
Però imaginem el que succeeix quan truco a aquesta funció powerof
i passar-hi una cert valor com 2.
El que això significa és que Ara tinc el valor
2 per a I, el que significa que aquest valor i en aquesta funció exponenciador
serà el valor 2.
Però vaig a tornar aquest funció exponenciador.
>> Així que noti el Swift diu que han creat en aquest cas.
deixi plaça està una definició, és una funció que accepta un doble
i retorna un doble.
He creat una funció cosa que els quadrats
l'ús d'aquest mecanisme d'aquí.
I realment el que està passant és que torna aquesta funció
exponenciador, però aquest valor i s'embolica dins d'ella.
I pel que ara cada vegada que utilitzo aquest variable o aquesta constant anomenada
quadrat, que es va a comportar-se com una funció.
I perquè pugui després trucar a aquesta variable de la mateixa manera que jo anomenaria una funció,
i passar-hi un nombre, com en aquest cas 3.
I jo llavors quadrar aquest valor.
Així que 3 al quadrat serà llavors convertir-9, com es pot veure aquí.
>> Realment una bogeria, però això ara em permet l'oportunitat
per crear altres funcions powerof.
Igual que el que puc dir, està bé, així que ara vull per crear una nova funció, powerof (3),
i emmagatzemar que en una anomenat cub constant.
I ara el cub serà un funció separada que després
tenir algun valor com a entrada i galleda que valor com podem veure a la línia de fons
aquí.
cúbica de 2 va donar lloc a 8.
>> Esperem que les coses bastant ordenada.
Vostè mai ha vist això abans.
Us animo a mirar en els tancaments i investigar això una mica més.
És una cosa realment poderós veiem una gran quantitat en JavaScript i alguns altres idiomes.
És realment vital per la comprensió d'APIs, així
que arribarem a en tan sols uns segons.
Sí?
>> AUDIÈNCIA: En fer powerof (2), entre parèntesis, i després
un altre parèntesi, un altre input-- que està bàsicament la substitució de la plaça.
DONEN AMRMENDARIZ: Així que mira en l'última línia aquí.
En realitat, és totalment possible fer que l'encadenament com vostè suggereix.
Així powerof (5) significa que anem tenir una exponenciador de 5 aquí.
Així que aquest és essencialment serà el el mateix que 4 a la cinquena potència,
perquè hem creat un exponentiating funcionar a la cinquena potència,
i estem passant a funcioni el valor 4.
I tenim que el valor que esperem, 1024.
AUDIÈNCIA: I no és un nomenar, pel que fa més fàcil
llegir, la plaça que sigui.
>> DONEN AMRMENDARIZ: Correcte, exactament.
Així que abans jo només vaig posar en una constant aquí, així
que fa que sigui fàcil d'usar aquest nom.
Sí?
>> AUDIÈNCIA: En aquest context, powerof, és part
del llenguatge de programació a diferència de la forma en què
pensar en powerof en [inaudible]?
DONEN AMRMENDARIZ: Així en aquest cas, powerof
és simplement el nom de la funció que he definit aquí.
Així que no és inherent al llenguatge mateix,
però en canvi, és només una funció que té
aquest nom perquè li dono aquest nom.
Alguna altra pregunta?
Tot bé.
>> Ara això és genial.
Però no vas a veure un gran quantitat de funcions de tancament que
són com aquest on es defineix, a l'interior d'una funció, una altra funció.
I vostè pot fer-ho.
Però no és la classe de realment necessari, no?
Igual que per què em defineixo aquest funció anomenada exponenciador
i immediatament després tornar-lo.
Per què no puc fer-ho jo sol immediatament tornar aquesta funció?
>> I de fet, això és precisament la idea darrere d'un concepte anomenat
funcions anònimes, en les funcions anònimes en realitat no
tenir un nom, ja que no cal tenir un.
I així, en aquest cas, 7B, podem trobar exactament això.
És tot el mateix codi, fa exactament el mateix,
però ara hem canviat lleugerament per que aquesta funció powerof immediatament
retorna una funció.
Tingueu en compte que després de la tornada, hi ha un claudàtor obert.
Està esperant aquesta entrada doble.
S'espera que la producció doble.
I després la paraula clau en separa el propi codi.
Així que aquesta és una funció anònima.
En realitat, no té nom, mentre que abans que fos anomenat exponenciador.
Però com hem vist, realment no es referia a exponenciador
fora d'aquesta funció.
Així que no importava.
Així que aquesta funció anònima és així cridada perquè és sense nom,
però se segueix utilitzant en el context d'aquest codi.
>> Els propers dos que jo sóc va a continuar amb sort
bufa la seva ment una mica.
Podem simplificar això encara més.
Perquè de la mateixa manera que astutament es va assenyalar anteriorment,
potser que sabem, per inferir d'aquest codi, el que
la sortida d'aquest codi va ser.
I de fet, en aquesta funció anònima, De fet podem inferir els tipus de dades.
>> Així que en aquest, ja no de definir explícitament
el tipus de dades que està sent entrada i sortida d'aquesta funció
per un parell de raons.
Una és que hem definit, cap al prototip de la funció envoltant,
quin tipus de dades d'aquest anònims funció hauria entrada i sortida.
I de l'altra, ens pot inferir a partir del codi
aquí baix que estem acceptant d'entrada que és de tipus doble
i el retorn d'una doble.
>> Cal notar que aquí no tenim forma explícita definit els noms de els arguments
que aquesta funció està acceptant.
I així veiem que podem fer referència a aquests paràmetres amb $ 0, $ 1,
així successivament i així successivament, depenent de el nombre d'aquest paràmetre utilitzat
en aquesta funció.
>> Això és una cosa que es va a veure molt és aquest suport arrissat oberta
seguit d'una definició $ 0, i després alguna operació,
i després una clau tancada.
Aquesta és una funció anònima que realitza aquesta operació.
Té aquest paràmetre, on és tipus és inferit.
Aquest primer paràmetre és 0 $.
I alguns operació és succeint en aquest $ 0.
>> AUDIÈNCIA: Llavors el signe de dòlar significa paràmetre bàsicament,
i 0 vol dir que el primer?
DONEN ARMENDARIZ: Això és correcte.
Així que el signe del dòlar significa, bàsicament, paràmetre, i 0 vol dir la primera.
Però funciona específicament en aquest cas en el qual no he anomenat
els arguments en la meva funció anònima.
>> AUDIÈNCIA: El Perl o alguna cosa tenen aquest signe del dòlar, dòlar 0 allà?
DONEN ARMENDARIZ: ¿Qui, ho sento?
AUDIÈNCIA: Té Perl aquest dòlar 0, dòlar 1--
DONEN ARMENDARIZ: No estic molt familiaritzat amb Perl,
però PHP el que defineix les variables basat en signes de dòlar.
I pot haver alguns idiomes que tenen característiques com això.
De fet, Swift demana prestat un gran quantitat de característiques d'aquest tipus
d'un munt d'altres llengües.
Veiem indicis de Python en ella.
Aquesta definició de tipus sembla provenir de OCaml.
I tenim només un munt de coses d'un munt de diferents idiomes.
Aquest és un dels més agradable coses de Swift
és que es necessita una gran quantitat dels millors idees d'un munt d'idiomes
i tots ells junts calçadors en una llengua super.
De fet, si em permets continuarà bufant la seva ment,
pel que hem estat fent tot això.
Potser podem simplificar això una mica poc a adonar-se que, per descomptat,
Swift té un exponentiating funció incorporada.
Si importo Darwin, que és només la biblioteca que
compta amb aquesta funció anomenada presoner de guerra, ara Puc simplificar el meu poder de la funció
ser el següent.
Es va a tornar aquesta funció anònima.
>> Però mira el fàcil és això ara.
Aquesta és una funció anònima que està acceptant un cert tipus de dades,
i que va a ser un argument específicament,
referenciat en $ 0 que va és de tipus doble.
Es va a tornar un tipus doble.
Però la sentència return ara és implícit.
>> I és aquest estil exacte que és molt, molt freqüent en Swift,
per tot arreu.
Anem a veure això tot el temps en Swift.
Així que estic mostrant que tot això que a causa d'aquesta sintaxi.
Això és molt comú per veure, el que significa que
és una funció anònima que està realitzant
alguna operació en aquests arguments.
I hi ha un rendiment implícit.
Per tant, és absolutament la mateixa cosa per a nosaltres dir això, aquí mateix.
>> A causa que aquest arrissat suport és una funció,
estem realitzar aquesta operació en el primer argument.
Anem a tornar això.
Però aquest retorn exterior és tornar tota aquesta funció,
que tota funció anònima que acabem de crear.
Alguna altra pregunta?
Molt bé, no sé si que vostès estan preparats per això,
però podem anar encara més boig amb Swift.
Estàs preparat?
OK, això és genial.
>> Ara realment tenim la capacitat que, en Swift, a causa de la forma modular
i com basat protocol que és, a definir els nostres propis operadors maleïts.
Com en aquest cas, no teníem operador de exponentiation-- així,
per a la realització de poders d'alguna cosa.
Però puc, en Swift, definir un nou operador que fa precisament això.
Així que en aquest cas no hi ha un munt de sintaxi aquí.
I em permetré que vostè miri a casa quan ens fixem en això.
Però estem definint aquest infix operador, **, que llavors ens permetrà,
mitjançant la definició del que Funció ** realitat
no, a acceptar una mà esquerra costat i una mà dreta,
i després per tornar l'exponent d'aquest a mà esquerra a la mà dreta.
>> I ara, de cop i volta, em han creat un nou numerador.
Així ** 2 mar significa 2 a la tercera potència.
[MENT SANA QUE BUFA] Aquest per si t'ha de fer ser com,
OK, cargol C. vaig Swift tot el camí.
Això es fantàstic.
Això és bastant fantàstic.
>> Encara que aquest és un gran exemple.
Però jo mai tinc un cop fora d'aquest exemple realitat
definit meu propi operador.
Però tot i això, mostra una Gran part del poder de Swift
i per què això és en realitat realment molt cool.
OK, no?
AUDIÈNCIA: Si vostè és la definició del seu propi operador,
Com saps que no ho fa per accident tractar de crear un operador que és
en algun lloc de C, igual que amagat en algun lloc de Swift,
com un fosc que pot no haver vist abans.
>> DONEN ARMENDARIZ: Així que si vostè està tractant per definir els seus propis operadors,
hi ha el risc de definir un sobre un operador existent.
Això va en un nivell de detall que Jo no crec que tinguem temps per repassar.
Però aquest és un risc.
I això és, de fet, la raó per la Jo no utilitzar el símbol d'intercalació, que
quan estem escrivint sense electricitat, en general utilitzar abril poc cursor 5 o alguna cosa
així, just quan estem Gchatting amics o el que sigui.
Però en aquest cas, que en realitat hauria causat una col·lisió.
I així vaig evitar només perquè Em va passar a conèixer en aquest cas
que això causar que la col·lisió.
>> Tot bé.
Ara, lamentablement, per els últims set minuts,
He de seguir bufat les seves ments una mica.
Així que permeteu-me que li mostri algunes altres coses també.
>> Li hem mostrat aquesta idea de tenir aquestes funcions anònimes,
aquests tancaments que li permeten classe de passar funcions voltant.
Vostè pot tornar-los.
Vostè pot manipular-los.
Vostè pot fer tot tipus de coses boges.
>> Però una altra cosa que passa a ser útil
és la capacitat de, en oposició de tornar aquestes funcions
en una funció, per passar d'una funció com un paràmetre a una altra funció.
Vostè podria estar pensant bé per què a la Terra anava jo a voler fer una cosa així?
>> Bé, diguem que vull prendre aquest operador que
treballat tan dur per crear i aplicar a un munt de diferents nombres
en una matriu.
Així que en aquest cas tinc una sèrie de integers-- 1, 4, 7, 2, 5, 10, 56.
I vull duplicar totes.
La forma en què ho faria normalment fer-ho és simplement escriure
un bucle simple perquè itera sobre totes elles
i dur a terme algun tipus de operació quadrat sobre ells,
introduir els nous valors en una nova variables, o millor dit, una nova matriu aquí.
I el valor de la sortida de resultat és llavors tots els arrays,
o més bé tots aquells elements d'ara al quadrat.
>> I podríem fer el mateix cosa per cubicar ella,
però una mica d'alarma ha d'anar fora
dient que potser hi ha d'alguna manera que ho faríem
ser capaç de simplificar això una mica.
I de fet no ho és.
¿I si poguéssim crear una funció que ens permet
a acceptar, com un depredador, una funció?
Així que en aquest cas, prendre una mirar a aquests arguments.
Anem a acceptar una llista de dobles.
I després anem per acceptar una funció
en una variable anomenada f que està passant prendre un doble i retornar una doble.
I tota la sortida de tota aquesta funció
denominat mapeador va tornar una matriu anomenada doble.
>> El que això després em permetria fer és iterar sobre aquesta llista
i fer el mateix, però ara aplicar aquesta funció en cada
dels valors individuals en aquesta llista.
Així que no se sap molt bé el que és f.
No importa a mi.
Però fins el temps que sigui necessari en un doble, realitza alguna operació sobre el mateix,
i després retorna un Doble, jo llavors
capaç d'assignar aquesta funció a través de cada element de la llista.
>> I aquest tipus de programació és anomenades funcions d'ordre superior,
on estem passant funcions voltant com a paràmetres
i fer coses amb les funcions.
És com prendre tots aquests les idees que hem après en CS50
i portar-los espècie de al següent nivell.
I això és tot material estil CS51.
I així anirem a fons més en les classes així.
>> Però això és també important aquí perquè
veure una gran quantitat de funcions que s'utilitzen en Swift
que essencialment fa això, en el qual tenim
alguns números, algunes matriu de nombres.
Anem a passar que matriu en la nostra assignador.
I també anem a passar alguna funció, que
que ja hem definit aquí.
Serà quadrada.
I anem a continuació, quadrar tots els números
i emmagatzemar que en aquest resultat aquí.
>> Així que aquest cas hem definit la nostra funció pròpia crida mapeador.
Però aquesta cosa exacta és, de fet, integrat en Swift.
Hi ha una varietat de funcions criden mapa.
Hi ha una funció de mapa, hi ha una funció de reduir,
i hi ha una funció de filtre, que essencialment aplicar funcions
per a cada element en un llista de modificar d'alguna manera.
>> AUDIÈNCIA: Així que ja està transformant les dades en un altre format
a través d'un function--
DONEN ARMENDARIZ: Correcte.
Sí, de manera que la funció que estem acceptant
està transformant les dades d'alguna manera.
En aquest cas, estàvem bé quadratura, o ens cubicació ella,
o en realitat, podríem fer cap operació en ell en absolut.
>> Però m'ho dius a mi mostrar a continuació com aquesta es va a veure a la pràctica.
I de nou, estic corrent un poc de temps. així que no estic
serà capaç de passar per sobre de tot del codi font aquí en detall.
Però m'animo a fer això.
Anem a publicar tan aviat com possible després d'aquesta xerrada.
>> Però si vostè pren una ullada a això, assumir que tenim una llista de nombres,
una sèrie de nombres en aquest variable anomenada nombres.
Llavors volem realitzar aquesta operació de filtre en aquests números.
Així filtre és un major funció perquè
accepta una matriu i també una funció.
I en cada element en aquesta matriu, que exerceixi aquesta funció.
>> Si que els retorns de funció cert, manté aquest element.
Si aquesta funció retorna false, es llença a les escombraries aquest element.
I llavors es retorna una llista a continuació, que es compon tot
dels elements que s'han filtrat.
>> Així que en altres paraules, es tracta de la mateixa idea, el llibre de qualificacions.
Podríem tenir una varietat de graus en aquest valor es diu nombres.
Podria ser 100, i 70, i 40, així successivament i així successivament.
El que això fa és el filtre previ avís que aquest és que el sucre sintàctica
per una funció anònima.
Aquesta és una funció anònima dient que el paràmetre que estic acceptant
serà, si és més gran que 70,
llavors això va a tornar true, el que significa que que el tema es mantindrà en aquest filtre.
Així que serem una mica més concreta sobre això.
Si tinc aquesta sèrie de nombres i consta de 100, 70 i 40,
Realitzo aquest filtre operació en cada un d'aquests.
Així que primer és aquest valor de 100.
100 major o igual a 70 que és veritat, que
vol dir que es manté en 100 aquesta nova còpia d'aquesta matriu.
70 també passa.
Però 40 no.
Així que el que es retorna en passingCount és la matriu d'elements 100 i 70--
100, coma, 70.
Aquests van ser els dos únics elements que es van mantenir.
I així, la raó per la qual ràpidament va passar per una gran quantitat d'aquest tipus d'alt ordre
les coses són perquè això és tan comú El que vas a veure en Swift bastant
amb freqüència, està realitzant una operació usant aquesta sintaxi funció anònima.
>> Hi ha algunes coses interessants.
Els switches són realment de gran abast en Swift, Em refereixo només a la babalà, boig poderós.
Vostè pot utilitzar l'interruptor, i en realitat es pot aplicar
als rangs, el que és una bogeria, i fer coses de luxe així.
>> Però en els últims minuts, Vull saltar per davant bastant lluny
i li mostrarà un exemple específic de com podem crear en iOS utilitzant Swift.
Així que quan vostè està fent això, vostè haurà de prendre
una mirada at-- d'Apple documentació, que
tenir un munt de molt bons tutorials per a la creació de la seva primera aplicació.
I m'animo a fer que a causa de que et porten
a través de tots els passos del que exactament a feu clic a per crear una aplicació de iOS.
>> Però aquí tenim aquesta aplicació per iOS.
I és una aplicació molt simple en realitat.
Si em quedo això, deixa mostrar del que sembla.
Tot el que fa bàsicament és que tira de la Internet un arxiu JSON
que he emmagatzemat al servidor.
I aquest fitxer JSON defineix imatges que permeten
jo llavors recórrer, en el meu aplicació, imatges del meu servidor web.
>> Així que tinc aquí getNextImage.
Es carrega una imatge de la internet, i després ho mostra a la pantalla.
>> Així que és bastant simple.
Però l'objectiu aquí és mostrar que la forma en què pot combinar coses
des de les últimes setmanes de CS50 en una aplicació real iOS.
En altres paraules, potser un dels coses que vostè voldrà fer
és tenir una aplicació iOS que pot tirar de dades d'Internet
i mostrar a l'usuari certa informació.
És totalment el punt d'aquest codi font aquí.
>> Així que hi ha molt a dir sobre com fer desenvolupament real iOS.
Hi ha un munt de sintaxi boja que no hem vist encara prou
com una classe, el que una classe és en realitat.
Podem ignorar en gran mesura que, de moment.
>> Però notem que hem continguda dins d'aquest una varietat de coses
que ja hem vist com funcions que tenen noms específics.
I quan donem els Funcions dels noms correctes
que s'espera per iOS, de fet això se sent una mica màgic.
Però quan es crea un aplicació iOS, hi ha
són noms de les funcions específiques que són cridats pel propi telèfon
ja que l'aplicació es carrega de provar per crear el procés que en realitat
s'executa l'aplicació.
Així que de nou, hi ha un munt de coses que jo han de passar per alt aquí perquè puguem
parlar d'això específicament.
Però m'animo a mirar potser un altre seminari iOS, però també alguns
del tutorials en línia de fer un treball molt millor de descriure
la informació específica.
>> Però podem veure un parell de coses que són interessants des del codi aquí.
Recordeu que tenim si les declaracions.
Per cert, una important cosa sobre si les declaracions
és que els parèntesis al voltant del Expressió booleana són opcionals.
Però les claus no són opcionals, no importa que tan poques o moltes línies de codi
que té en una sentència if.
No es pot tenir un if sense claus en Swift.
>> I això és, així, una mena de ximple.
Però hi ha raons històriques per a això.
Se suposa que per salvar de tu mateix.
Així per exemple, no es pot eliminar els claudàtors al voltant de que
if.
Aquests són, de fet, necessària.
Així que us animo a fer una ullada a això.
Però hi ha una més construeixo que vull
per mostrar-li sobre Swift que és nou a Swift 2.0 en comparació
a les versions anteriors de Swift, que és el següent.
Anem a veure on el vaig posar aquí?
>> Així que en aquesta funció anomenada fetchJSON, aquesta funció
és responsable de llençar que JSON presentar des d'una URL, que la casualitat
que s'executa en el meu CS50 IDE.
Acabo de començar Apache, posar el meu arxiu JSON allà,
i sóc capaç després a tirar d'aquest dades d'Internet utilitzant
aquesta funció i aquest URL, que és proporcionada pel telèfon.
Està proporcionat per una biblioteca que s'utilitza quan
que està fent alguns iOS desenvolupament d'aplicacions.
>> Cal notar aquí que existeix aquest inusual construcció sintàctica diu guàrdia.
I en realitat tot això és en Swift és una manera de verificar
que hi ha coses que tenen han complert abans
procedir amb la resta de la funció.
Així que podria tenir, usant aquest tipus opcional,
Jo podria haver trobat l'adreça URL executar aquesta funció NSURL
i emmagatzemar en un URL que constant, i després de comprovar
per veure si l'URL va ser nul·la, ja que anava a tornar un tipus opcional.
I si era nul·la, llavors jo imprimir un error i després tornar.
>> Però en canvi, el que permet a la guàrdia nosaltres fem és això mateix,
però assegureu-vos que està realment el cas que URL
s'ha establert correctament NSURL.
I si ho és, llavors salta sobre això, i
li permetrà continuar amb URL haver estat adequadament definit.
Però si és el cas que url no es defineix correctament,
si aquesta funció retorna un error o alguna altra cosa inesperada
que realment passa, aquesta construcció guàrdia ens permet llavors la sortida que l'error
i tornar immediatament.
Sí?
>> AUDIÈNCIA: Així que és una cosa de com un si a continuació, si no?
DONEN ARMENDARIZ: És una espècie de com un si a continuació, una altra cosa, sí,
excepte que aquesta url és llavors definit per a tot per sota d'aquest.
Si passa això guàrdia, llavors realment s'omple de dades
i utilitzables en els restants codi font en la seva funció.
Així que sospito que va a començar a veure aquesta guàrdia també.
I ser conscients.
>> Així que mirant un parell d'una altra coses, això d'aquí és el que,
Què et sembla, només es basa en el que estàvem parlant d'abans?
>> AUDIÈNCIA: Crec que va a executar en la llista?
>> DONEN ARMENDARIZ: Així que és a prop.
Aquesta és una funció que estem definint.
I estem introduint aquesta funció com a argument per a aquesta funció aquí.
>> AUDIÈNCIA: [inaudible] si no és nul.
Així que és a la llista, ¿no?
>> DONEN ARMENDARIZ: Si l'error no és nul·la, de manera que és-- així que he de desplaçar-se.
Bé, anem a veure, no puc realment desplaçar-se a la dreta aquí.
error és un argument que s'està passat a aquesta funció anònima.
Aquesta és una funció anònima.
No té nom.
Però estem acceptant aquests tres arguments, dades, resposta i error.
I va tornar sense efecte, de manera que no va a tornar res.
I aquest és el contingut d'aquesta funció.
I després tenim l'accés dins d'aquest la funció de cada un d'aquests arguments.
>> Així que és un remolí recorregut pel llenguatge.
Però espero que amb això, espero que vostè pren
una ullada a alguns dels tutorials específic per al desenvolupament de iOS amb Swift,
sobretot si vas a Desenvolupador page-- web d'Apple
tenen un munt de molt bona tutorials perquè pugui començar.
Però esperem que només aquesta hora de parlar sobre la sintaxi en si ha donat
prou com per començar amb això.
>> Posarem tot d'aquesta font codi en la pàgina web seminari
tan aviat com sigui possible, i també les diapositives pel que té una referència per a tots aquells.
Però la bona sort amb els seus projectes.
I moltes gràcies a tots per haver vingut.
>> [Aplaudiments]