>> [Música tocando]
>> DAN AMRMENDARIZ: Todos, Benvido ao seminario CS50,
IOS App Desenvolvemento con Swift.
Eu son Dan Armendáriz, e eu son un preceptor de ciencia da computación aquí en Harvard.
>> E a próxima hora será un rápido tour de tanta cousa
sobre este tema como podemos encaixar.
Vou publicar todo o código fonte que vai ver hoxe en liña.
Podemos non ser capaces de de feito, pasar por riba de todo
que eu son que eu son mostrando a vostede nesta hora.
Pero, polo menos, espero que a través os comentarios do código fonte,
vai ser capaz de tratar de descubrir o que exactamente está a suceder para isto
que non moi chegar.
>> En xeral, a estrutura de A charla de hoxe será a seguinte.
Nós comezamos a facer algúns básico sintaxe coa linguaxe Swift,
indo a algunhas das máis avanzado sintaxe da linguaxe Swift.
Porque o idioma é realmente moderno e
ten unha morea de alto nivel recursos, cousas que non teñen
visto en C durante CS50, ou Mesmo algúns dos outros idiomas
que comezan usando en CS50 como PHP,
entón eu vou ter que tentar presentar tamén algúns temas que
están relacionados con linguaxes de alto nivel que non pode ver en profundidade o CS50,
pero vai ver máis tarde clases de informática.
Por iso, vai ser un hermeticamente embalados hora.
E Sinto-se a liberdade de me deixar saber se tes algunha dúbida.
Entón, se vostede está interesado en facer desenvolvemento
con Swift, ou realmente calquera desenvolvemento de aplicacións IOS,
hai un par de requisitos.
Primeiro de todo, ten que estar a usar un Mac, correndo nos exemplos
que imos estar a usar hoxe, relativamente nova versión do VOS
X. Neste caso, eu estou correndo X 10.5.
Podes estar executando 10.11, se queres.
Pero todo o que vai ver se inclúen Xcode 7 e posterior,
que ten a última versión de Swift, que é Swift 2.0.
Esta é realmente unha fermosa distinción importante.
Unha morea de a sintaxe ten cambiou moito significativamente
nalgúns casos desde 1,0 Swift, que foi lanzado o ano pasado,
Swift para 2,0, o que só saíu neste outono.
Entón, nós estamos indo a amosar Swift 2.0.
Unha morea de cousas que buscar en liña
cando está intentando obter adicional información sobre unha variedade de cousas,
pode querer explicitamente buscar Swift 2
en vez de simplemente vello Swift para facer Asegúrese de que comeza a sintaxe correcta.
>> En realidade, este é xeralmente feito.
Hai unha cantidade acelerado de desenvolvemento pasando en lingua Swift
sempre que Apple lanzou iso, eu creo o que, foi un pouco máis de un ano
agora.
E as cousas cambiaron dramaticamente durante ese tempo.
E por iso non se errado se, cando está mirando arredor
para temas sobre Swift ou como realizar algo usando un código de exemplo
ou algo que non fai realmente traballar Swift 2.0.
Asegúrese de que está a buscar especialmente para esa versión
para tratar de minimizar os efectos de diferentes versións e estes tipos de cousas.
>> Vou tentar destacar só algunhas cousas que son diferentes para versións máis antigas.
Pero é algo que atente para.
Isto probablemente vai ser unha das maiores dores de cabeza
que vai ter con Swift é atopar exemplo de código que é máis vello, mesmo só
por algúns meses, intentando usar lo no seu proxecto máis moderno.
E iso simplemente non funciona.
Está a recibir erros do compilador, sintaxe erros, todo tipo de cousas tolas.
Entón, só tes que ser paciente con que, e veña a
ter unha experiencia moi agradable con total Swift.
>> Agora podes realmente join-- e espero realmente aínda ten ese este ano--
Apple app do CS 50 equipo de desenvolvemento, que
permitirá a instalación de calquera aplicación que crea nos seus dispositivos iOS.
Entón bótalle un ollo neste URL se vostede está interesado en facelo.
>> Entón, só tes que un par de cousas sobre si Swift.
É unha linguaxe compilada.
Pero vai ver que algúns os recursos que utilizamos
permiten que sexa usado tamén en algo interpretado como un xeito tamén.
>> Unha boa parte da sintaxe é prestada de C. Baséase e escrito en C.
E por iso imos ver que hai un gran número de takeaways
a partir do seu coñecemento existente de C que pode porta Swift.
>> Pero hai cousas que facelo moi diferente de C.
É moi fortemente tipado.
Hai xestión automática de memoria.
Non vai ter que usar malloc ou en calquera lugar de balde.
Foi deseñado para a xeneralidade.
Polo tanto, noutras palabras, pode usalo en todo tipo de contextos, de Apple Assist
para iPhone todo o camiño ata VOS X, e mesmo algúns servidores, mesmo algúns scripts.
Pero imos ver o que soporte para scripts
non é completamente alí aínda como é noutros idiomas.
Entón, probablemente está a usar este exclusivo para o desenvolvemento
no seu Mac ou iPhone.
>> E ten unha morea de características modernas.
E moitas destas cousas son cousas que imos tratar de resolver hoxe,
pero tamén os nosos temas que, a verdade, podemos dedicar cursos enteiros.
De feito, CS 51, que é preto semestre ofrecido,
céntrase moito sobre estes temas que son descritos a continuación.
Así, pode pasar un semestre enteiro comprender estas cousas.
Pero nós imos tratar para pasar por eles
polo menos o suficiente para que pode entender o que é
pasando cando mira a un programa Swift
e ser capaz de cortar o seu camiño través del para o proxecto final.
>> Agora, unha das mellores formas que pode obter información adicional sobre este
é francamente só a través de Apple proporcionada documentación para Swift.
Hai unha morea de APIs que están dispoñibles.
E esta é unha boa base para ti a ollar para cousas específicas que
queren facer unha API que inclúen IOS.
Se quere usar a cámara para exemplo, pode comezar a ollar aquí,
e tamén usar Google e Stack Overflow como faría normalmente.
>> Calquera preguntas sobre esa antes de ir para a dereita?
Todo ben.
Imos seguir adiante.
>> Entón, primeiro, eu teño un número de ficheiros de exemplo.
E eu vou tentar a etapa a través deles de forma relativamente rápida.
Este é o arquivo Ola Mundo para Swift.
É moi sinxelo.
Non hai xeito máis comentarios que existen código real.
Teña en conta o código real está fondo na liña 14.
Di impresión.
E entón é unha chamada de función.
Estamos pasando a cadea chamada Ola CS50.
Teña en conta que non hai ningún punto e coma.
Teña en conta que non hai ningunha int main.
Hai ningún dos cruft que tivemos con C.
Cando estamos usando Swift, deste xeito, que é só escrito nun ficheiro de texto
e almacenados no meu computador, a continuación, I pode recompila-lo e executalo.
>> Lembre que aquí son non usar o IDE CS50.
Isto supón que eu son execución e que eu estou no VOS X,
e que eu Xcode xa instalado nesta máquina para que este
para realmente función.
Pero este é só un ficheiro de texto normal que pode entón compilar e editar.
Entón, imos ver como isto realmente funciona.
E se eu queira recompila-lo?
1.swift swiftc.
Despois dun momento ou dous, Vai ver que temos agora
compilado iso nun arquivo chamado 1.
E agora nós imprimir noso CS50, nosa aplicación Ola Mundo en vez.
>> Observe outra cousa como ben é que, por defecto,
nós non temos a entrada A / N para imprimir unha nova liña.
Por defecto, a función de impresión en Swift imprimirá unha nova liña para ti.
Pode pasar un adicional opcional parámetro para dicir que non facelo.
Pero Google para obter máis información sobre o tema.
Por defecto, que vai facer a liña de impresión.
>> Todo ben, entón imos seguir adiante a continuación, para algunhas outras cousas.
Entón, como podemos realmente definir variables?
Podemos facelo é utilizando un dos dous métodos.
E o que quero dicir a vostede sobre a primeira é esta definición let.
E iso é importante porque efectivamente
o que estamos facendo é definir unha constante.
Nós imos crear unha variable, ou mellor, un chamado nome de constante,
proporcionar-lle algunhas data-- en Neste caso, a secuencia de Dan.
Pero usando este let contrasinal, estamos dicindo
que esta é variable-- constant-- chamado de novo
nome non vai ser modificado.
Será inmutable ao longo a duración deste programa
ou en todo o duración do contexto
que esta variable é dispoñible.
>> Isto é realmente importante que, cando tes algúns datos que non é
cambiará no seu programa, e podes ver unha variedade de exemplos
de como queremos usar deixe versus a outra sintaxe,
é importante que use deixar sempre que sexa posible, xa que esta notifica
Idioma que é non vai ser modificado,
e pode realmente facer unha morea de optimizacións
para mellorar a velocidade e a seguridade do seu programa.
E por seguridade, non significa deixá- falla con erros de tolos
para que sexamos afeitos ver en C.
>> Entón, podemos utilizar interpolación de cadea para encapsular que dentro dunha cadea.
Así, podemos ver neste liña de impresión, imprimir Ola,
e logo usando barra invertida parénteses abertas, e, a continuación, o nome do meu variable,
neste caso constante, pechar os parénteses.
Estou esencialmente, a continuación, poñer o contido deste nome variable chamada
dentro da corda e, a continuación, imprimir o resultado alí.
>> Hai outra modificación a este ficheiro que é o que eu teño, na parte superior,
poñer nunha liña shebang, que basicamente só especifica
que quero usar o Intérprete Swift, que
significa que eu non teño máis para compilar este programa particular.
Podo só executa-lo como o seu propio guión.
Pero esta é, neste caso, por tras as escenas sendo compilados e, a continuación,
en execución.
É só invisible para nós.
>> Todo ben, entón imos seguir adiante.
Polo tanto, hai un pouco de malandragem que só aconteceu antes.
Mostre-lle que eu É posible axustar unha constante.
E eu podería proporcionar algúns datos para facelo.
Pero, neste caso, repare en que eu non fixen de feito, especifican o tipo de datos
que é.
E iso é porque o compilador, pode Swift
inferir o tipo de datos só en base sobre os datos que eu poñer nel.
Porque sabe que por avaliar este variable aquí, ese dereito de datos
aquí, el sabe que é unha cadea.
E así este nome constante é, polo tanto, vai ser unha cadea así.
>> Pero tamén pode ser explícita sobre o tipo que é
imos usar para constantes ou variables
usando esta sintaxe instead-- deixe de Cordas nome colon igual
Dan, que neste caso significa que estamos vai definir un nome chamado constante.
Será do tipo cadea.
E o valor será Dan.
Agora outra forma que podemos crear variables--
e estes son variables mutables, que significa que estamos, de feito, vai
para cambiar o seu contido nalgún momento da duración do contexto
que esa variable é defined-- nós usar a palabra chave var, no canto de deixar.
Pero, de novo, por defecto, se non sabe que precisa para manipular eses datos,
proba a usar para deixar melloras de rendemento.
>> Neste caso, podo, entón, especificar o tipo de datos
que esperamos estar dentro esta nova variable chamada etiqueta.
Vai ser unha cadea.
E nós estamos indo, a continuación, concatenar dúas cordas en conxunto, a cadea Ola,
ea cadea representada pola variable, ou mellor, o nome constante.
>> Entón, iso é bo porque esta está un tanto como PHP en que
ten moi fácil concatenación.
Non temos para automaticamente utilizar calquera tipo de xestión de memoria
para aumentar o tamaño e facer calquera tipo de cousas divertido alí.
Isto funciona como sería de esperar, en realidade.
>> Todo ben, calquera dúbida sobre este?
>> Agora, a outra razón que necesitamos ter a capacidade
para poder establecer o que tipo de variables de datos son
é porque ás veces non o facemos quere arrincar variables
con algúns datos no punto de definición.
Polo tanto, neste caso, por exemplo que quero comezar a introducir
algunhas notas nun libro de notas.
Ben, eu sei que un dos variables que quero ser
vai ser unha clase mutável.
E tamén sabemos que quero que sexa un enteiro.
Pero quizais nós non facemos aínda ten ese grao dispoñible.
>> En Swift, ten que definir o tipo de datos
que está asociada cun variable ou unha constante deixar
antes de que poida realmente usar esa variable.
Porque é fortemente tipado, ten que asociar un tipo de
con estas variables.
>> Polo tanto, neste caso, se eu non teño propiamente iniciar o primeiro con algún valor,
entón eu teño que dicir que Swift Espero que o tipo de datos a ser.
E vai permanecer que mesmo tipo de datos
ao longo da historia deste programa.
>> Agora podes ser tentado polo que Eu creei esta variable grao
e sempre que un número enteiro de 100, agora si
quero tentar concatenar unha cadea con este completo,
pode ser tentado a usar aínda ese operador de concatenación de cadeas
como fixemos só algunhas liñas antes.
Pero, desgraciadamente, que realmente non vai
traballar, porque é esencialmente executando
unha operación en dous tipos diferentes.
>> Agora iso é moi diferente doutros linguaxes como PHP que son realmente
goosey loosey co seu tipo de tipos.
Están só lle gusta, si, calquera que sexa, eu non me importa.
Só me dea un tipo, e quizais eu vou facer as cousas ben.
>> Neste caso, é Swift moi rigoroso sobre os tipos
que está lidando.
Este operador sumatorio ou operador de concatenación
ten esencialmente un par de diferentes opcións posibles.
Podes facer sumatorio con números enteiros, ou
pode facer concatenación de cadeas, e quizais algunhas outras cousas tamén.
Pero se ese titular non recoñece o que é en ambos os dous lados do mesmo,
ou mellor, a combinación dos dous tipos, non é o que está esperando,
a continuación, que vai causar un fallo.
>> Polo tanto, neste caso, o que significa para ter unha corda máis un número enteiro?
Ben no contexto tanto, nós probablemente quere
a facer unha operación de concatenación de cadeas.
Pero está claro que o ordenador non ten este tipo de contexto.
E por iso necesitamos proporcionar que a información adicional
para deixar saber o que é que queremos facer.
>> Así, noutras palabras, o feito que Swift é fortemente tipado
significa que ten que facer un pouco de traballo adicional
para obtelo para controlar o forma que desexa.
Porén, como resultado, é máis seguro.
E unha vez que ten tomar en conta os tipos,
cousas só francamente comezar funcionar moi ben.
>> Polo tanto, neste caso, nós, a continuación, vai executar concatenación de cadeas
por filtración explicitamente o enteiro para unha cadea
por envolve-lo neste capital de función S cadea,
e logo a través da concatenación operador para modificar a nosa variable etiqueta,
e, a continuación, imprimir lo.
>> Tan lonxe, tan bo?
Todo ben, imos seguir adiante.
>> Agora, hai unha variedade de datos tipo que podemos utilizar en Swift.
Como se acostumaron a, podemos crear unha matriz mutável.
E esa matriz só pode conter un único tipo.
>> Polo tanto, neste caso, nós estamos indo a crear un mutables matrices de enteiros, o que
imos chamar graos, e seremos capaces para almacenar que neste paréntese
formato que creceu acostumado a en unha variedade de outras linguaxes.
Pero teña en conta que aquí estamos definindo un par de cousas.
clases é un variable-- mutável non utilizar a palabra chave let.
Entón iso significa que podemos modificar para o contido desta matriz.
É do tipo Array Int, e podemos dicir que
con base neses corchetes aquí.
>> Agora, unha das cousas agradables sobre iso é que nós
teñen acceso a unha gran cantidade de Información adicional
sobre a matriz usando só algúns notación de punto simple.
Así, por exemplo, grades.count ofrece para nós
o número de elementos que hai nese array, que pode, entón, acceder fermosa
facilmente usando simplemente que a notación de punto.
>> Se queres engadir adicional elementos para esta matriz,
non pode facer o estilo PHP onde acaba de establecer explicitamente,
a un dato índice, un valor que quere inserir.
Pola contra, usa o acréscimo método no tipo de matriz
para engadir este elemento, 95, a esta lista.
>> Entón agora esa matriz ten a seguinte contents-- 100, 0, 90, 85.
E agora temos engadido 95 para que, como ben.
>> Hai outras formas Podemos engadir cousas.
Pode realmente usar un operador de suma,
que será interpretada como unha operación de matriz de datos anexados.
E pode logo engadir outro array, cuxo contido é de 70 e 80,
para esa matriz.
Polo tanto, agora temos o contido deste variable
grades-- 100, 0, 90, 85, 95, 70, e 80.
Este é só un pouco agradable sintáctica azucre que Swift ofrece para nós.
>> Polo tanto, se queremos sumar o graos, estamos quizais
Vai querer facer unha iteración sobre cada elemento neste loop.
E nós temos, con Swift, a noción dun loop for como sería de esperar.
Pero o camiño que nos indicamos un intervalo é un pouco diferente.
Polo tanto, neste caso, a Resumindo todo, imos
vai crear un temporal chamado suma variable para que
para manter esta conta.
>> E teña en conta o noso para construción de loop aquí.
Para o índice en 0 .. <grade.count.
Polo tanto, esta construción, 0 .. <grades.count é unha operación de alcance onde estamos
dicindo que imos crear unha gama de números enteiros de 0 ata
ata, pero excluíndo grades.count.
Polo tanto, este será de 0, 1, 2, 3, 4, 5, ata porén moitos un
antes grades.count.
>> Polo tanto, esta é diferente de como nós normalmente usado para loops
onde tería algún índice variable, axuste-igual a 0 no primeiro,
e entón integralas que ata algúns valor menor que a conta de elementos
nese array.
>> Polo tanto, hai unha modificación para isto, en realidade,
o que nos permite moi facilmente definir distintos tipos de intervalos.
Se altera este intervalo para tres puntos, 0 ... grade.count,
esta representa a gama 0 para grades.count inclusiva,
o que significa que este número é tamén entón incluídos nese intervalo.
>> Pero iso é moi útil para estas cousas exactas,
cando temos que executar iteracións máis de lazo
porque eses índices son indexados cero, como vimos noutros idiomas
ben.
Calquera preguntas sobre esa cara loop?
>> Polo tanto, non hai definición implícita desta variable índice,
cuxo valor comeza en 0 e segue a cada iteración do bucle
a un aumento de 1 ata un punto que é igual a grades.count,
punto no cal, o loop aborta.
>> Teña en conta que, na nosa cadea interpolación aquí,
podemos realmente realizar algunhas simple manipulacións a eses valores.
Así índice máis 1 vai realmente realizar unha suma dese valor
porque o índice é, en Neste caso, un número enteiro.
E nese punto, que vai a continuación, ser convertido nunha cadea
e interpolados para esa secuencia aquí, e impreso como sería de esperar. .
>> E a cousa agradable sobre as matrices aquí é
que tamén somos capaces de ter valores obter valores de axuste
usando a notación paréntese como vimos noutros idiomas tamén.
>> Todo ben, entón a partir de aquí, podemos agora calcular a suma de todos os tipos.
Agora tipo do seguinte paso lóxico sería
para facer unha operación de división para atopar a media destas notas.
Pero algo importante aquí que está a acontecer
é que este importe é, quizais, un número enteiro.
Pero precisamos realizar algunha especie de división de parella.
E iso vai ser moi importante cando
queremos realizar esta operación, porque o que estamos dicindo
é que necesitamos, en realidade, realizar a división en dúas dobres.
E, de novo, porque Swift está fortemente ingresaran,
debemos definir explicitamente toda a elementos para dúos antes que efectivamente
realizar a operación.
>> Entón, para nós realizar a división de matrimonio,
non é suficiente para só un destes elementos a ser unha parella.
Ambas partes teñen que ser un dobre, para swift
para estar seguro de que este é o que queremos facer.
Entón, imos, entón, explicitamente typecast a suma que temos calculado anteriormente
ea conta de notas para dúos, e a continuación, realizar esta operación e almacenamento
que para esta nova variable, ou mellor, esta nova constante chamada media,
que terá que tipo, imaxina?
Dobre, si.
Polo tanto, neste caso, nós Non ten que especificalo lo
porque pode ser detectada a partir da operación que tipo de datos media
será.
E Swift é xeralmente moi bo sobre ser capaz de inferir tipo.
>> Quere ver este executar, ou podo seguir adiante?
Quero continuar.
Calquera preguntas sobre nada diso?
Gran.
>> Agora imos comezar a chegar a as boas funcións definidoras stuff--,
e un par de outros tipos que son Swift exclusivo para que non tes
visto noutros idiomas ata este punto,
pero que están presentes en calquera linguas que se pode atopar máis tarde.
Entón, primeiro, se quere para definir unha función,
vostede define-lo coa palabra funk función e, a continuación, o nome da función,
e, a continuación, entre parénteses, os argumentos que quere que a función de aceptar.
Os argumentos deben tamén specify-- generally--
Tamén debe especificar o tipo de datos que son, salvo que poidan ser inferida.
E veremos que pouco excepción en só un pouco.
>> Polo tanto, neste caso, temos un función chamada printGradeCount.
Estamos indo para aceptar unha variable-- ou mellor, neste caso,
un constant-- chamado gradebook.
E iso vai ser de escriba array de enteiros.
Agora hai algo que é realmente importante aquí
que quero que entenda.
Iso é que, por defecto, estes argumentos que son entradas para esta función son
definido cunha contrasinal let implícita, o que significa que eu non podo modificar este
variable gradebook aquí.
E que tipo de ten sentido, porque está pasando datos in.
E quizais non queres que a cambiarse desde debaixo de ti.
Pode mencionar explicitamente que esta é unha variable, poñendo
a palabra clave aquí var.
Pero iso é unha pegadinha que temos As persoas notaron facer no pasado
é que asumiron que vai para ser unha variable cando, en realidade,
é unha constante.
>> Todo ben, entón aquí, entón, neste caso, Non estamos especificando calquera tipo de retorno.
Imos amosar-lle como fazê- que en só un momento.
Pero teña en conta que temos aquí só un simple caso condición.
O libro de notas é baleira, que neste caso
é só a propiedade desta enteiro array, entón nós imprimir algo.
Se non, facer outra cousa.
>> Moi sinxelo, ata agora eu creo.
Pero me deixar se ten algunha preguntas.
>> Agora esta función, medio, tamén leva algúns argumentos, ou mellor, un argumento,
que é o libro de notas, e esta vez vai voltar un tipo de matrimonio.
Porque está computando a media e é
vai volver, de feito, que media calculada para a liña de chamada.
>> Neste caso, especificamos o tipo de retorno tras unha frecha.
E iso pode sentirse unha especie de estraño ao principio.
Creceu acostumado para definir o retorno
escriba antes do nome da función.
Pero se pensas deste en termos de matemáticas,
como cando ten as matemáticas que definen unha función,
ten unha función con algúns insumos, e produce unha saída.
E iso é o que isto se quere imitar.
E hai un par de outras linguas que ten unha sintaxe semellante, así como,
pero probablemente ninguén que xa viu en CS50.
Pero aínda non ser confundido por el.
A frecha significa que está a suceder sendo devolto neste caso.
OK, entón como é que imos para calcular esa media?
Ben, se o libro de notas está baleiro, ben, entón estamos
vai voltar 0, o que quizais unha forma razoable de trata-lo.
Non sei, imos chegar ao que, en un pouco.
Isto non pode, de feito, ser un xeito razoable
para calcular unha media se temos un libro de notas baleiro.
>> Entón imos realizar o noso sumatorio.
Lembre que aquí estamos, en realidade, ten unha versión alternativa dun
loop for, o que nos permite facer unha iteración sobre cada elemento nunha matriz
e que cada elemento na súa propia variable.
Ao especificar para o grao en gradebook, o que estamos dicindo
é que nos imos implicitamente crear un novo constante chamada
grao que vai representar cada elemento único no gradebook
cada vez que o lazo for.
Así, a primeira vez que é executado, o grao será
ser o primeiro elemento no Boletín.
A segunda vez que vai ser a segundo elemento, etc. etc.
ata gradebook ten se exauriu de elementos.
Entón, imos ser capaces de resumir que grao na nosa variable sumatorio
e volver a nosa media como vimos antes.
OK, as preguntas?
Si?
Audiencia: Teño dúas preguntas.
Número un, hipoteticamente, pode corre enteiro nun presente?
Non ten que ser un parella, que é correcto?
DAN AMRMENDARIZ: Pode repetir esta pregunta?
Audiencia: Podo facer enteiro como a media?
DAN AMRMENDARIZ: Pode facer enteiro como unha media?
Entón voltar un enteiro media en vez dunha parella?
>> Audiencia: Return-- vostede teñen ese dereito agora continuación.
DAN AMRMENDARIZ: Ben aquí, volver 0.0?
Audiencia: É, simplemente voltar 0.
Polo tanto, tanto 80 ou 85, pero non 85,2.
>> DAN AMRMENDARIZ: Entón, nese caso, polo que hai un par de formas diferentes
para responder a iso.
Déixeme responder a eles en orde.
Entón, se eu só facer este retorno 0, un 0 é un valor enteiro.
E así que pode causar un Tipo de erro para este caso
porque está esperando unha parella pero é, entón, retornando un enteiro.
Se eu queira voltar un enteiro, podo.
Podo configurar o tipo de retorno para int, regresar 0 aquí,
e non realizar a división de parella.
Pero entón estariamos facendo a división enteira.
E por iso, entón non vai recibir o media que posiblemente sería esperar.
Pero si, podemos modificar tipo desa forma.
>> Audiencia: E en segundo lugar, ten un dobre na parte superior.
Pero alí embaixo, cando facer retornar Dobre,
que xa está automaticamente retornando formato dobre.
Por que aínda que define-lo coa frecha na parte superior cun dobre?
>> DAN AMRMENDARIZ: Entón, no caso, isto é parte
as-- para repetir a pregunta, porque é implícita dende o retorno
tipo aquí, que tipo que realmente é, necesitamos ser explícito con Swift
sobre o que queremos volver para fóra desta función
de xeito que, cando se realiza tipo a comprobación, pode que seguro
que o que realmente escrito a continuación, en realidade, está de acordo con iso.
Entón, é como unha especie de cheque consigo mesmo tipo de situación.
Pero hai é--
>> Audiencia: [inaudível] arco?
>> DAN AMRMENDARIZ: hai casos en que podemos especificar que podemos implicitamente
definir o tipo de retorno.
Pero, neste caso, non creo que ía funcionar.
Hai algunha outra sintaxe que veremos máis adiante.
>> Todo ben, entón esta fonte código é un pouco diferente
porque este analiza argumentos de a función que estamos chamando.
Deixe-me amosar-lle como funciona antes de que realmente seguir adiante
para algunhas cousas interesantes que está a suceder na Swift.
>> Polo tanto, neste caso, se eu executar este código, teña en conta que o que está facendo
mentres é--, que tipo de dáme un erro estraño.
Necesito pasar un par de enteiros como un argumento de liña de comandos.
Entón imos ver, 150 e 80, e prema Intro para descubrir o que está realmente facendo.
É aceptar cada un dos estes valores como enteiros.
É de inserir-las nun libro de notas.
E entón el está executando que o cálculo da media
e saída que como era de esperar.
>> Pero, obviamente, hai algo suceder con ese rexeitar algo
algo así como un enteiro.
Como pode lembrar de cando eramos tratar con argumentos de liña de comandos
en C e outras linguaxes, a primeira 0-th artigo no que o argumento da liña de comandos
lista é o nome do comando que realmente executado.
Polo tanto, neste caso, só estou looping sobre todo os argumentos de liña de comandos.
Pero eu non estou facendo todo tipo de fantasía vaia ir sobre aquel primeiro.
Eu son só explicita ou implicitamente que eu son comprobar que un destes tipos
son enteiros antes de realmente realizar este cálculo.
>> E iso é esencialmente o que está pasando aquí.
Para cada argumento en os argumentos do proceso,
Eu estou indo a realizar algunha comprobación.
E neste caso, eu vou para tratar de primeiro convertido
ese argumento nun número enteiro por realizar unha conversión de tipo explícito,
porque é, na entrada, unha cadea de caracteres e non no feito de un número enteiro.
>> Pero este é un tipo de sintaxe estraño, deixarse ​​de grao é igual a Int (argumento).
O que está realmente a suceder aquí é moi
importante para o seu uso Swift.
Isto é por que é chamado de tipo optativo.
>> Entón esta función, Int (argumento), non só retorna un enteiro, mais retorna
o que se chama un enteiro opcional.
E así se trata dunha especie de un tipo enriba dun tipo.
Podes imaxinar que tipo de como está retornando como un paquete.
E cando abrir ese paquete, quere
ten un número enteiro, o que é o resultado, é non ten absolutamente nada nel en todo.
E iso é útil como unha comprobación de erros mecanismo, porque neste caso
podemos descubrir, foi esta conversión de tipo exitoso?
Se foi, a continuación, é de feito vai ter un número enteiro dentro.
Se non, vai ter algún valor que imos chamar nulo, é dicir
é representativo de calquera número enteiro de todo.
Realmente representativo de nada.
>> E así esta construción se permítenos a desembrulhar ese paquete,
que de conexión opcional.
E se somos capaces de desembrulhar que embalaxe e atopar un número enteiro dentro,
entón o que estamos dicindo aquí é que imos, entón,
facer que o valor a ser definido esta constante chamado grao.
E esta parte do if, a parte superior da instrución if
levará a cabo, porque iso desembrulhar foi un éxito.
>> Se iso só acontece que houbo un erro, quizais,
neste tipo de conversión explícita a partir dunha secuencia de caracteres para un número enteiro, quizais
é o valor ABC por exemplo.
E iso é realmente non vai para converterse nun enteiro.
A continuación, el volverá nil, que non é un número enteiro.
E esta declaración se ben, entón falla.
grao non existirá porque non ten ningún contido enteiro.
E será executado este bloque novo.
Si?
>> Audiencia: Nil é N-I-L?
DAN AMRMENDARIZ: nil é N-I-L, si.
>> Polo tanto, este é quizais un dos cousas máis difíciles de Swift,
especialmente cando se está en as herbas daniñas nunha aplicación IOS
e está realmente intentando para facer un desenvolvemento alí.
Estará gritando en ti sobre opcionais.
Será pregunta para vostede puntos de interrogación e puntos de exclamación.
Pero unha vez que descubrir se out-- dedicar moito tempo para descubrir
o que está pasando cos tipos de opcionais, vai gardar unha chea de dor de cabeza
como estás escribir unha aplicación Swift.
>> En realidade, é un recurso moi poderoso.
E vai ter que tomar miña palabra para ela por agora.
Pero imos ver esa construción e algúns outros como
nalgunhas das outras código fonte que imos amosar-lle en só un pouco.
>> Existen dúbidas iniciais aquí?
Así, o importante é que estaladiça un Tipo opcional é unha especie de metatype.
Ou ela ten un valor, e se isto acontecer, el
quizais teña que valor asociado con el, ou ela non ten valor algún,
e é representado por nulo.
O resto esta é quizais como sería de esperar.
>> Entón, imos rampla ata o dificultade máis dunha vez.
E esta vez, imos dar un ollo a algunhas outros tipos de datos que realmente existen.
Un deles é dicionarios, que é moi semellante ao dicionarios Python.
É un pouco semellante a unha táboa hash C. É, esencialmente, un mapa de teclas
onde as claves poden ser cadeas.
E cando mira cara arriba esas claves, aquelas claves terán un valor.
Polo tanto, non é unha real orde, pero no seu lugar, máis estreitamente asociados
a un mapa de hash ou unha táboa hash.
>> Imos ver como isto se quere para traballar antes de que efectivamente
ir ao propio código fonte.
Se eu executar este, nada realmente acontece.
Está me dicindo que eu estou esperando algúns parámetros de tipo seguinte.
Entón, eu estou indo a proporcionar a que algúns nomes conxunto de problemas,
pset0 así, quizais eu teño 100.
E pset1, eu teño a 5.
E entón o exame, eu fixo moi ben e conseguiu 30.
E oops, eu bati un espazo aquí.
>> Cando prema Intro, podes ver el realiza algunha computación.
Di gradebook é de tres notas, pset1, pset0, exame.
E o libro de notas ten esta media específica.
Entón, de novo, estamos a traballar con esta idea gradebook,
pero imos seguir iteración coa complexidade da nosa función.
>> Entón, en principio, somos só vai crear unha función que
é responsable de imprimir o seu uso.
E hai esa saída función que será só
forzosamente saír da aplicación.
Isto non é algo que vai empregar en iOS app.
Esta é só neste caso cun argumento da liña de comandos.
A continuación, imos comezar a moverse cara Xcode.
Pero esta é específica para un comando programa de estilo de liña en Swift.
>> Imos dar un ollo a algunhas das as cousas interesantes aquí.
A ver, só un par de cousas interesantes para falar quizais
é que na miña función de imprimir o número de graos,
ten que se lembrar que eu tiña que lista de pset1 itens--, pset0, e exame.
Realmente pode rapidamente e facelo facilmente
tomando o libro de notas, que é un dicionario que ten claves e valores.
Atopar todas a clave é a través o método de puntos claves aquí,
e, a continuación, usar este joinWithSeparator, que, entón, tomar todas as claves
que tiñamos escritas ou pset1-- Sentímolo, pset0, pset1, e exam--
e concatenar-los xuntos usando unha coma e un espazo
para crear unha cadea longa.
Esta operación de unión é só fenomenal útiles nunha variedade de contextos.
E así é esta joinWithSeparator.
>> E iso é algo que é Swift modificado de 1 a 2 SWIFT.
Adoitaba haber un Style-- Python se é
familiarizado con Python-- un Python estilo xuntar método en cadeas.
Pero isto non é máis o caso en Swift 2.
Quere usar isto se quere para concatenar unha serie de cousas
xunto cunha corda.
>> Polo que, se cadra, a continuación, na nosa discusión de medio antes,
fai algo máis de sentido para nós para definir a función media
para ser un dúo opcional no canto que só unha parella explícito.
Porque tivemos que condición inusual, onde,
o que en realidade se gradebook non ten valores dentro del?
Cal debe ser o retorno medio?
>> Ben, quizais en C ti faría algo
como forneceu un valor de sentinela, como 0.0, ou que un número negativo,
ou só algo que representa o feito de que había algunha condición de erro
e quizais non teñen efecto a capacidade de calcular esa media.
Ben, a beleza de especificar un opcional tipo sería facelo.
E eu digo agora todas estas palabras, pero iso realmente non usa opcionais.
Pero imos ver iso en só minutos onde podemos definir media
ser un tipo de datos de xeito que opcional se realmente retorna algúns datos, a continuación,
imos voltar estes datos.
Se non, imos volver nil, dicindo que este
Non ten computación significativa.
>> Imos pasar a outra cousa.
Así, a partir de aquí, nós estiven mirando todos estes exemplos na liña de comandos.
Pero realmente o que está indo estar lidando con é Xcode.
E unha das cousas agradables sobre Xcode é, e especialmente en Swift,
é que temos esta cousa chamada un parque infantil.
E un parque infantil é non é de todo unha aplicación iOS.
Pero permite que a probar con Swift dun xeito moi doado.
Podes escribir todo o seu código.
É ben sintaxe destaque aquí.
Cando se crea un novo ficheiro, ha pedir se quere crear un campo de xogos.
Pero a cousa agradable sobre o campo de xogos é que na parte dereita da súa xanela,
realmente amosar-lle saída do seu código.
Entón, se eu rolar para abaixo, podemos ver que a saída de varias liñas de código
de feito pasa a ser.
>> Polo tanto, neste caso, imos cambiar de dirección só un pouco
e falar de algo que é realmente importante deste xeito alto nivel
Swift que opera, e é esa idea de clausura.
E probablemente xa viu este un pouco en JavaScript.
Para aqueles de vostedes que están en CS50, peches
son moi populares xeito moi boa de facer, cousas de alto nivel en linguas modernas.
Pero é tamén unha especie de difícil romper a cabeza en torno ao primeiro tempo.
Entón, se ollar para este primeira vez, iso é OK.
Basta ollar para o código fonte e vexa se pode descubrir iso na casa.
>> Polo tanto, neste caso, imos dicir que nós quere crear unha morea de expoñentes
con algún valor fixo.
Polo tanto, neste caso, podo crear unha función.
Vou chamalo de poder de 2 propósito cuxo único na vida
é tomar algunha entrada e dobre del, e voltar ese valor.
Lembre que aquí estou eu aceptar un tipo de datos.
Vai ser unha variable chamada x.
É do tipo Double.
E eu estou indo a retornar unha parella aquí.
E eu estou indo só para facer moi, francamente, moi
xeito inxenua de duplicar esta cifra.
E eu vou te amosar por que isto é útil en só un segundo.
>> Teña en conta que aquí temos esa gama de novo. para algo en 1, punto
punto a punto, 2, o que significa que este lazo levará a cabo dúas veces.
Pero iso representa unha variable dummy.
Isto significa que eu non estou indo realmente para estar usando esa variable en calquera lugar
no interior deste circuíto.
Eu só quero que esta liña de código para ser executado dúas veces,
sen precisar saber o valor do dito período.
>> Polo tanto, neste caso eu estou correndo resultado veces x dúas veces e que, esencialmente,
significa que eu estou en cuadratura con este valor.
E isto ocorre con traballar como sería de esperar.
Potencia de 2, pasando un valor de 2.0 ofrécenos unha saída de 4.
3.2 obras para 10,24.
>> Agora podemos facer un semellante cousa de poder, de 3.
Pero agora cambiar só o intervalo.
Para dummy en 1 a 3, multiplicar 3 veces,
e facer o mesmo.
>> Polo tanto, este pode sentirse un pouco artificial.
Pero hai unha importante cousa aquí que
é que mirando para estes dúas funcións, hai
só unha cousa que é diferente, que é o valor no rango.
Todo máis sobre estes dous funcións, potencia de 3 e potencia de 2,
son, de feito, idénticas porque funcionan do mesmo xeito.
>> Entón, neste momento, un pouco campá de alarma debe ser a saír.
Esperemos que o que está dicindo, vostede sabe, este se sente un pouco
como a duplicación de esforzos.
Se houbese un xeito que eu faría poder encapsulado todo isto
e proporcionar unha función ou crear unha función que
fai exactamente o que quero, sen a necesidade de escriba-la explicitamente.
E iso é o que o poder dun peche nos permite facer.
Entón, imos dar un ollo niso.
E eu vou pasar un par minutos a esta, porque esta
é moi importante para a Swift.
Vémolo o tempo.
Imos definir unha función.
Será chamado powerof.
Vai aceptar un parámetro chamado y do tipo Int.
Pero bótalle un ollo ao tipo de retorno.
O tipo de retorno é, na parénteses, Double frecha dobre.
O que significa que esta función, powerof esta función,
está retornando dunha función.
Isto está aceptando unha parella e retornando un dobre.
De xeito que pode parecer medio tolo, pero imos rolar para abaixo un pouco
e mirar a ver que pasa.
Estamos dentro desa función powerof.
Estamos creando unha nova función chamado exponentiator,
pero non importa o que é.
>> Teña en conta que este ten un valor de entrada de x.
E está levando nunha doble e retornando un dobre.
E isto é o mesmo código que viu anteriormente, agás que o valor de 2
ou o valor de 3, de que límite superior do intervalo,
foi substituído este valor de y, que
foi o parámetro de inicio da nosa función powerof.
E, neste punto, nós voltar exponentiator.
Estamos volvendo a función.
>> É como unha especie de pequena mente blowing.
Pero imos imaxinar o que acontece cando chamar esa función powerof
e pasar el algún valor como 2.
O que isto significa que Agora teño o valor
2 para y, o que significa que o valor y nesta función exponentiator
será que o valor 2.
Pero eu estou volvendo este exponentiator función.
>> Entón, teña en conta o que Swift di que eu crearon neste caso.
deixe praza é unha definición, é unha función que acepta un dobre
e retorna un dobre.
Eu creei unha función que algo cadrados
mediante este mecanismo aquí.
E realmente o que está pasando é que está retornando esta función
exponentiator, pero este valor y está implicado dentro del.
E entón agora cada vez que eu usar este esta variable ou constante chamada
praza, que vai a comportarse como unha función.
E para que eu poida, a continuación, chamar esa variable como eu chamaría dunha función,
e pasala a un número, como neste caso 3.
E eu, entón, conciliar ese valor.
Entón, a continuación, 3 ao cadrado chegar a ser 9, como vemos aquí.
>> Realmente tolo, pero iso agora me permite a oportunidade
para crear outras funcións powerof.
Como podo dicir, OK, ben, agora quero para crear unha nova función, powerof (3),
e almacenar iso nun chamado cubo constante.
E agora cubo será un función separada que, a continuación,
levar moito valor como entrada e cubo que valor, como vemos na liña de fondo
aquí.
cubo de 2 vai producir 8.
>> Esperemos que cousas moi ordenado.
Nunca viu iso antes.
Estimula-vos a ollar para peches e investigar isto un pouco máis.
É unha cousa realmente poderosa vemos unha morea en JavaScript e outras linguaxes.
Realmente vital para APIs comprender ben
que nós imos chegar a en só un segundo.
Si?
>> Audiencia: Cando fai powerof (2), parénteses, e, a continuación
outro paréntese, outro input-- basicamente está substituíndo a praza.
DAN AMRMENDARIZ: Entón mire na última liña aquí.
En realidade, é totalmente posible facelo fío como suxeriu.
Entón powerof (5) significa que imos ter un exponentiator de 5 ata aquí.
Polo tanto, este é esencialmente será o mesmo que 4 para o quinto poder,
porque creamos un exponencializando funcionar ao quinto poder,
e estamos pasando para que funciona o valor 4.
E nós temos ese valor que esperamos, 1024.
Audiencia: E non é un nomear, polo que fai máis doado
a ler, a praza que sexa.
>> DAN AMRMENDARIZ: Correcto, exactamente.
Entón, antes de poñer-la nunha constante aquí para
que fixo doado de usar ese nome.
Si?
>> Audiencia: Neste contexto powerof, é parte
da linguaxe de programación en oposición á forma como
pensar en powerof en [inaudível]?
DAN AMRMENDARIZ: Entón, Neste caso, powerof
é simplemente o nome do función que eu definido aquí enriba.
Polo tanto, non é inherente á propia linguaxe,
mais en vez diso, é só unha función que posúe
ese nome porque darlle ese nome.
Algunha pregunta?
Todo ben.
>> Agora, iso é gran.
Pero non vai ver un serie de funcións de peche que
son coma este onde define, dentro dunha función, outra función.
E pode facelo.
Pero non é o tipo de realmente necesario, non?
Por que eu definir esta función chamada exponentiator
e, a continuación, devolve-lo inmediatamente.
Por que non podo só inmediatamente volver esa función?
>> E, de feito, este é precisamente a idea detrás de un concepto chamado
funcións anónimas, onde funcións anónimas en realidade non
ten un nome, porque Non é necesario ter un.
E así, neste caso, en 7B, podemos atopar exactamente o que.
É todo o mesmo código, fai exactamente o mesmo,
pero agora nós cambiamos-lo un pouco para que esta función powerof inmediatamente
retorna unha función.
Teña en conta que tras o regreso, hai un paréntese aberta.
Está esperando esta entrada dobre.
Está esperando que a saída de parella.
E, a continuación, o seu contrasinal separa o código en si.
Polo tanto, esta é unha función anónima.
En realidade, non ten un nome, mentres antes de ser chamado exponentiator.
Pero, como vimos, só realmente non se refería a exponentiator
fóra desa función.
Por iso, non importa.
Polo tanto, esta función anónima é así chamado porque é sen nome,
pero aínda está a ser usado no contexto deste código.
>> A parella próximo que eu son seguirá esperanza
golpe súa mente un pouco.
Podemos simplificar aínda máis.
Porque, como foi astutamente apuntado anteriormente,
quizais nós realmente sabe, por inferindo a partir deste código, o que
a saída deste código será.
E, de feito, nesta función anónima, que pode, de feito, inferir tipo de datos.
>> Entón, nun presente, xa non que definir explicitamente
o tipo de datos que está a ser entrada e saída desta función
para un par de razóns.
Unha delas é que definimos, ata o prototipo da función delimitador,
que tipo de datos que este anónimos función debe entrada e saída.
E do outro, nós pódese inferir a partir do código
aquí estamos aceptando entrada que é o tipo Double
e retornando un dobre.
>> Teña en conta que aquí non ten explicitamente definido os nomes dos argumentos
que esta función está aceptando.
E así vemos que pode referirse a estes parámetros usando US $ 0, $ 1,
así por diante e así por diante, dependendo que o número de parámetros usados
nesta función.
>> Isto é algo que está indo para ver unha chea é este paréntese aberta
seguido por unha definición R $ 0, e despois dalgún operación,
e, a continuación, un paréntese pechada.
Esa é unha función anónima que executa esta operación.
Ten ese parámetro onde é tipo é inferido.
Ese primeiro parámetro é $ 0.
E algunha operación é pasando naquel $ 0.
>> Audiencia: Entón o cifrão parámetro significa basicamente
e 0 significa o primeiro?
DAN Armendáriz: Isto é correcto.
Así, o sinal de dólar significa basicamente parámetro, e 0 significa que a primeira.
Pero funciona especificamente en Neste caso onde non nomeado
os argumentos a miña función anónima.
>> Audiencia: Será que Perl ou algo ten este sinal de dólar, dólar 0 alí?
DAN Armendáriz: Será que, me desculpe?
Audiencia: Será que Perl ten esta dólar 0, dólar 1--
DAN Armendáriz: Non son moi familiarizado con Perl,
PHP pero o que define variables con base en sinais de dólar.
E pode haber algúns idiomas que teñen características como esta.
De feito, Swift pide unha chea de recursos como este
desde unha morea de outras linguas.
Vemos indicios de Python na mesma.
Esta definición de tipo parece vir do OCaml.
E nós temos só unha morea de material de lotes de diferentes linguas.
Ese é un dos agradable cousas sobre Swift
é que ten unha morea de o mellor ideas dun grupo de idiomas
e shoehorns-los todos xuntos nunha linguaxe super.
En realidade, se me permiten a seguir soprando a súa mente,
polo que temos está a facer todo isto.
Podemos quizais simplificar isto un pouco bit por entender que, por suposto,
Swift ten unha exponencializando función incorporada.
Se eu importar Darwin, que é só que a biblioteca
presenta esta función chamada prisioneiro de guerra, agora Podo simplificar o meu poder de función
para ser o seguinte.
Vai volver esta función anónima.
>> Pero mire o quão simple iso é agora.
Esta é unha función anónima que está a aceptar datos de calquera tipo,
e que vai ser un argumento concreto,
referenciada en $ 0 que é o tipo Double.
Vai voltar un tipo dobre.
Pero a instrución de retorno agora é implícito.
>> E é este estilo exacto que é moi, moi prevalente na Swift,
en todo o lugar.
Nós imos ver iso todo o tempo en Swift.
Entón, eu estou mostrando todo isto para vostede por causa desa sintaxe.
Isto é moi común a ver, o que significa que
é unha función anónima que está a realizar
algunha operación sobre estes argumentos.
E hai un retorno implícito.
Por iso, é absolutamente o mesmo para dicir isto, aquí mesmo.
>> Porque este rizado soporte é unha función,
estamos a cabo esta operación no primeiro argumento.
Nós imos voltar iso.
Pero ese retorno exterior é volvendo toda esa función,
Toda esa función anónima que acaba de crear.
Algunha pregunta?
Todo ben, eu non sei se vostedes están preparados para iso,
pero podemos ir aínda máis tolo con Swift.
Está preparado?
OK, iso é gran.
>> Agora nós realmente ter a capacidade para, en Swift, debido á forma como modular
e como protocolo baseado é, a definir os nosos propios operadores que freaking.
Como neste caso, non tiñamos operador para exponentiation-- ben,
para a realización de poderes de algo.
Pero eu podo, na Swift, establecer un novo operador que fai precisamente iso.
Polo tanto, neste caso hai unha banda de sintaxe aquí.
E eu vou permitir que miralo na casa cando mira para isto.
Pero estamos definindo este infix operador, **, que ha permitir-nos,
definindo o que iso ** Función realmente
que, para aceptar unha man esquerda lado e un lado dereito,
e, a continuación, volver para o expoñente desta á esquerda cara á dereita.
>> E agora, de súpeto eu crearon un novo numerador.
Entón, 2 ** 3 significa 2 para a terceira potencia.
[MENTE SÃ vento] Este á en si debe facer vostede ser como,
OK, parafuso C. Vou Swift todo o camiño.
Isto é óptimo.
Iso é moi fantástico.
>> Aínda que este é un gran exemplo.
Pero eu nunca teño xa fóra deste exemplo realmente
definida meu propio operador.
Pero aínda así, el mostra unha Moito do poder do Swift
e por que iso é, en realidade, realmente moi legal.
OK, si?
Audiencia: Se vostede é establecer o seu propio operador,
como vostede sabe que non accidentalmente intentar crear un operador que é
nalgún lugar en C, como oculto nalgún lugar Swift,
como unha escura, que Pode non ter visto antes.
>> DAN Armendáriz: Entón, se está tentando para definir os seus propios operadores,
existe o risco de que define un sobre un operador existente.
Que entra en un nivel de detalle que Eu non creo que temos tempo para pasar por riba.
Pero iso é un risco.
E iso é de feito a razón pola que Non utilizar o símbolo acento circunflexo, que
cando estamos escribindo o poder, nós normalmente usar pouco acento circunflexo 4 5 ou algo
así, só cando estamos Gchatting amigos ou calquera outra cousa.
Pero, nese caso, que en realidade provocaría unha colisión.
E así eu evitaba-lo só porque Pasou de eu saber, neste caso,
que que causaría que a colisión.
>> Todo ben.
Agora, por desgraza, a os últimos sete minutos,
Teño que manter vento súas mentes un pouco.
Entón, permita-me amosar-lle algunhas outras cousas tamén.
>> Nós mostramos-lle esta idea de tendo estas funcións anónimas,
estes peches que permiten que tipo de pasar funcións arredor.
Pode devolve-los.
Vostede pode manipula-los.
Pode facer todo tipo de cousas tolas.
>> Pero outra cousa que pasa a ser útil
é a posibilidade de, ao contrario para devolver esas funcións
nunha función, para pasar unha función como un parámetro para outra función.
Vostede pode estar pensando ben por que na Terra que eu ía querer facer algo así?
>> Ben, digamos que quero tomar este operador que
traballou tan duro para crear e aplicar Lo para unha morea de números diferentes
nunha matriz.
Polo tanto, neste caso eu teño unha matriz de integers-- 1, 4, 7, 2, 5, 10, 56.
E quero dobrar todos eles.
O xeito que faría normalmente facelo é só escribir
un loop for simple que itera sobre todos eles
e realizar algún tipo de operación cadrado sobre eles,
introducir os novos valores nunha nova variable, ou mellor, unha nova matriz aquí.
E o valor da saída de resultado é, a continuación, todas estas matrices,
ou en vez de todos aqueles elementos agora ao cadrado.
>> E poderíamos facer o mesmo cubing cousa para el,
pero unha pequena campá de alarma debe ir off
dicindo que quizais haxa dalgún xeito que fariamos
poder simplificar isto un pouco.
E en realidade non existe.
E se puidésemos crear unha función que nos permite
a aceptar, como un predador, unha función?
Polo tanto, neste caso, tomar unha ollar para estes argumentos.
Estamos indo para aceptar unha lista de dobres.
E entón nós imos a aceptar unha función
nunha variable chamada F que para tomar unha parella e voltar un dobre.
E toda a produción desta función enteira
chamado mapeador vai voltar un array chamado dobre.
>> O que isto sería, entón permítame facer é iterado sobre esta lista
e facer o mesmo, pero agora aplicar esta función en cada
dos valores individuais na lista.
Entón, realmente non sei o que é f.
Non importa para min.
Pero desde que ten en parella, realizar algunha operación sobre el,
e, a continuación, retorna unha Dobre, eu sería, entón,
capaz de localizar nun mapa esa función a través cada elemento da lista.
>> E este tipo de programación é chamadas funcións de orde superior,
onde estamos pasando funcións en torno a como parámetros
e facer as cousas con funcións.
É unha especie de como tomar todos estes ideas que aprendemos en CS50
e levalos especie do para o nivel seguinte.
E iso é todo cousa estilo CS51.
E así imos en profundidade máis nas clases como esta.
>> Pero esta é tamén importante aquí, porque
ver unha chea de funcións que se utilizan en Swift
que fai esencialmente este, onde temos
algúns números, algúns matriz de números.
Nós imos pasar iso matriz na nosa mapeador.
E nós tamén imos pasar algunha función, que
nós xa definido aquí enriba.
Será cadrado.
E nós estamos indo, a continuación, cuadratura todos estes números
e almacenar tanto en este resultado aquí.
>> Entón, neste caso, definimos a nosa propia función chamada mapeador.
Pero esa cousa exacta é, De feito, construído en Swift.
Hai unha variedade de funcións chamado mapa.
Hai unha función de mapa, hai unha función de reducir,
e hai unha función de filtro, que se aplican esencialmente funcións
para cada elemento nun lista para modificalo los de algunha maneira.
>> Audiencia: Entón, xa que está transformando os datos a outro formato
a través dun function--
DAN Armendáriz: Correcto.
É, polo tanto, a función que estamos aceptando
está transformando os datos de algunha maneira.
Neste caso, ambos nós cuadratura-lo, ou que foron cubing-lo,
ou realmente, poderiamos realizar ningunha operación sobre el en todo.
>> Pero deixe-me amosar-lle entón como este vai mirar na práctica.
E de novo, eu estou correndo un pouco de tempo. entón eu non teño
vai ser capaz de pasar por riba de todo do código fonte aquí en detalle.
Pero eu encouraged-lo a facelo.
Imos publicar-la o máis axiña posible despois esa conversa.
>> Pero se der un ollo niso, asumir que temos unha lista de números,
unha matriz de números nesta números chamados variables.
Entón eu quero facer este operación do filtro sobre estes números.
Así, é un filtro maior función para que
acepta unha matriz e tamén unha función.
E en que cada elemento array, el executa esta función.
>> Se esta función devolve verdade, el mantén ese elemento.
Se esta función devolve falso, xoga fóra ese elemento.
E, a continuación, el retorna unha lista que é entón constituída por todos
destes elementos que foron filtradas.
>> Polo tanto, noutras palabras, que é a mesma idea, o libro de notas.
Podemos ter unha variedade de clases a este valor os números de chamada.
Podería ser 100, e 70, e 40, así por diante e así por diante.
Que este filtro fai é aviso que se trata de que o azucre sintático
para unha función anónima.
Esta é unha función anónima dicindo que o parámetro que estou aceptando
será, se é superior a 70,
entón iso pode voltar true, o que significa que produto que vai ser sometido neste filtro.
Entón, imos ser un pouco máis concreto sobre iso.
Se eu teño esa matriz de números e consiste en 100, 70 e 40,
Eu executar este filtro operación en cada un destes.
Así que este é un primeiro valor de 100.
100 maior ou igual 70 é verdade, que
significa que 100 é mantido en esta nova copia desta matriz.
70 tamén pasa.
Pero 40 non.
Entón, o que é devolto en passingCount é a matriz de elementos 100 e 70--
100, coma, 70.
Aqueles foron os dous únicos elementos que foron mantidos.
E así a razón de eu rapidamente pasou por unha morea de este tipo de orde alta
as cousas son, porque iso é tan común cousa que vai ver en Swift fermosa
a miúdo, está realizando algunha operación usando esta sintaxe función anónima.
>> Hai algunhas cousas interesantes.
Os switches son realmente poderoso en Swift, Quero dicir só como un tolo, tolo poderoso.
Podes usar a chave, e realmente pode aplicala las
a intervalos, o que é medio tolo, e facer cousas extravagantes como iso.
>> Pero nos últimos minutos, Quero saltar moi lonxe
e amosar-lle un exemplo concreto de como podemos crear en iOS app empregando Swift.
Entón, cando está facendo iso, vai ter que tomar
unha mirada sobre at-- Apple documentación, eles
ten unha morea de realmente bos tutoriais para crear a súa primeira aplicación.
E eu encorajo a facer iso porque levalo
a través de todos os pasos que exactamente á prema en crear unha aplicación iOS.
>> Pero aquí temos esta app IOS.
E é un app realmente moi simple.
Se eu executar tanto, deixe-me amosar é o que parece.
Todo o que esencialmente fai é tira desde a Internet un arquivo JSON
que teña almacenado nun servidor.
E o ficheiro JSON define imaxes que permiten
me para entón percorrer, na miña app, imaxes do meu servidor web.
>> Entón, eu teño aquí getNextImage.
El leva unha imaxe a partir da Internet, e despois o exhibe na pantalla.
>> Polo que é moi sinxelo.
Pero o obxectivo aquí é amosar como podemos combinar as cousas
Deste último semanas de CS50 nunha aplicación real IOS.
Noutras palabras, se cadra unha das cousas que vai querer facer
é ter unha aplicación iOS que pode extraer datos a partir da Internet
e amosar ó usuario unha información.
Isto é totalmente o punto deste código fonte aquí.
>> Polo tanto, hai moito que dicir sobre como facer desenvolvemento real IOS.
Hai unha morea de sintaxe tolo que non vimos moito aínda
como unha clase, unha clase que realmente é.
Podemos ignorar en gran parte que, polo de agora.
>> Pero teña en conta que contiveran neste unha variedade de cousas
que xa vimos como funcións que teñen nomes específicos.
E cando damos aqueles Funciona os nomes correctos
que son esperamos polo IOS, de feito isto parece un pouco máxico.
Pero cando se crea un aplicación IOS, hai
son os nomes das funcións específicas que son chamados polo propio teléfono
como a aplicación está cargando para intentar para crear o proceso que efectivamente
executa a aplicación.
Entón, de novo, hai unha morea de cousas que eu ten que pasar por riba aquí para que
para falar sobre iso especificamente.
Pero eu encorajo-vos a buscar quizais outro seminario iOS, pero tamén algúns
do tutoriais en liña que facer un traballo moito mellor de describir
a información específica.
>> Pero podemos ver un par de cousas que son interesantes a partir do código aquí.
Teña en conta que temos que declaracións.
By the way, un importante cousa sobre as declaracións
é que os parénteses arredor da Expresión booleana son opcionais.
Pero as claves non son opcionais, non importa o quão poucas ou moitas liñas de código
tes nunha instrución if.
Non podes ter un if sen chaves en Swift.
>> E este é, así, unha especie de parvo.
Pero hai razóns históricas para iso.
É suposto salvalo de si mesmo.
Lle gusta a por exemplo, non pode eliminar as chaves en torno a que
if.
Aqueles son en realidade necesaria.
Entón, eu encouraged-lo a bótalle un ollo niso.
Pero hai unha construír o que quero
para amosar-lle que sobre Swift é nova para Swift 2.0 comparación
para versións anteriores de Swift, que é o seguinte.
A ver onde é que eu poñelas aquí?
>> Polo tanto, nesta función chamada fetchJSON, esta función
é responsable de tirar que JSON ficheiro dunha URL, o que só ocorre
estar en execución no meu CS50 IDE.
Eu só comecei a Apache, poñer meu arquivo JSON alí,
e eu son capaz de tire que datos de internet usando
esta función e este URL, que é fornecido polo teléfono.
É indicado por un biblioteca que usa cando
está facendo algún desenvolvemento app IOS.
>> Nótese aquí que hai esta inusual construción sintáctica chamado garda.
E realmente todo isto está Swift é unha forma de comprobar
que algunhas cousas teñen foron atendidos antes que
continuar co resto da función.
Entón, eu podería ter, usando este tipo opcional,
Podería ter atopado o URL por de realizar esta función NSURL
e almacenar tanto nunha URL constante, e, a continuación, comprobar
URL para ver se era nula, porque ía voltar un tipo opcional.
E se fose nula, entón eu ía imprimir un erro e despois volver.
>> Pero en vez diso, o que permite que garda nós facemos é que moi cousa,
pero garantir que é realmente o caso que url
foi debidamente definido polo NSURL.
E se é, entón salta sobre iso, e
permítelle avanzar url sendo adecuadamente definidas.
Pero, de ser o caso de que url non está debidamente definido,
se esta función devolve un erro ou algunha outra cousa inesperada
de feito, ocorre, este construto garda permítenos entón a saída que o erro
e voltar inmediatamente.
Si?
>> Audiencia: Entón é tipo de como se entón máis?
DAN Armendáriz: É unha especie de como un entón máis, si,
agás que esta url é, entón, establecido para todo isto a continuación.
Se pasar pola garda, el será efectivamente Explique datos
e empregar no resto código fonte na súa función.
Entón, eu sospeito que vai comezar a ver este garda tamén.
E estar atento a iso.
>> Entón, só tes que ollar para un par de outro cousas, iso aquí é o que,
pensas que, só en base ao que que estaban falando antes?
>> Audiencia: Creo que vai executar na lista?
>> DAN Armendáriz: Así que é preto.
Esta é unha función que estamos definindo.
E nós estamos introducindo esa función como un argumento para esta función aquí.
>> Audiencia: [inaudível], se non nulo.
Polo tanto, é na lista, non?
>> DAN Armendáriz: O erro non é nulo, de xeito que é-- entón eu teño que percorrer.
Ben, imos ver, eu realmente non podo rolar para a dereita aquí.
erro é un argumento que está a ser pasado para esta función anónima.
Esta é unha función anónima.
Non ten nome.
Pero estamos aceptando estes tres argumentos, datos, resposta, e erro.
E vai a voltar void, entón non vai voltar nada.
E este é o contido desa función.
E entón temos acceso ao interior que función de cada un destes argumentos.
>> Polo tanto, é un turbillón excursión da lingua.
Pero eu espero que con iso, espero que tomar
un ollo a algúns dos tutoriais específico para o desenvolvemento IOS con Swift,
especialmente se vai a Programador web página-- de Apple
eles teñen unha morea de realmente bo tutoriais para comezar.
Pero espero que nesta hora de falar sobre a sintaxe en si deu
vostede o suficiente para comezar con isto.
>> Imos publicar todo isto fonte código na páxina web do seminario
canto antes, e tamén as láminas así que ten unha referencia para todos aqueles.
Pero boa sorte cos seus proxectos.
E grazas a todos moi por vir.
>> [Aplausos]