1 00:00:00,000 --> 00:00:03,332 >> [Música tocando] 2 00:00:03,332 --> 00:00:06,200 3 00:00:06,200 --> 00:00:09,590 >> DAN AMRMENDARIZ: Todos, bem-vindo para o seminário CS50, 4 00:00:09,590 --> 00:00:11,690 iOS App Desenvolvimento com Swift. 5 00:00:11,690 --> 00:00:15,690 Eu sou Dan Armendariz, e eu sou um preceptor de ciência da computação aqui em Harvard. 6 00:00:15,690 --> 00:00:21,510 >> E a próxima hora vai ser um rápido tour de tanta coisa 7 00:00:21,510 --> 00:00:25,160 sobre este tópico como podemos encaixar. 8 00:00:25,160 --> 00:00:29,170 Vou postar todo o código fonte que você vai ver hoje online. 9 00:00:29,170 --> 00:00:31,990 Podemos não ser capazes de na verdade, passar por cima de tudo 10 00:00:31,990 --> 00:00:34,810 que eu sou que eu sou mostrando a você nesta hora. 11 00:00:34,810 --> 00:00:37,580 Mas, pelo menos, espero que através os comentários do código fonte, 12 00:00:37,580 --> 00:00:40,830 você vai ser capaz de tentar descobrir o que exatamente está acontecendo para essas coisas 13 00:00:40,830 --> 00:00:42,950 que nós não muito chegar. 14 00:00:42,950 --> 00:00:46,970 >> Em geral, a estrutura de A palestra de hoje será a seguinte. 15 00:00:46,970 --> 00:00:52,820 Nós vamos começar a fazer alguns básico sintaxe com a linguagem Swift, 16 00:00:52,820 --> 00:00:56,290 indo em algumas das mais avançado sintaxe da linguagem Swift. 17 00:00:56,290 --> 00:00:59,560 Porque o idioma é realmente moderno e 18 00:00:59,560 --> 00:01:02,110 tem um monte de alto nível recursos, coisas que não têm 19 00:01:02,110 --> 00:01:06,600 visto em C ao longo de CS50, ou Mesmo alguns dos outros idiomas 20 00:01:06,600 --> 00:01:09,310 que nós começamos usando em CS50 como PHP, 21 00:01:09,310 --> 00:01:12,670 então eu vou ter que tentar apresentar também alguns temas que 22 00:01:12,670 --> 00:01:18,580 estão relacionados com linguagens de alto nível que você não pode ver em profundidade no CS50, 23 00:01:18,580 --> 00:01:21,380 mas você vai ver mais tarde aulas de informática. 24 00:01:21,380 --> 00:01:25,290 Por isso, vai ser um hermeticamente embalados hora. 25 00:01:25,290 --> 00:01:28,897 E sinta-se livre para me deixar saber se você tem alguma dúvida. 26 00:01:28,897 --> 00:01:30,730 Então, se você estiver interessado em fazer desenvolvimento 27 00:01:30,730 --> 00:01:34,442 com Swift, ou realmente qualquer desenvolvimento de aplicativos iOS, 28 00:01:34,442 --> 00:01:35,900 há um par de requisitos. 29 00:01:35,900 --> 00:01:39,940 Primeiro de tudo, você tem que estar usando um Mac, correndo nos exemplos 30 00:01:39,940 --> 00:01:43,880 que vamos estar usando hoje, relativamente nova versão do OS 31 00:01:43,880 --> 00:01:46,580 X. Neste caso, eu estou correndo X 10.5. 32 00:01:46,580 --> 00:01:48,600 Você pode estar executando 10.11, se quiser. 33 00:01:48,600 --> 00:01:52,430 Mas tudo o que você vai ver se envolvendo Xcode 7 e posterior, 34 00:01:52,430 --> 00:01:56,271 que tem a versão mais recente de Swift, que é Swift 2.0. 35 00:01:56,271 --> 00:01:58,270 Esta é realmente uma bonita distinção importante. 36 00:01:58,270 --> 00:02:01,510 Um monte de a sintaxe tem mudou muito significativamente 37 00:02:01,510 --> 00:02:05,890 em alguns casos a partir de 1,0 Swift, que foi lançado no ano passado, 38 00:02:05,890 --> 00:02:08,514 Swift para 2,0, o que só saiu neste outono. 39 00:02:08,514 --> 00:02:09,889 Então, nós estamos indo para mostrar Swift 2.0. 40 00:02:09,889 --> 00:02:13,020 Um monte de coisas que você procurar on-line 41 00:02:13,020 --> 00:02:18,040 quando você está tentando obter adicional informações sobre uma variedade de coisas, 42 00:02:18,040 --> 00:02:20,710 você pode querer explicitamente procurar Swift 2 43 00:02:20,710 --> 00:02:24,950 ao invés de simplesmente velho Swift para fazer Certifique-se de que você começa a sintaxe correta. 44 00:02:24,950 --> 00:02:26,920 >> Na verdade, este é geralmente verdade. 45 00:02:26,920 --> 00:02:31,210 Há uma quantidade acelerado de desenvolvimento acontecendo na língua Swift 46 00:02:31,210 --> 00:02:35,110 desde que a Apple lançou isso, eu acho o que, tem sido um pouco mais de um ano 47 00:02:35,110 --> 00:02:36,370 agora. 48 00:02:36,370 --> 00:02:39,080 E as coisas mudaram dramaticamente durante esse tempo. 49 00:02:39,080 --> 00:02:42,160 E por isso não se frustrado se, quando você está olhando ao redor 50 00:02:42,160 --> 00:02:48,310 para tópicos sobre Swift ou como realizar algo usando algum código de exemplo 51 00:02:48,310 --> 00:02:51,210 ou algo que não faz realmente trabalhar em Swift 2.0. 52 00:02:51,210 --> 00:02:53,790 Certifique-se de que você está procurando especificamente para essa versão 53 00:02:53,790 --> 00:02:58,690 para tentar minimizar os efeitos de diferentes versões e esses tipos de coisas. 54 00:02:58,690 --> 00:03:02,470 >> Vou tentar destacar apenas algumas coisas que são diferentes para versões mais antigas. 55 00:03:02,470 --> 00:03:03,970 Mas é algo que atente para. 56 00:03:03,970 --> 00:03:06,770 Isso provavelmente vai ser uma das maiores dores de cabeça 57 00:03:06,770 --> 00:03:11,010 que você vai ter com Swift é encontrar exemplo de código que é mais velho, mesmo apenas 58 00:03:11,010 --> 00:03:14,050 por alguns meses, tentando usar lo em seu projeto mais moderno. 59 00:03:14,050 --> 00:03:15,430 E isso simplesmente não funciona. 60 00:03:15,430 --> 00:03:18,530 Você está recebendo erros do compilador, sintaxe erros, todos os tipos de coisas loucas. 61 00:03:18,530 --> 00:03:21,580 Então, basta ser paciente com que, e você venha a 62 00:03:21,580 --> 00:03:24,200 ter uma experiência bastante agradável com total Swift. 63 00:03:24,200 --> 00:03:28,430 >> Agora você pode realmente join-- e espero nós realmente ainda tem esse este ano-- 64 00:03:28,430 --> 00:03:30,910 A Apple app do CS 50 equipe de desenvolvimento, que 65 00:03:30,910 --> 00:03:34,680 vai permitir a instalação de qualquer aplicativo que você cria em seus dispositivos iOS. 66 00:03:34,680 --> 00:03:39,190 Então dê uma olhada neste URL se você está interessado em fazer isso. 67 00:03:39,190 --> 00:03:41,450 >> Então, basta um par de coisas sobre si Swift. 68 00:03:41,450 --> 00:03:43,580 É uma linguagem compilada. 69 00:03:43,580 --> 00:03:45,870 Mas você vai ver que alguns os recursos que usamos 70 00:03:45,870 --> 00:03:50,650 permitem que ele seja usado também em um pouco interpretado como uma maneira também. 71 00:03:50,650 --> 00:03:56,350 >> Uma boa parte da sintaxe é emprestada de C. É baseado e escrito em C. 72 00:03:56,350 --> 00:04:00,400 E por isso vamos ver que há um grande número de takeaways 73 00:04:00,400 --> 00:04:04,450 a partir de seu conhecimento existente de C que pode porta para Swift. 74 00:04:04,450 --> 00:04:07,290 >> Mas há coisas que torná-lo muito diferente de C. 75 00:04:07,290 --> 00:04:08,860 É muito fortemente tipado. 76 00:04:08,860 --> 00:04:10,380 Há gerenciamento automático de memória. 77 00:04:10,380 --> 00:04:13,170 Você não vai ter que usar malloc ou em qualquer lugar gratuitamente. 78 00:04:13,170 --> 00:04:15,110 Ele foi projetado para a generalidade. 79 00:04:15,110 --> 00:04:19,480 Portanto, em outras palavras, você pode usá-lo em todos os tipos de contextos, da Apple Assista 80 00:04:19,480 --> 00:04:26,290 para iPhone todo o caminho até OS X, e até mesmo alguns servidores, mesmo alguns scripts. 81 00:04:26,290 --> 00:04:28,400 Mas vamos ver o que suporte para scripting 82 00:04:28,400 --> 00:04:31,360 não é completamente lá ainda como é em outros idiomas. 83 00:04:31,360 --> 00:04:34,930 Então, provavelmente você estará usando este exclusivamente para o desenvolvimento 84 00:04:34,930 --> 00:04:37,060 no seu Mac ou um iPhone. 85 00:04:37,060 --> 00:04:40,150 >> E tem um monte de características modernas. 86 00:04:40,150 --> 00:04:43,380 E muitas dessas coisas são coisas que vamos tentar resolver hoje, 87 00:04:43,380 --> 00:04:47,590 mas também os nossos temas que, francamente, podemos dedicar cursos inteiros. 88 00:04:47,590 --> 00:04:50,140 Na verdade, CS 51, que é próximo semestre oferecido, 89 00:04:50,140 --> 00:04:53,990 centra-se muito sobre esses tópicos que são descritos abaixo. 90 00:04:53,990 --> 00:04:56,781 Assim, você pode passar um semestre inteiro compreender estas coisas. 91 00:04:56,781 --> 00:04:58,530 Mas nós vamos tentar para passar por eles 92 00:04:58,530 --> 00:05:00,800 pelo menos o suficiente para que você pode entender o que é 93 00:05:00,800 --> 00:05:03,700 acontecendo quando você olha a um programa Swift 94 00:05:03,700 --> 00:05:07,310 e ser capaz de cortar o seu caminho através dele para o projeto final. 95 00:05:07,310 --> 00:05:10,780 >> Agora, uma das melhores maneiras que você pode obter informações adicionais sobre este 96 00:05:10,780 --> 00:05:14,700 é francamente apenas através da Apple fornecida documentação para Swift. 97 00:05:14,700 --> 00:05:16,930 Há um monte de APIs que estão disponíveis. 98 00:05:16,930 --> 00:05:21,170 E esta é uma boa base para você a olhar para coisas específicas que você 99 00:05:21,170 --> 00:05:23,020 querem fazer com uma API envolvendo iOS. 100 00:05:23,020 --> 00:05:26,350 Se você quiser usar a câmera para exemplo, você pode começar a olhar aqui, 101 00:05:26,350 --> 00:05:32,540 e também usar o Google e Stack Overflow como você faria normalmente. 102 00:05:32,540 --> 00:05:36,670 >> Quaisquer perguntas sobre essa antes de saltar para a direita? 103 00:05:36,670 --> 00:05:37,880 Tudo certo. 104 00:05:37,880 --> 00:05:38,700 Vamos continuar. 105 00:05:38,700 --> 00:05:42,620 >> Então, primeiro, eu tenho um número de arquivos de exemplo. 106 00:05:42,620 --> 00:05:46,040 E eu estou indo tentar a etapa através deles de forma relativamente rápida. 107 00:05:46,040 --> 00:05:49,190 Este é o arquivo Olá Mundo para Swift. 108 00:05:49,190 --> 00:05:51,050 É muito simples. 109 00:05:51,050 --> 00:05:54,360 Não há maneira mais comentários que existem código real. 110 00:05:54,360 --> 00:05:57,100 Observe o código real está em parte inferior na linha 14. 111 00:05:57,100 --> 00:05:57,980 Diz impressão. 112 00:05:57,980 --> 00:05:59,820 E então é uma chamada de função. 113 00:05:59,820 --> 00:06:03,010 Estamos passando para uma string chamada Olá CS50. 114 00:06:03,010 --> 00:06:04,750 Observe que não há nenhum ponto e vírgula. 115 00:06:04,750 --> 00:06:07,010 Observe que não há nenhuma int main. 116 00:06:07,010 --> 00:06:10,392 Há nenhum dos cruft que tivemos com C. 117 00:06:10,392 --> 00:06:15,020 Quando estamos usando Swift, desta forma, que é apenas escrito em um arquivo de texto 118 00:06:15,020 --> 00:06:18,340 e armazenados no meu computador, em seguida, I pode compilá-lo e executá-lo. 119 00:06:18,340 --> 00:06:20,920 >> Repare que aqui eu sou não usando o IDE CS50. 120 00:06:20,920 --> 00:06:24,460 Isso pressupõe que eu sou execução e que eu estou no OS X, 121 00:06:24,460 --> 00:06:27,870 e que eu Xcode já instalado nesta máquina para que este 122 00:06:27,870 --> 00:06:29,080 para realmente função. 123 00:06:29,080 --> 00:06:33,349 Mas este é apenas um arquivo de texto normal que pode então compilar e editar. 124 00:06:33,349 --> 00:06:34,890 Então, vamos ver como isso realmente funciona. 125 00:06:34,890 --> 00:06:37,430 E se eu quiser compilá-lo? 126 00:06:37,430 --> 00:06:40,450 1.swift swiftc. 127 00:06:40,450 --> 00:06:42,960 Depois de um momento ou dois, vai ver que temos agora 128 00:06:42,960 --> 00:06:45,360 compilado isso em um arquivo chamado 1. 129 00:06:45,360 --> 00:06:51,090 E agora nós imprimimos nosso CS50, nossa aplicação Olá Mundo em vez. 130 00:06:51,090 --> 00:06:54,690 >> Observe uma outra coisa como bem é que, por padrão, 131 00:06:54,690 --> 00:07:00,090 nós não temos a entrada A / N para imprimir uma nova linha. 132 00:07:00,090 --> 00:07:05,315 Por padrão, a função de impressão em Swift irá imprimir uma nova linha para você. 133 00:07:05,315 --> 00:07:09,284 Você pode passar um adicional opcional parâmetro para dizer que não fazê-lo. 134 00:07:09,284 --> 00:07:10,950 Mas o Google para obter mais informações sobre isso. 135 00:07:10,950 --> 00:07:13,450 Por padrão, ele vai fazer a linha de impressão. 136 00:07:13,450 --> 00:07:16,420 >> Tudo bem, então vamos seguir em frente em seguida, para algumas outras coisas. 137 00:07:16,420 --> 00:07:18,620 Então, como podemos realmente definir variáveis? 138 00:07:18,620 --> 00:07:21,960 Nós podemos fazer isso é usando um dos dois métodos. 139 00:07:21,960 --> 00:07:26,122 E o que eu quero dizer a você sobre a primeira é esta definição let. 140 00:07:26,122 --> 00:07:27,830 E isso é importante porque efectivamente 141 00:07:27,830 --> 00:07:30,240 o que estamos fazendo é definir uma constante. 142 00:07:30,240 --> 00:07:34,010 Nós vamos criar uma variável, ou melhor, um chamado nome de constante, 143 00:07:34,010 --> 00:07:38,200 fornecer-lhe algumas data-- em Neste caso, a seqüência de Dan. 144 00:07:38,200 --> 00:07:40,630 Mas usando este let palavra-chave, estamos dizendo 145 00:07:40,630 --> 00:07:43,860 que esta ou variable-- constant-- chamado novamente 146 00:07:43,860 --> 00:07:46,220 nome nunca vai ser alterado. 147 00:07:46,220 --> 00:07:50,120 Vai ser imutável ao longo a duração deste programa 148 00:07:50,120 --> 00:07:53,100 ou em todo o duração do contexto 149 00:07:53,100 --> 00:07:55,390 que esta variável é disponível. 150 00:07:55,390 --> 00:08:00,096 >> Isso é realmente importante que, quando você tem alguns dados que não é 151 00:08:00,096 --> 00:08:02,970 vai mudar em seu programa, e você verá uma variedade de exemplos 152 00:08:02,970 --> 00:08:06,790 sobre quando nós queremos usar deixe versus a outra sintaxe, 153 00:08:06,790 --> 00:08:11,040 é importante que você use deixá sempre que possível, porque esta notifica 154 00:08:11,040 --> 00:08:13,740 o idioma que é não vai ser alterado, 155 00:08:13,740 --> 00:08:16,590 e ele pode realmente executar um monte de otimizações 156 00:08:16,590 --> 00:08:19,560 para melhorar a velocidade e a segurança de seu programa. 157 00:08:19,560 --> 00:08:24,480 E por segurança, eu não significa deixá- ele falha com erros de loucos 158 00:08:24,480 --> 00:08:27,910 para que sejamos acostumados a ver em C. 159 00:08:27,910 --> 00:08:32,460 >> Então, podemos usar interpolação de string para encapsular isso dentro de uma string. 160 00:08:32,460 --> 00:08:35,200 Assim, podemos ver neste linha de impressão, imprima Olá, 161 00:08:35,200 --> 00:08:38,950 e em seguida, usando barra invertida parênteses abertas, e, em seguida, o nome do meu variável, 162 00:08:38,950 --> 00:08:41,809 neste caso constante, fechar os parênteses. 163 00:08:41,809 --> 00:08:46,400 Estou essencialmente, em seguida, colocar o conteúdo deste nome variável chamada 164 00:08:46,400 --> 00:08:50,240 dentro da corda e, em seguida, imprimir o resultado lá. 165 00:08:50,240 --> 00:08:54,070 >> Há uma outra alteração a este arquivo o que é que eu tenho, no topo, 166 00:08:54,070 --> 00:08:57,340 colocar em uma linha shebang, que basicamente apenas especifica 167 00:08:57,340 --> 00:09:00,180 que eu quero usar o Intérprete Swift, que 168 00:09:00,180 --> 00:09:04,190 significa que eu não tenho mais para compilar este programa particular. 169 00:09:04,190 --> 00:09:06,567 Eu posso apenas executá-lo como seu próprio script. 170 00:09:06,567 --> 00:09:09,400 Mas esta é, neste caso, por trás as cenas sendo compilados e, em seguida, 171 00:09:09,400 --> 00:09:10,030 sendo executado. 172 00:09:10,030 --> 00:09:13,540 É apenas invisível para nós. 173 00:09:13,540 --> 00:09:15,880 >> Tudo bem, então vamos seguir em frente. 174 00:09:15,880 --> 00:09:19,650 Portanto, há um pouco de malandragem que apenas aconteceu antes. 175 00:09:19,650 --> 00:09:23,230 Mostrei-lhe que eu Pode definir uma constante. 176 00:09:23,230 --> 00:09:25,490 E eu poderia fornecer alguns dados para fazê-lo. 177 00:09:25,490 --> 00:09:29,240 Mas, neste caso, repare que eu não fiz na verdade, especificam o tipo de dados 178 00:09:29,240 --> 00:09:29,820 é isso. 179 00:09:29,820 --> 00:09:32,780 E isso é porque o compilador, pode Swift 180 00:09:32,780 --> 00:09:36,910 inferir o tipo de dados apenas com base sobre os dados que eu colocar nele. 181 00:09:36,910 --> 00:09:41,760 Porque ele sabe que por avaliar este variável aqui mesmo, esse direito de dados 182 00:09:41,760 --> 00:09:43,370 aqui, ele sabe que é uma string. 183 00:09:43,370 --> 00:09:48,690 E assim este nome constante é, portanto, vai ser uma string assim. 184 00:09:48,690 --> 00:09:52,730 >> Mas também pode ser explícita sobre o tipo que é 185 00:09:52,730 --> 00:09:55,790 vamos usar para constantes ou variáveis 186 00:09:55,790 --> 00:10:01,590 usando esta sintaxe instead-- deixe de Cordas nome cólon igual 187 00:10:01,590 --> 00:10:05,530 Dan, que neste caso significa que estamos vai definir um nome chamado constante. 188 00:10:05,530 --> 00:10:07,150 Vai ser do tipo String. 189 00:10:07,150 --> 00:10:10,550 E o valor vai ser Dan. 190 00:10:10,550 --> 00:10:12,550 Agora outra forma que podemos criar variables-- 191 00:10:12,550 --> 00:10:15,549 e estes são variáveis ​​mutáveis, que significa que estamos, de fato, vai 192 00:10:15,549 --> 00:10:19,670 para mudar seu conteúdo em algum momento da duração do contexto 193 00:10:19,670 --> 00:10:23,890 que essa variável é defined-- nós usar a palavra-chave var, em vez de deixar. 194 00:10:23,890 --> 00:10:27,400 Mas, novamente, por padrão, se você não sabe que você precisa para manipular esses dados, 195 00:10:27,400 --> 00:10:30,510 tente usar para deixar melhorias de desempenho. 196 00:10:30,510 --> 00:10:33,740 >> Neste caso, posso, então, especificar o tipo de dados 197 00:10:33,740 --> 00:10:37,650 que esperamos estar dentro de esta nova variável chamada etiqueta. 198 00:10:37,650 --> 00:10:38,800 Vai ser uma string. 199 00:10:38,800 --> 00:10:43,030 E nós estamos indo, em seguida, concatenar duas cordas em conjunto, a cadeia Olá, 200 00:10:43,030 --> 00:10:48,070 ea cadeia representada pela variável, ou melhor, o nome constante. 201 00:10:48,070 --> 00:10:50,660 >> Então, isso é bom porque esta está um tanto como o PHP em que nós 202 00:10:50,660 --> 00:10:52,250 tem muito fácil concatenação. 203 00:10:52,250 --> 00:10:56,350 Não temos para automaticamente usar qualquer tipo de gerenciamento de memória 204 00:10:56,350 --> 00:11:00,580 para aumentar o tamanho e fazer qualquer tipo de coisas engraçadas lá. 205 00:11:00,580 --> 00:11:05,040 Isso funciona como seria de esperar, na verdade. 206 00:11:05,040 --> 00:11:09,370 >> Tudo bem, qualquer dúvida sobre este? 207 00:11:09,370 --> 00:11:12,520 >> Agora, a outra razão que precisamos de você ter a capacidade 208 00:11:12,520 --> 00:11:15,490 para ser capaz de definir o que tipo de variáveis ​​de dados são 209 00:11:15,490 --> 00:11:18,170 é porque às vezes não o fazemos quer inicializar variáveis 210 00:11:18,170 --> 00:11:21,080 com alguns dados no ponto de definição. 211 00:11:21,080 --> 00:11:23,500 Portanto, neste caso, digamos que eu quero começar a introduzir 212 00:11:23,500 --> 00:11:25,040 algumas notas em um livro de notas. 213 00:11:25,040 --> 00:11:27,530 Bem, eu sei que um dos variáveis ​​que eu quero ser 214 00:11:27,530 --> 00:11:30,280 vai ser uma classe mutável. 215 00:11:30,280 --> 00:11:33,010 E também sabemos que nós quero que seja um inteiro. 216 00:11:33,010 --> 00:11:36,030 Mas talvez nós não fazemos ainda tem esse grau disponível. 217 00:11:36,030 --> 00:11:39,570 >> Em Swift, você tem que definir o tipo de dados 218 00:11:39,570 --> 00:11:44,000 que está associada com um variável ou uma constante deixá 219 00:11:44,000 --> 00:11:47,840 antes que você possa realmente usar essa variável. 220 00:11:47,840 --> 00:11:51,170 Porque ele é fortemente tipado, você tem que associar um tipo de 221 00:11:51,170 --> 00:11:52,890 com estas variáveis. 222 00:11:52,890 --> 00:11:56,120 >> Portanto, neste caso, se eu não tenho propriamente inicializado o primeiro com algum valor, 223 00:11:56,120 --> 00:12:00,520 então eu preciso dizer que Swift Espero que o tipo de dados a ser. 224 00:12:00,520 --> 00:12:02,650 E vai permanecer que mesmo tipo de dados 225 00:12:02,650 --> 00:12:05,780 ao longo da história deste programa. 226 00:12:05,780 --> 00:12:10,050 >> Agora você pode ser tentado assim que Eu criei esta variável grau 227 00:12:10,050 --> 00:12:13,530 e desde que um número inteiro de 100, agora se eu 228 00:12:13,530 --> 00:12:18,540 quero tentar concatenar uma cadeia com esse inteiro, 229 00:12:18,540 --> 00:12:21,610 pode ser tentado a usar ainda esse operador de concatenação de strings 230 00:12:21,610 --> 00:12:24,500 como fizemos apenas algumas linhas antes. 231 00:12:24,500 --> 00:12:26,460 Mas infelizmente, isso realmente não vai 232 00:12:26,460 --> 00:12:29,270 trabalhar, porque você é essencialmente executando 233 00:12:29,270 --> 00:12:32,380 uma operação em dois tipos diferentes. 234 00:12:32,380 --> 00:12:36,856 >> Agora isso é muito diferente de outros linguagens como PHP que são realmente 235 00:12:36,856 --> 00:12:38,480 goosey loosey com o seu tipo de tipos. 236 00:12:38,480 --> 00:12:40,030 Eles estão apenas gosta, sim, qualquer que seja, eu não me importo. 237 00:12:40,030 --> 00:12:42,710 Apenas me dê um tipo, e talvez eu vou fazer a coisa certa. 238 00:12:42,710 --> 00:12:46,060 >> Neste caso, é Swift extremamente rigoroso sobre os tipos 239 00:12:46,060 --> 00:12:47,350 que você está lidando. 240 00:12:47,350 --> 00:12:50,700 Este operador somatório ou operador de concatenação 241 00:12:50,700 --> 00:12:54,400 tem essencialmente um par de diferentes opções possíveis. 242 00:12:54,400 --> 00:12:56,970 Você pode fazer somatório com números inteiros, ou você 243 00:12:56,970 --> 00:13:00,870 pode fazer concatenação de strings, e talvez algumas outras coisas também. 244 00:13:00,870 --> 00:13:05,550 Mas se esse operador não reconhece o que é em ambos os lados do mesmo, 245 00:13:05,550 --> 00:13:10,452 ou melhor, a combinação daqueles dois tipos, não é o que está esperando, 246 00:13:10,452 --> 00:13:11,910 em seguida, ele vai causar uma falha. 247 00:13:11,910 --> 00:13:16,690 >> Portanto, neste caso, o que significa para ter uma corda mais um número inteiro? 248 00:13:16,690 --> 00:13:18,880 Bem no contexto de isso, nós provavelmente quer 249 00:13:18,880 --> 00:13:21,990 a fazer uma operação de concatenação de strings. 250 00:13:21,990 --> 00:13:26,420 Mas é claro que o computador não tem esse tipo de contexto. 251 00:13:26,420 --> 00:13:29,950 E por isso precisamos fornecer que as informações adicionais 252 00:13:29,950 --> 00:13:32,390 para deixá-lo saber o que é que nós queremos fazer. 253 00:13:32,390 --> 00:13:36,860 >> Assim, em outras palavras, o facto que Swift é fortemente tipado 254 00:13:36,860 --> 00:13:39,520 significa que você tem que fazer um pouco de trabalho adicional 255 00:13:39,520 --> 00:13:42,100 para obtê-lo para operar o maneira que você gostaria. 256 00:13:42,100 --> 00:13:43,710 Porém, como resultado, é mais seguro. 257 00:13:43,710 --> 00:13:46,290 E uma vez que você tem tomar em conta os tipos, 258 00:13:46,290 --> 00:13:49,300 coisas apenas francamente começar funcionar muito bem. 259 00:13:49,300 --> 00:13:52,520 >> Portanto, neste caso, nós, em seguida, iria executar concatenação de strings 260 00:13:52,520 --> 00:13:56,040 por vazamento explicitamente o inteiro para uma string 261 00:13:56,040 --> 00:13:58,490 por envolvê-lo neste capital de função S String, 262 00:13:58,490 --> 00:14:03,510 e em seguida, usando a concatenação operador para modificar nossa variável etiqueta, 263 00:14:03,510 --> 00:14:06,280 e, em seguida, imprimi-lo. 264 00:14:06,280 --> 00:14:08,420 >> Por enquanto, tudo bem? 265 00:14:08,420 --> 00:14:12,020 Tudo bem, vamos seguir em frente. 266 00:14:12,020 --> 00:14:16,300 >> Agora, há uma variedade de dados tipos que podemos usar em Swift. 267 00:14:16,300 --> 00:14:21,620 Como você se acostumaram a, nós podemos criar uma matriz mutável. 268 00:14:21,620 --> 00:14:26,140 E essa matriz só pode conter um único tipo. 269 00:14:26,140 --> 00:14:30,360 >> Portanto, neste caso, nós estamos indo para criar um mutáveis ​​matrizes de inteiros, o que 270 00:14:30,360 --> 00:14:34,800 vamos chamar graus, e seremos capazes para armazenar que neste colchete 271 00:14:34,800 --> 00:14:38,650 formato que você cresceu acostumado a em uma variedade de outras linguagens. 272 00:14:38,650 --> 00:14:41,150 Mas note que aqui estamos definindo um par de coisas. 273 00:14:41,150 --> 00:14:45,350 graus é um variable-- mutável nós não utilizar a palavra-chave let. 274 00:14:45,350 --> 00:14:49,620 Então isso significa que nós podemos então modificar o conteúdo desta matriz. 275 00:14:49,620 --> 00:14:53,420 É do tipo Array Int, e podemos dizer que 276 00:14:53,420 --> 00:14:56,260 com base nesses colchetes aqui. 277 00:14:56,260 --> 00:14:58,930 >> Agora, uma das coisas agradáveis sobre isso é que nós 278 00:14:58,930 --> 00:15:02,310 têm acesso a uma grande quantidade de informação adicional 279 00:15:02,310 --> 00:15:07,110 sobre a matriz usando apenas alguns notação de ponto simples. 280 00:15:07,110 --> 00:15:10,500 Assim, por exemplo, grades.count fornece para nós 281 00:15:10,500 --> 00:15:14,820 o número de itens que existe nesse array, que pode, então, acessar bonita 282 00:15:14,820 --> 00:15:19,090 facilmente usando simplesmente que a notação de ponto. 283 00:15:19,090 --> 00:15:21,830 >> Se você quiser adicionar adicional itens para essa matriz, 284 00:15:21,830 --> 00:15:27,220 você não pode fazer o estilo PHP onde você acabou de definir explicitamente, 285 00:15:27,220 --> 00:15:30,910 a um dado índice, algum valor que você deseja inserir. 286 00:15:30,910 --> 00:15:37,210 Em vez disso, use o acréscimo método no tipo de matriz 287 00:15:37,210 --> 00:15:40,920 para acrescentar esse item, 95, a esta lista. 288 00:15:40,920 --> 00:15:45,990 >> Então agora essa matriz tem a seguinte contents-- 100, 0, 90, 85. 289 00:15:45,990 --> 00:15:49,270 E agora temos acrescentado 95 para que, como bem. 290 00:15:49,270 --> 00:15:51,830 >> Há outras maneiras Podemos acrescentar coisas. 291 00:15:51,830 --> 00:15:55,030 Você pode realmente usar um operador de soma, 292 00:15:55,030 --> 00:15:59,200 que será interpretada como uma operação de matriz de acréscimo. 293 00:15:59,200 --> 00:16:04,680 E você pode em seguida, acrescentar um outro array, cujo conteúdo é de 70 e 80, 294 00:16:04,680 --> 00:16:05,560 para essa matriz. 295 00:16:05,560 --> 00:16:08,250 Portanto, agora temos o conteúdo deste variável 296 00:16:08,250 --> 00:16:17,220 grades-- 100, 0, 90, 85, 95, 70, e 80. 297 00:16:17,220 --> 00:16:21,850 Este é apenas um pouco agradável sintática açúcar que Swift fornece para nós. 298 00:16:21,850 --> 00:16:23,850 >> Portanto, se queremos somar o graus, estamos talvez 299 00:16:23,850 --> 00:16:27,340 vai querer fazer uma iteração sobre cada item neste loop. 300 00:16:27,340 --> 00:16:32,150 E nós temos, no Swift, a noção de um loop for como seria de esperar. 301 00:16:32,150 --> 00:16:35,350 Mas o caminho que nós indicamos um intervalo é um pouco diferente. 302 00:16:35,350 --> 00:16:37,790 Portanto, neste caso, a Resumindo tudo, vamos 303 00:16:37,790 --> 00:16:40,650 vai criar um temporário chamado soma variável para que nós 304 00:16:40,650 --> 00:16:42,580 para manter esta contagem. 305 00:16:42,580 --> 00:16:44,430 >> E note nosso para construção de loop aqui. 306 00:16:44,430 --> 00:16:46,820 Para o índice em 0 .. 00:16:51,480 308 00:16:51,480 --> 00:16:57,390 Portanto, esta construção, 0 .. 00:17:01,860 dizendo que nós vamos criar uma gama de números inteiros de 0 até 310 00:17:01,860 --> 00:17:05,750 até, mas excluindo grades.count. 311 00:17:05,750 --> 00:17:09,577 Portanto, este será de 0, 1, 2, 3, 4, 5, até porém muitos um 312 00:17:09,577 --> 00:17:10,410 antes grades.count. 313 00:17:10,410 --> 00:17:14,160 >> Portanto, esta é diferente de como nós normalmente usado para loops 314 00:17:14,160 --> 00:17:18,569 onde você teria algum índice variável, defina-igual a 0 no primeiro, 315 00:17:18,569 --> 00:17:25,480 e então integrá que até alguns valor menor que a contagem de itens 316 00:17:25,480 --> 00:17:27,140 nesse array. 317 00:17:27,140 --> 00:17:29,820 >> Portanto, há uma modificação para isto, na verdade, 318 00:17:29,820 --> 00:17:35,010 o que nos permite muito facilmente definir diferentes tipos de intervalos. 319 00:17:35,010 --> 00:17:40,570 Se você alterar este intervalo para três pontos, 0 ... grade.count, 320 00:17:40,570 --> 00:17:45,120 esta representa a gama 0 para grades.count inclusiva, 321 00:17:45,120 --> 00:17:49,260 o que significa que esse número é também então incluídos nesse intervalo. 322 00:17:49,260 --> 00:17:52,110 >> Mas isso é muito útil para estas coisas exatas, 323 00:17:52,110 --> 00:17:54,590 quando temos que executar iterações mais de laço 324 00:17:54,590 --> 00:17:59,630 porque esses índices são indexados zero, como vimos em outros idiomas 325 00:17:59,630 --> 00:18:02,360 também. 326 00:18:02,360 --> 00:18:05,210 Quaisquer perguntas sobre essa para loop? 327 00:18:05,210 --> 00:18:10,660 >> Portanto, não há definição implícita desta variável índice, 328 00:18:10,660 --> 00:18:14,350 cujo valor começa em 0 e continua a cada iteração do loop 329 00:18:14,350 --> 00:18:17,950 a um aumento de 1 até um ponto que é igual a grades.count, 330 00:18:17,950 --> 00:18:20,380 ponto no qual, o loop aborta. 331 00:18:20,380 --> 00:18:23,730 >> Observe que, em nossa cadeia interpolação aqui, 332 00:18:23,730 --> 00:18:26,910 nós podemos realmente executar algumas simples manipulações a esses valores. 333 00:18:26,910 --> 00:18:31,230 Assim índice mais 1 vai realmente executar uma soma desse valor 334 00:18:31,230 --> 00:18:34,780 porque o índice é, em Neste caso, um número inteiro. 335 00:18:34,780 --> 00:18:37,810 E nesse ponto, ele vai em seguida, ser convertido em uma cadeia 336 00:18:37,810 --> 00:18:42,230 e interpolados para essa sequência aqui, e impresso como seria de esperar. . 337 00:18:42,230 --> 00:18:44,520 >> E a coisa agradável sobre as matrizes aqui é 338 00:18:44,520 --> 00:18:50,730 que também somos capazes de ter valores buscar e valores de ajuste 339 00:18:50,730 --> 00:18:54,080 usando a notação colchete como temos visto em outros idiomas também. 340 00:18:54,080 --> 00:18:57,130 341 00:18:57,130 --> 00:19:01,030 >> Tudo bem, então a partir daqui, podemos agora calcular a soma de todos os tipos. 342 00:19:01,030 --> 00:19:02,780 Agora tipo do próximo passo lógico seria 343 00:19:02,780 --> 00:19:07,580 para fazer uma operação de divisão para encontrar a média dessas notas. 344 00:19:07,580 --> 00:19:10,150 Mas algo importante aqui que está a acontecer 345 00:19:10,150 --> 00:19:15,020 é que este montante é, talvez, um número inteiro. 346 00:19:15,020 --> 00:19:18,020 Mas precisamos realizar alguma espécie de divisão de casal. 347 00:19:18,020 --> 00:19:20,600 E isso vai ser extremamente importante quando 348 00:19:20,600 --> 00:19:24,140 queremos realizar esta operação, porque o que estamos dizendo 349 00:19:24,140 --> 00:19:28,430 é que nós precisamos, na verdade, realizar a divisão em duas duplas. 350 00:19:28,430 --> 00:19:31,370 E, novamente, porque Swift é fortemente digitado, 351 00:19:31,370 --> 00:19:36,760 temos de definir explicitamente toda a itens para duplas antes que efectivamente 352 00:19:36,760 --> 00:19:38,300 realizar essa operação. 353 00:19:38,300 --> 00:19:40,550 >> Então, para nós realizar a divisão de casal, 354 00:19:40,550 --> 00:19:43,730 não é suficiente para apenas um desses itens a ser um casal. 355 00:19:43,730 --> 00:19:46,400 Ambas as partes têm de ser um duplo, a fim de swift 356 00:19:46,400 --> 00:19:50,860 para ter certeza de que este é o que nós queremos fazer. 357 00:19:50,860 --> 00:19:54,360 Então, vamos, então, explicitamente typecast a soma que temos calculado acima 358 00:19:54,360 --> 00:19:58,970 ea contagem de notas para duplas, e em seguida, executar essa operação e armazenamento 359 00:19:58,970 --> 00:20:02,390 que para esta nova variável, ou melhor, esta nova constante chamada média, 360 00:20:02,390 --> 00:20:06,810 que terá que tipo, você imagina? 361 00:20:06,810 --> 00:20:07,587 Duplo, sim. 362 00:20:07,587 --> 00:20:09,420 Portanto, neste caso, nós não tem que especificá-lo 363 00:20:09,420 --> 00:20:13,450 porque pode ser inferida a partir da operação que tipo de dados média 364 00:20:13,450 --> 00:20:14,730 será. 365 00:20:14,730 --> 00:20:19,025 E Swift é geralmente muito bom sobre ser capaz de inferir os tipos. 366 00:20:19,025 --> 00:20:22,116 367 00:20:22,116 --> 00:20:24,200 >> Você quer ver este executar, ou posso seguir em frente? 368 00:20:24,200 --> 00:20:25,640 Eu quero continuar. 369 00:20:25,640 --> 00:20:28,130 Quaisquer perguntas sobre nada disso? 370 00:20:28,130 --> 00:20:28,630 Ótimo. 371 00:20:28,630 --> 00:20:31,160 372 00:20:31,160 --> 00:20:35,010 >> Agora vamos começar a chegar a as boas funções definidoras stuff--, 373 00:20:35,010 --> 00:20:39,090 e um par de outros tipos que são Swift exclusivo para que você não tem 374 00:20:39,090 --> 00:20:41,620 visto em outros idiomas até este ponto, 375 00:20:41,620 --> 00:20:46,290 mas que estão presentes em outros línguas que você pode encontrar mais tarde. 376 00:20:46,290 --> 00:20:48,210 Então, primeiro, se você quiser para definir uma função, 377 00:20:48,210 --> 00:20:52,170 você defini-lo com a palavra funk função e, em seguida, o nome da função, 378 00:20:52,170 --> 00:20:56,710 e, em seguida, entre parênteses, os argumentos que você deseja que a função de aceitar. 379 00:20:56,710 --> 00:21:00,280 Os argumentos devem também specify-- generally-- 380 00:21:00,280 --> 00:21:05,010 também deve especificar o tipo de dados que eles são, a menos que possam ser inferida. 381 00:21:05,010 --> 00:21:07,500 E veremos que pouco ressalva em apenas um pouco. 382 00:21:07,500 --> 00:21:09,920 >> Portanto, neste caso, temos um função chamada printGradeCount. 383 00:21:09,920 --> 00:21:12,840 Nós estamos indo para aceitar uma variable-- ou melhor, neste caso, 384 00:21:12,840 --> 00:21:14,450 um constant-- chamado gradebook. 385 00:21:14,450 --> 00:21:18,517 E isso vai ser de escreva array de inteiros. 386 00:21:18,517 --> 00:21:20,600 Agora há algo que é realmente importante aqui 387 00:21:20,600 --> 00:21:21,849 que eu quero que você entenda. 388 00:21:21,849 --> 00:21:27,560 Isso é que, por padrão, esses argumentos que são entradas para esta função são 389 00:21:27,560 --> 00:21:34,380 definido com uma palavra-chave let implícita, o que significa que eu não posso modificar este 390 00:21:34,380 --> 00:21:39,850 variável gradebook aqui. 391 00:21:39,850 --> 00:21:43,360 E que espécie de faz sentido, porque você está passando dados in. 392 00:21:43,360 --> 00:21:45,860 E você talvez não quer que ele a ser alterado a partir de debaixo de você. 393 00:21:45,860 --> 00:21:50,800 É possível mencionar explicitamente que esta é uma variável, colocando 394 00:21:50,800 --> 00:21:52,070 a palavra-chave aqui var. 395 00:21:52,070 --> 00:21:56,832 Mas isso é uma pegadinha que nós temos As pessoas notaram ter feito no passado 396 00:21:56,832 --> 00:21:59,790 é que eles assumiram que ele vai para ser uma variável quando, na verdade, 397 00:21:59,790 --> 00:22:02,640 é uma constante. 398 00:22:02,640 --> 00:22:07,340 >> Tudo bem, então aqui, então, neste caso, não estamos especificando qualquer tipo de retorno. 399 00:22:07,340 --> 00:22:09,460 Vamos mostrar-lhe como fazê- que em apenas um momento. 400 00:22:09,460 --> 00:22:12,340 Mas note que temos aqui apenas um simples caso condição. 401 00:22:12,340 --> 00:22:14,560 Se o livro de notas é vazia, que neste caso 402 00:22:14,560 --> 00:22:19,310 é apenas a propriedade desta inteiro array, então nós imprimir algo. 403 00:22:19,310 --> 00:22:23,100 Caso contrário, fazer outra coisa. 404 00:22:23,100 --> 00:22:25,000 >> Bastante simples, até agora eu acho. 405 00:22:25,000 --> 00:22:27,960 Mas me parar se você tiver quaisquer perguntas. 406 00:22:27,960 --> 00:22:33,350 >> Agora esta função, médio, também leva alguns argumentos, ou melhor, um argumento, 407 00:22:33,350 --> 00:22:37,507 que é o livro de notas, e desta vez vai retornar um tipo de casal. 408 00:22:37,507 --> 00:22:39,340 Porque ele está computando a média e é 409 00:22:39,340 --> 00:22:45,010 vai voltar, na verdade, que média calculada para a linha de chamada. 410 00:22:45,010 --> 00:22:50,070 >> Neste caso, especificamos o tipo de retorno após uma seta. 411 00:22:50,070 --> 00:22:53,260 E isso pode se sentir uma espécie de estranho no início. 412 00:22:53,260 --> 00:22:55,610 Você cresceu acostumado para definir o retorno 413 00:22:55,610 --> 00:22:57,720 escreva antes do nome da função. 414 00:22:57,720 --> 00:23:00,310 Mas se você acha deste em termos de matemática, 415 00:23:00,310 --> 00:23:03,320 como quando você tem a matemática que definem uma função, 416 00:23:03,320 --> 00:23:06,807 você tem uma função com alguns insumos, e produz uma saída. 417 00:23:06,807 --> 00:23:08,890 E isso é exatamente o que isto é suposto imitar. 418 00:23:08,890 --> 00:23:12,460 E há um par de outras línguas que tem uma sintaxe semelhante, bem como, 419 00:23:12,460 --> 00:23:15,674 mas provavelmente ninguém que você já viu em CS50. 420 00:23:15,674 --> 00:23:17,090 Mas ainda não ser confundido por ele. 421 00:23:17,090 --> 00:23:21,650 A seta significa que está acontecendo a ser devolvido neste caso. 422 00:23:21,650 --> 00:23:23,650 OK, então como é que vamos para calcular essa média? 423 00:23:23,650 --> 00:23:25,649 Bem, se o livro de notas está vazio, bem, então estamos 424 00:23:25,649 --> 00:23:30,731 vai retornar 0, o que talvez uma forma razoável de tratá-lo. 425 00:23:30,731 --> 00:23:32,980 Eu não sei, vamos chegar de volta para que, em um pouco. 426 00:23:32,980 --> 00:23:34,688 Isto não pode, na verdade, ser uma maneira razoável 427 00:23:34,688 --> 00:23:38,310 para calcular uma média se temos um livro de notas vazio. 428 00:23:38,310 --> 00:23:41,260 >> Então vamos realizar nosso somatório. 429 00:23:41,260 --> 00:23:43,900 Repare que aqui estamos, na verdade, tem uma versão alternativa de um 430 00:23:43,900 --> 00:23:49,190 loop for, o que nos permite fazer uma iteração sobre cada item em uma matriz 431 00:23:49,190 --> 00:23:53,630 e colocar cada elemento em sua própria variável. 432 00:23:53,630 --> 00:23:56,200 Ao especificar para o grau em gradebook, o que estamos dizendo 433 00:23:56,200 --> 00:24:00,560 é que nós vamos implicitamente criar uma nova constante chamada 434 00:24:00,560 --> 00:24:05,180 grau que vai representar cada item único no gradebook 435 00:24:05,180 --> 00:24:06,769 cada vez que o laço for. 436 00:24:06,769 --> 00:24:08,560 Assim, a primeira vez que ele é executado, o grau será 437 00:24:08,560 --> 00:24:09,800 ser o primeiro item no Boletim. 438 00:24:09,800 --> 00:24:12,300 A segunda vez que vai ser a segundo item, assim por diante e assim por diante 439 00:24:12,300 --> 00:24:15,970 até gradebook tem se exauriu de elementos. 440 00:24:15,970 --> 00:24:20,390 Então, vamos ser capazes de resumir que grau em nossa variável somatório 441 00:24:20,390 --> 00:24:22,570 e voltar a nossa média como vimos antes. 442 00:24:22,570 --> 00:24:25,670 443 00:24:25,670 --> 00:24:26,950 OK, todas as perguntas? 444 00:24:26,950 --> 00:24:27,699 Sim? 445 00:24:27,699 --> 00:24:28,990 AUDIÊNCIA: Eu tenho duas perguntas. 446 00:24:28,990 --> 00:24:33,586 Número um, hipoteticamente, pode você corre inteiro em um presente? 447 00:24:33,586 --> 00:24:35,604 Não tem de ser um casal, que é correto? 448 00:24:35,604 --> 00:24:37,520 DAN AMRMENDARIZ: Você pode repetir essa pergunta? 449 00:24:37,520 --> 00:24:39,587 AUDIÊNCIA: Posso fazer inteiro como a média? 450 00:24:39,587 --> 00:24:41,670 DAN AMRMENDARIZ: Você pode fazer inteiro como uma média? 451 00:24:41,670 --> 00:24:45,015 Então retornar um inteiro média em vez de um casal? 452 00:24:45,015 --> 00:24:48,204 >> AUDIÊNCIA: Return-- você têm esse direito agora abaixo. 453 00:24:48,204 --> 00:24:49,870 DAN AMRMENDARIZ: Bem aqui, voltar 0.0? 454 00:24:49,870 --> 00:24:51,790 AUDIÊNCIA: É, basta retornar 0. 455 00:24:51,790 --> 00:24:56,590 Por isso, será tanto 80 ou 85, mas não 85,2. 456 00:24:56,590 --> 00:24:59,465 >> DAN AMRMENDARIZ: Então, nesse caso, por isso há um par de maneiras diferentes 457 00:24:59,465 --> 00:25:00,090 para responder a isso. 458 00:25:00,090 --> 00:25:02,760 Deixe-me responder-los em ordem. 459 00:25:02,760 --> 00:25:06,740 Então, se eu apenas fazer este retorno 0, um 0 é um valor inteiro. 460 00:25:06,740 --> 00:25:09,730 E assim que irá causar um Tipo de erro para este caso 461 00:25:09,730 --> 00:25:13,210 porque ele está esperando um casal mas é, então, retornando um inteiro. 462 00:25:13,210 --> 00:25:16,770 Se eu quiser retornar um inteiro, eu posso. 463 00:25:16,770 --> 00:25:20,450 Eu posso definir o tipo de retorno para int, retornar 0 aqui, 464 00:25:20,450 --> 00:25:22,047 e não executar a divisão de casal. 465 00:25:22,047 --> 00:25:23,880 Mas então estaríamos fazendo a divisão inteira. 466 00:25:23,880 --> 00:25:27,080 E por isso, então não iria receber o média que possivelmente iria esperar. 467 00:25:27,080 --> 00:25:29,210 Mas sim, nós podemos modificar os tipos dessa forma. 468 00:25:29,210 --> 00:25:32,598 >> AUDIÊNCIA: E em segundo lugar, você tem um duplo na parte superior. 469 00:25:32,598 --> 00:25:35,502 Mas lá embaixo, quando você fazer retornar Duplo, 470 00:25:35,502 --> 00:25:38,280 que já está automaticamente retornando formato duplo. 471 00:25:38,280 --> 00:25:42,278 Por que você ainda precisa defini-lo com a seta na parte superior com um duplo? 472 00:25:42,278 --> 00:25:45,010 >> DAN AMRMENDARIZ: Então, no caso, isso é parte 473 00:25:45,010 --> 00:25:50,580 as-- de modo a repetir a pergunta, porque é implícita a partir do retorno 474 00:25:50,580 --> 00:25:56,030 tipos aqui, que tipo isso realmente é, precisamos ser explícito com Swift 475 00:25:56,030 --> 00:25:59,970 sobre o que queremos voltar para fora desta função 476 00:25:59,970 --> 00:26:02,690 de modo que, quando se realiza tipo a verificação, ele pode ter certeza 477 00:26:02,690 --> 00:26:05,850 que o que realmente escrito abaixo, na verdade, está de acordo com isso. 478 00:26:05,850 --> 00:26:10,225 Então, é como uma espécie de cheque consigo mesmo tipo de situação. 479 00:26:10,225 --> 00:26:11,050 Mas há-- 480 00:26:11,050 --> 00:26:12,560 >> AUDIÊNCIA: [inaudível] flecha? 481 00:26:12,560 --> 00:26:19,490 >> DAN AMRMENDARIZ: há casos em que podemos especificar que podemos implicitamente 482 00:26:19,490 --> 00:26:21,550 definir o tipo de retorno. 483 00:26:21,550 --> 00:26:23,940 Mas, neste caso, eu não acho que iria funcionar. 484 00:26:23,940 --> 00:26:26,190 Há alguma outra sintaxe que vamos ver mais tarde. 485 00:26:26,190 --> 00:26:30,320 486 00:26:30,320 --> 00:26:35,280 >> Tudo bem, então esta fonte código é um pouco diferente 487 00:26:35,280 --> 00:26:41,839 porque este analisa argumentos de a função que nós estamos chamando. 488 00:26:41,839 --> 00:26:44,130 Deixe-me mostrar-lhe como ele funciona antes de realmente seguir em frente 489 00:26:44,130 --> 00:26:48,050 para algumas coisas interessantes que está acontecendo na Swift. 490 00:26:48,050 --> 00:26:51,870 >> Portanto, neste caso, se eu executar este código, observe que o que está fazendo 491 00:26:51,870 --> 00:26:54,900 enquanto é--, que tipo de me dá um erro estranho. 492 00:26:54,900 --> 00:26:59,730 Eu preciso passar um par de inteiros como um argumento de linha de comando. 493 00:26:59,730 --> 00:27:06,220 Então vamos ver, 150 e 80, e pressione Enter para descobrir o que ele está realmente fazendo. 494 00:27:06,220 --> 00:27:09,890 É aceitar cada um dos estes valores como inteiros. 495 00:27:09,890 --> 00:27:12,040 É de inseri-las em um livro de notas. 496 00:27:12,040 --> 00:27:14,470 E então ele está executando que o cálculo da média 497 00:27:14,470 --> 00:27:16,650 e saída que como seria de esperar. 498 00:27:16,650 --> 00:27:19,950 >> Mas, obviamente, há algo acontecendo com esse rejeitar algo 499 00:27:19,950 --> 00:27:23,300 algo como um inteiro. 500 00:27:23,300 --> 00:27:27,300 Como você pode se lembrar de quando éramos lidar com argumentos de linha de comando 501 00:27:27,300 --> 00:27:32,640 em C e outras linguagens, a primeira 0-th artigo em que o argumento de linha de comando 502 00:27:32,640 --> 00:27:35,774 lista é o nome do comando que nós realmente executado. 503 00:27:35,774 --> 00:27:38,690 Portanto, neste caso, só estou looping sobre todos os argumentos de linha de comando. 504 00:27:38,690 --> 00:27:41,650 Mas eu não estou fazendo qualquer tipo de fantasia vá para saltar sobre aquele primeiro. 505 00:27:41,650 --> 00:27:45,920 Eu sou apenas explicita ou implicitamente que eu sou verificar que um destes tipos 506 00:27:45,920 --> 00:27:49,900 são inteiros antes de eu realmente efectuar este cálculo. 507 00:27:49,900 --> 00:27:52,420 >> E isso é essencialmente O que está acontecendo aqui. 508 00:27:52,420 --> 00:27:55,860 Para cada argumento em os argumentos do processo, 509 00:27:55,860 --> 00:27:59,210 Eu estou indo para realizar alguma verificação. 510 00:27:59,210 --> 00:28:01,970 E, neste caso, eu vou para tentar primeiro convertido 511 00:28:01,970 --> 00:28:07,620 esse argumento em um número inteiro por executar uma conversão de tipo explícito, 512 00:28:07,620 --> 00:28:12,310 porque ele é, na entrada, uma cadeia de caracteres e não no fato de um número inteiro. 513 00:28:12,310 --> 00:28:18,140 >> Mas este é um tipo de sintaxe estranho, se deixar de grau é igual a Int (argumento). 514 00:28:18,140 --> 00:28:21,120 O que está realmente acontecendo aqui é extremamente 515 00:28:21,120 --> 00:28:24,390 importante para o seu uso Swift. 516 00:28:24,390 --> 00:28:27,610 Isso é usar o que é chamado de tipo opcional. 517 00:28:27,610 --> 00:28:34,790 >> Então esta função, Int (argumento), não apenas retorna um inteiro, mas retorna 518 00:28:34,790 --> 00:28:37,470 o que é chamado um inteiro opcional. 519 00:28:37,470 --> 00:28:41,200 E assim esta é uma espécie de um tipo em cima de um tipo. 520 00:28:41,200 --> 00:28:45,900 Você pode imaginar que tipo de como ele está retornando como um pacote. 521 00:28:45,900 --> 00:28:47,750 E quando você abrir esse pacote, ele quer 522 00:28:47,750 --> 00:28:53,930 tem um número inteiro, o que é o resultado, ou não tem absolutamente nada nele em tudo. 523 00:28:53,930 --> 00:28:58,140 E isso é útil como uma verificação de erros mecanismo, porque neste caso 524 00:28:58,140 --> 00:29:02,080 podemos descobrir, foi esta conversão de tipo bem-sucedido? 525 00:29:02,080 --> 00:29:05,810 Se foi, em seguida, ele é de facto vai ter um número inteiro dentro. 526 00:29:05,810 --> 00:29:08,750 Caso contrário, ele vai ter algum valor que vamos chamar nulo, ou seja 527 00:29:08,750 --> 00:29:10,920 é representativo de qualquer número inteiro de todo. 528 00:29:10,920 --> 00:29:13,270 É realmente representativo de nada. 529 00:29:13,270 --> 00:29:18,130 >> E assim esta construção se permite-nos a desembrulhar esse pacote, 530 00:29:18,130 --> 00:29:19,850 que de ligação opcional. 531 00:29:19,850 --> 00:29:25,560 E se somos capazes de desembrulhar que empacotar e encontrar um número inteiro dentro, 532 00:29:25,560 --> 00:29:27,720 então o que estamos dizendo aqui é que vamos, então, 533 00:29:27,720 --> 00:29:33,090 permitir que o valor a ser definido em esta constante chamado grau. 534 00:29:33,090 --> 00:29:36,590 E esta parte do if, a parte superior da instrução if 535 00:29:36,590 --> 00:29:40,390 será executado, porque isso desembrulhar foi bem sucedida. 536 00:29:40,390 --> 00:29:43,290 >> Se isso só acontece que houve um erro, talvez, 537 00:29:43,290 --> 00:29:47,040 neste tipo de conversão explícita a partir de uma seqüência de caracteres para um número inteiro, talvez 538 00:29:47,040 --> 00:29:49,160 é o valor ABC por exemplo. 539 00:29:49,160 --> 00:29:52,120 E isso é realmente não vai para converter em um inteiro. 540 00:29:52,120 --> 00:29:55,520 Em seguida, ele retornará nil, que não é um número inteiro. 541 00:29:55,520 --> 00:29:57,570 E esta declaração se bem, então falhar. 542 00:29:57,570 --> 00:30:01,930 grau não existirá porque ele não tem nenhum conteúdo inteiro. 543 00:30:01,930 --> 00:30:06,391 E ele será executado este bloco outra vez. 544 00:30:06,391 --> 00:30:06,890 Sim? 545 00:30:06,890 --> 00:30:09,652 >> AUDIÊNCIA: Nil é N-I-L? 546 00:30:09,652 --> 00:30:11,110 DAN AMRMENDARIZ: nil é N-I-L, sim. 547 00:30:11,110 --> 00:30:14,970 548 00:30:14,970 --> 00:30:20,310 >> Portanto, este é talvez um dos coisas mais difíceis de Swift, 549 00:30:20,310 --> 00:30:23,690 especialmente quando você está em as ervas daninhas em um aplicativo iOS 550 00:30:23,690 --> 00:30:27,442 e você está realmente tentando para fazer algum desenvolvimento lá. 551 00:30:27,442 --> 00:30:29,400 Vai estar gritando em você sobre opcionais. 552 00:30:29,400 --> 00:30:33,050 Vai ser perguntando para você pontos de interrogação e pontos de exclamação. 553 00:30:33,050 --> 00:30:37,100 Mas uma vez que você descobrir se você out-- dedicar algum tempo para descobrir 554 00:30:37,100 --> 00:30:41,990 o que está acontecendo com os tipos de opcionais, você vai salvar um monte de dor de cabeça 555 00:30:41,990 --> 00:30:46,040 como você está tentando escrever um aplicativo em Swift. 556 00:30:46,040 --> 00:30:47,660 >> Na verdade, é um recurso muito poderoso. 557 00:30:47,660 --> 00:30:49,826 E você vai ter que tomar minha palavra para ela por enquanto. 558 00:30:49,826 --> 00:30:52,620 Mas vamos ver essa construção e alguns outros como ele 559 00:30:52,620 --> 00:30:56,740 em algumas das outras código-fonte que vamos mostrar-lhe em apenas um pouco. 560 00:30:56,740 --> 00:31:00,440 >> Existem dúvidas iniciais aqui? 561 00:31:00,440 --> 00:31:03,790 562 00:31:03,790 --> 00:31:08,690 Assim, o importante é que estaladiça um Tipo opcional é uma espécie de metatype. 563 00:31:08,690 --> 00:31:12,500 Ou ela tem um valor, e se isso acontecer, então ele 564 00:31:12,500 --> 00:31:18,110 talvez tenha que valor associado com ele, ou ela não tem valor algum, 565 00:31:18,110 --> 00:31:19,620 e é representado por nulo. 566 00:31:19,620 --> 00:31:24,210 567 00:31:24,210 --> 00:31:28,870 O resto esta é talvez como seria de esperar. 568 00:31:28,870 --> 00:31:32,900 >> Então, vamos rampa até o dificuldade mais uma vez. 569 00:31:32,900 --> 00:31:37,070 E desta vez, vamos dar uma olhada em algumas outros tipos de dados que realmente existem. 570 00:31:37,070 --> 00:31:41,290 Um deles é dicionários, que é muito semelhante ao dicionários Python. 571 00:31:41,290 --> 00:31:48,270 É um pouco semelhante a uma tabela hash C. É, essencialmente, um mapeamento de teclas 572 00:31:48,270 --> 00:31:49,820 onde as chaves podem ser strings. 573 00:31:49,820 --> 00:31:52,670 E quando você olha para cima essas chaves, aquelas chaves terão um valor. 574 00:31:52,670 --> 00:31:56,020 Portanto, não é uma real ordem, mas em vez disso, mais estreitamente associados 575 00:31:56,020 --> 00:31:58,810 a um mapa de hash ou uma tabela hash. 576 00:31:58,810 --> 00:32:02,420 >> Vamos ver como isto é suposto para trabalhar antes que efectivamente 577 00:32:02,420 --> 00:32:05,210 ir para o próprio código fonte. 578 00:32:05,210 --> 00:32:07,680 Se eu executar este, nada realmente acontece. 579 00:32:07,680 --> 00:32:12,430 Está me dizendo que eu estou esperando alguns parâmetros do tipo seguinte. 580 00:32:12,430 --> 00:32:16,050 Então, eu estou indo para fornecer a que alguns nomes conjunto de problemas, 581 00:32:16,050 --> 00:32:18,490 pset0 assim, talvez eu tenho 100. 582 00:32:18,490 --> 00:32:20,790 E pset1, eu tenho a 5. 583 00:32:20,790 --> 00:32:24,630 E então no exame, eu fez muito bem e conseguiu 30. 584 00:32:24,630 --> 00:32:27,180 E oops, eu bati um espaço aqui. 585 00:32:27,180 --> 00:32:30,940 >> Quando eu pressionar Enter, você pode ver ele realiza alguma computação. 586 00:32:30,940 --> 00:32:33,740 Diz gradebook é de três notas, pset1, pset0, exame. 587 00:32:33,740 --> 00:32:36,120 E o livro de notas tem esta média específica. 588 00:32:36,120 --> 00:32:38,370 Então, novamente, estamos trabalhando com esta ideia gradebook, 589 00:32:38,370 --> 00:32:44,650 mas vamos continuar a iteração com a complexidade da nossa função. 590 00:32:44,650 --> 00:32:47,650 >> Então, no início, nós somos apenas vai criar uma função que 591 00:32:47,650 --> 00:32:49,390 é responsável por imprimir o uso. 592 00:32:49,390 --> 00:32:51,920 E há essa saída função que será apenas 593 00:32:51,920 --> 00:32:53,710 forçosamente sair da aplicação. 594 00:32:53,710 --> 00:32:56,530 Isso não é algo que você vai usar em iOS app. 595 00:32:56,530 --> 00:32:59,750 Esta é apenas, neste caso, com um argumento de linha de comando. 596 00:32:59,750 --> 00:33:01,990 Em seguida, vamos começar a se mover em direção Xcode. 597 00:33:01,990 --> 00:33:07,760 Mas esta é específica para um comando programa de estilo de linha em Swift. 598 00:33:07,760 --> 00:33:11,490 >> Vamos dar uma olhada em algumas das as coisas interessantes aqui. 599 00:33:11,490 --> 00:33:15,150 Vamos ver, apenas um par de coisas interessantes para falar, talvez, 600 00:33:15,150 --> 00:33:19,930 é que na minha função de imprimir o número de graus, 601 00:33:19,930 --> 00:33:26,090 você deve se lembrar que eu tinha que lista de pset1 itens--, pset0, e exame. 602 00:33:26,090 --> 00:33:29,130 Você pode realmente rapidamente e fazer isso facilmente 603 00:33:29,130 --> 00:33:34,490 tomando o livro de notas, que é um dicionário que tem chaves e valores. 604 00:33:34,490 --> 00:33:38,730 Encontre todas a chave é através o método de pontos chaves aqui, 605 00:33:38,730 --> 00:33:43,180 e, em seguida, usar esse joinWithSeparator, que, então, tomar todas as chaves 606 00:33:43,180 --> 00:33:48,590 que tínhamos digitada, ou pset1-- desculpe, pset0, pset1, e exam-- 607 00:33:48,590 --> 00:33:53,030 e concatenar-los juntos usando uma vírgula e um espaço 608 00:33:53,030 --> 00:33:55,400 para criar uma cadeia longa. 609 00:33:55,400 --> 00:34:00,190 Esta operação de junção é apenas fenomenal úteis numa variedade de contextos. 610 00:34:00,190 --> 00:34:03,450 E assim é esta joinWithSeparator. 611 00:34:03,450 --> 00:34:06,939 >> E isso é uma coisa que é Swift alterado de 1 a 2 SWIFT. 612 00:34:06,939 --> 00:34:08,730 Costumava haver um Style-- Python se você for 613 00:34:08,730 --> 00:34:13,219 familiarizado com Python-- um Python estilo juntar método em strings. 614 00:34:13,219 --> 00:34:15,699 Mas isso não é mais o caso em Swift 2. 615 00:34:15,699 --> 00:34:19,400 Você quer usar isso se você quiser para concatenar uma série de coisas 616 00:34:19,400 --> 00:34:23,380 juntamente com uma corda. 617 00:34:23,380 --> 00:34:27,889 >> Por isso, talvez, em seguida, em nossa discussão de médio antes, 618 00:34:27,889 --> 00:34:32,659 ele faz um pouco mais de sentido para nós para definir a função média 619 00:34:32,659 --> 00:34:36,610 para ser uma dupla opcional em vez que apenas um casal explícito. 620 00:34:36,610 --> 00:34:39,239 Porque nós tivemos que condição incomum, onde, 621 00:34:39,239 --> 00:34:41,550 o que na verdade se gradebook não tem valores dentro dele? 622 00:34:41,550 --> 00:34:44,280 Qual deve ser o retorno médio? 623 00:34:44,280 --> 00:34:46,350 >> Bem, talvez em C você teria feito algo 624 00:34:46,350 --> 00:34:50,040 como forneceu um valor de sentinela, como 0,0, ou talvez um número negativo, 625 00:34:50,040 --> 00:34:53,690 ou apenas algo que representa o fato de que havia alguma condição de erro 626 00:34:53,690 --> 00:34:57,910 e você talvez não têm efectivamente a capacidade de calcular essa média. 627 00:34:57,910 --> 00:35:05,590 Bem, a beleza de especificar um opcional tipo seria fazer isso. 628 00:35:05,590 --> 00:35:09,540 E eu estou dizendo agora todas estas palavras, mas isso realmente não usa opcionais. 629 00:35:09,540 --> 00:35:12,970 Mas vamos ver isso em apenas minutos onde podemos definir média 630 00:35:12,970 --> 00:35:17,230 ser um tipo de dados de modo que opcional se ele realmente retorna alguns dados, em seguida, 631 00:35:17,230 --> 00:35:18,470 vamos retornar esses dados. 632 00:35:18,470 --> 00:35:20,570 Caso contrário, vamos voltar nil, dizendo que este 633 00:35:20,570 --> 00:35:22,200 não tem computação significativa. 634 00:35:22,200 --> 00:35:25,650 635 00:35:25,650 --> 00:35:28,570 >> Vamos passar para outra coisa. 636 00:35:28,570 --> 00:35:35,910 Assim, a partir daqui, nós estive olhando todos estes exemplos na linha de comando. 637 00:35:35,910 --> 00:35:39,470 Mas realmente o que você está indo estar lidando com é Xcode. 638 00:35:39,470 --> 00:35:43,720 E uma das coisas agradáveis ​​sobre Xcode é, e especificamente em Swift, 639 00:35:43,720 --> 00:35:47,450 é que temos esta coisa chamada um parque infantil. 640 00:35:47,450 --> 00:35:51,470 E um parque infantil é não é de todo um aplicativo iOS. 641 00:35:51,470 --> 00:35:54,751 Mas ele permite que você a experimentar com Swift de uma forma muito fácil. 642 00:35:54,751 --> 00:35:56,000 Você pode digitar todo o seu código. 643 00:35:56,000 --> 00:35:58,140 É bem sintaxe destaque aqui. 644 00:35:58,140 --> 00:36:01,600 Quando você cria um novo arquivo, ele irá pedir se você quer criar um campo de jogos. 645 00:36:01,600 --> 00:36:08,720 Mas a coisa agradável sobre o campo de jogos é que no lado direito da sua janela, 646 00:36:08,720 --> 00:36:12,020 ele realmente mostrar-lhe saída do seu código. 647 00:36:12,020 --> 00:36:16,110 Então, se eu rolar para baixo, podemos ver o que a saída de várias linhas de código 648 00:36:16,110 --> 00:36:17,200 na verdade passa a ser. 649 00:36:17,200 --> 00:36:19,850 650 00:36:19,850 --> 00:36:26,790 >> Portanto, neste caso, nós vamos mudar de direção apenas um pouco 651 00:36:26,790 --> 00:36:30,960 e falar sobre algo que é realmente importante desta forma nível elevado 652 00:36:30,960 --> 00:36:34,020 Swift que opera, e é essa idéia de encerramentos. 653 00:36:34,020 --> 00:36:36,960 E você provavelmente já viu este um pouco em JavaScript. 654 00:36:36,960 --> 00:36:40,770 Para aqueles de vocês que estão em CS50, encerramentos 655 00:36:40,770 --> 00:36:47,240 são muito populares maneira muito boa de fazer, coisas de alto nível em línguas modernas. 656 00:36:47,240 --> 00:36:50,270 Mas é também uma espécie de difícil quebrar a cabeça em torno do primeiro tempo. 657 00:36:50,270 --> 00:36:52,269 Então, se você olhar para este primeira vez, isso é OK. 658 00:36:52,269 --> 00:36:56,740 Basta olhar para o código-fonte e veja se você pode descobrir isso em casa. 659 00:36:56,740 --> 00:37:01,050 >> Portanto, neste caso, vamos dizer que nós quer criar um monte de expoentes 660 00:37:01,050 --> 00:37:04,134 com algum valor fixo. 661 00:37:04,134 --> 00:37:05,800 Portanto, neste caso, posso criar uma função. 662 00:37:05,800 --> 00:37:09,270 Eu vou chamá-lo de poder de 2 propósito cujo único na vida 663 00:37:09,270 --> 00:37:15,770 é tomar alguma entrada e dupla dele, e retornar esse valor. 664 00:37:15,770 --> 00:37:21,210 Repare que aqui estou eu aceitar um tipo de dados. 665 00:37:21,210 --> 00:37:23,137 Vai ser uma variável chamada x. 666 00:37:23,137 --> 00:37:23,970 É do tipo Double. 667 00:37:23,970 --> 00:37:26,190 E eu estou indo para retornar um casal aqui. 668 00:37:26,190 --> 00:37:29,100 E eu estou indo só para fazer muito, francamente, muito 669 00:37:29,100 --> 00:37:32,650 maneira ingênua de duplicar este valor. 670 00:37:32,650 --> 00:37:35,600 E eu vou te mostrar por que isso é útil em apenas um segundo. 671 00:37:35,600 --> 00:37:40,418 >> Note que aqui nós temos essa gama mais uma vez. para algo em 1, ponto 672 00:37:40,418 --> 00:37:44,130 ponto a ponto, 2, o que significa que este laço será executado duas vezes. 673 00:37:44,130 --> 00:37:46,480 Mas isso representa uma variável dummy. 674 00:37:46,480 --> 00:37:49,650 Isso significa que eu não estou indo realmente para estar usando essa variável em qualquer lugar 675 00:37:49,650 --> 00:37:51,070 no interior deste circuito. 676 00:37:51,070 --> 00:37:55,380 Eu só quero que esta linha de código para ser executado duas vezes, 677 00:37:55,380 --> 00:37:58,980 sem precisar saber o valor do referido intervalo. 678 00:37:58,980 --> 00:38:02,570 >> Portanto, neste caso eu estou correndo resultado vezes x duas vezes e que, essencialmente, 679 00:38:02,570 --> 00:38:06,560 significa que eu estou em quadratura com este valor. 680 00:38:06,560 --> 00:38:10,230 E isso acontece com trabalhar como seria de esperar. 681 00:38:10,230 --> 00:38:16,410 Potência de 2, passando um valor de 2.0 nos dá uma saída de 4. 682 00:38:16,410 --> 00:38:18,810 3.2 obras para 10,24. 683 00:38:18,810 --> 00:38:22,660 >> Agora podemos fazer um semelhante coisa de poder, de 3. 684 00:38:22,660 --> 00:38:25,330 Mas agora alterar apenas o intervalo. 685 00:38:25,330 --> 00:38:28,840 Para dummy em 1 a 3, multiplicar 3 vezes, 686 00:38:28,840 --> 00:38:29,830 e fazer a mesma coisa. 687 00:38:29,830 --> 00:38:32,240 >> Portanto, este pode se sentir um pouco artificial. 688 00:38:32,240 --> 00:38:34,270 Mas há uma importante coisa aqui que 689 00:38:34,270 --> 00:38:37,770 é que olhando para estes duas funções, há 690 00:38:37,770 --> 00:38:43,600 apenas uma coisa que é diferente, que é este valor no intervalo. 691 00:38:43,600 --> 00:38:46,910 Tudo mais sobre estes dois funções, potência de 3 e potência de 2, 692 00:38:46,910 --> 00:38:50,440 são, de facto, idênticas porque elas funcionam da mesma maneira. 693 00:38:50,440 --> 00:38:53,460 >> Então, neste momento, um pouco sino de alarme deve ser a sair. 694 00:38:53,460 --> 00:38:56,200 Esperemos que o que você está dizendo, você sabe, este se sente um pouco 695 00:38:56,200 --> 00:38:59,250 como a duplicação de esforços. 696 00:38:59,250 --> 00:39:02,950 Talvez haja uma maneira que eu faria ser capaz de encapsular tudo isto 697 00:39:02,950 --> 00:39:06,630 e proporcionar uma função ou criar uma função que 698 00:39:06,630 --> 00:39:11,550 faz exatamente o que eu quero, sem a necessidade de digitá-la explicitamente. 699 00:39:11,550 --> 00:39:15,732 E é isso que o poder de um encerramento nos permite fazer. 700 00:39:15,732 --> 00:39:16,940 Então, vamos dar uma olhada nisso. 701 00:39:16,940 --> 00:39:18,700 E eu vou passar um par minutos a esta, porque esta 702 00:39:18,700 --> 00:39:20,310 é muito importante para a Swift. 703 00:39:20,310 --> 00:39:22,900 Vemos isso o tempo todo. 704 00:39:22,900 --> 00:39:24,550 Vamos definir uma função. 705 00:39:24,550 --> 00:39:26,380 Vai ser chamado powerof. 706 00:39:26,380 --> 00:39:29,470 Vai aceitar um parâmetro chamado y do tipo Int. 707 00:39:29,470 --> 00:39:32,220 Mas dê uma olhada no tipo de retorno. 708 00:39:32,220 --> 00:39:38,730 O tipo de retorno é, na parênteses, Double seta dupla. 709 00:39:38,730 --> 00:39:43,370 O que significa que esta função, powerof esta função, 710 00:39:43,370 --> 00:39:46,550 está retornando uma função. 711 00:39:46,550 --> 00:39:50,845 Isso está aceitando um casal e retornando um duplo. 712 00:39:50,845 --> 00:39:53,720 De modo que pode parecer meio louco, mas vamos rolar para baixo um pouco 713 00:39:53,720 --> 00:39:55,060 e olhar para ver o que acontece. 714 00:39:55,060 --> 00:39:57,910 Estamos dentro dessa função powerof. 715 00:39:57,910 --> 00:40:00,760 Estamos criando uma nova função chamado exponentiator, 716 00:40:00,760 --> 00:40:02,900 mas não importa o que é. 717 00:40:02,900 --> 00:40:06,410 >> Observe que este tem um valor de entrada de x. 718 00:40:06,410 --> 00:40:09,910 E ele está levando em uma de casal e retornando um duplo. 719 00:40:09,910 --> 00:40:16,320 E isto é o mesmo código que nós viu acima, excepto que o valor de 2 720 00:40:16,320 --> 00:40:20,060 ou o valor de 3, de que limite superior desse intervalo, 721 00:40:20,060 --> 00:40:23,210 foi substituído com este valor de y, que 722 00:40:23,210 --> 00:40:27,230 foi o parâmetro inicial da nossa função powerof. 723 00:40:27,230 --> 00:40:31,700 E, neste ponto, nós retornar exponentiator. 724 00:40:31,700 --> 00:40:33,345 Estamos voltando a função. 725 00:40:33,345 --> 00:40:36,300 726 00:40:36,300 --> 00:40:39,550 >> É como uma espécie de pequena mente blowing. 727 00:40:39,550 --> 00:40:44,360 Mas vamos imaginar o que acontece quando eu chamar essa função powerof 728 00:40:44,360 --> 00:40:47,610 e passar para ele algum valor como 2. 729 00:40:47,610 --> 00:40:50,020 O que isto significa é que Agora tenho o valor 730 00:40:50,020 --> 00:40:55,130 2 para y, o que significa que este valor y nesta função exponentiator 731 00:40:55,130 --> 00:40:56,410 será que o valor 2. 732 00:40:56,410 --> 00:41:01,290 Mas eu estou voltando este exponentiator função. 733 00:41:01,290 --> 00:41:05,900 >> Então, observe o que Swift diz que eu criaram neste caso. 734 00:41:05,900 --> 00:41:10,550 deixe praça é uma definição, é uma função que aceita um duplo 735 00:41:10,550 --> 00:41:12,610 e retorna um duplo. 736 00:41:12,610 --> 00:41:16,590 Eu criei uma função que algo quadrados 737 00:41:16,590 --> 00:41:19,782 utilizando este mecanismo aqui. 738 00:41:19,782 --> 00:41:22,490 E realmente o que está acontecendo é que ele está retornando esta função 739 00:41:22,490 --> 00:41:26,390 exponentiator, mas este valor y está envolvido dentro dele. 740 00:41:26,390 --> 00:41:31,080 E então agora cada vez que eu usar este esta variável ou constante chamada 741 00:41:31,080 --> 00:41:35,180 praça, ele vai a comportar-se como uma função. 742 00:41:35,180 --> 00:41:39,960 E para que eu possa, em seguida, chamar essa variável como eu chamaria de uma função, 743 00:41:39,960 --> 00:41:43,830 e passá-la para um número, como neste caso 3. 744 00:41:43,830 --> 00:41:45,910 E eu, então, conciliar esse valor. 745 00:41:45,910 --> 00:41:53,340 Então, em seguida, 3 ao quadrado tornar-se 9, como podemos ver aqui. 746 00:41:53,340 --> 00:41:56,530 >> Realmente louco, mas isso agora me permite a oportunidade 747 00:41:56,530 --> 00:41:59,040 para criar outras funções powerof. 748 00:41:59,040 --> 00:42:03,680 Como eu posso dizer, OK, bem, agora eu quero para criar uma nova função, powerof (3), 749 00:42:03,680 --> 00:42:06,290 e armazenar isso em um chamado cubo constante. 750 00:42:06,290 --> 00:42:10,220 E agora cubo vai ser um função separada que irá, em seguida, 751 00:42:10,220 --> 00:42:14,800 levar algum valor como entrada e cubo que valor, como podemos ver na linha de fundo 752 00:42:14,800 --> 00:42:16,420 Aqui. 753 00:42:16,420 --> 00:42:18,590 cubo de 2 vai resultar em 8. 754 00:42:18,590 --> 00:42:21,330 755 00:42:21,330 --> 00:42:22,680 >> Esperemos que coisas muito arrumado. 756 00:42:22,680 --> 00:42:25,920 Você nunca viu isso antes. 757 00:42:25,920 --> 00:42:29,990 Encorajo-vos a olhar para encerramentos e investigar isso um pouco mais. 758 00:42:29,990 --> 00:42:33,570 É uma coisa realmente poderosa vemos um monte em JavaScript e outras linguagens. 759 00:42:33,570 --> 00:42:37,160 É realmente vital para APIs compreender bem 760 00:42:37,160 --> 00:42:38,620 que nós vamos chegar a em apenas um segundo. 761 00:42:38,620 --> 00:42:39,456 Sim? 762 00:42:39,456 --> 00:42:43,740 >> AUDIÊNCIA: Quando você faz powerof (2), parêntesis, e, em seguida 763 00:42:43,740 --> 00:42:48,764 outro parêntese, outro input-- basicamente você está substituindo a praça. 764 00:42:48,764 --> 00:42:50,930 DAN AMRMENDARIZ: Então olhe na última linha aqui. 765 00:42:50,930 --> 00:42:55,930 Na verdade, é totalmente possível fazer isso encadeamento como você sugeriu. 766 00:42:55,930 --> 00:43:00,990 Então powerof (5) significa que nós estamos indo ter um exponentiator de 5 até aqui. 767 00:43:00,990 --> 00:43:04,160 Portanto, este é essencialmente vai ser o mesma coisa que 4 para o quinto poder, 768 00:43:04,160 --> 00:43:07,200 porque nós criamos um exponencializando funcionar ao quinto poder, 769 00:43:07,200 --> 00:43:09,920 e nós estamos passando para que funcionar o valor 4. 770 00:43:09,920 --> 00:43:12,619 E nós temos esse valor que esperamos, 1024. 771 00:43:12,619 --> 00:43:14,785 AUDIÊNCIA: E não é um nomear, por isso torna mais fácil 772 00:43:14,785 --> 00:43:16,570 a ler, a praça que seja. 773 00:43:16,570 --> 00:43:17,903 >> DAN AMRMENDARIZ: Certo, exatamente. 774 00:43:17,903 --> 00:43:21,120 Então, antes de colocá-la em uma constante aqui de modo 775 00:43:21,120 --> 00:43:23,808 que tornou fácil de usar esse nome. 776 00:43:23,808 --> 00:43:24,308 Sim? 777 00:43:24,308 --> 00:43:26,942 >> AUDIÊNCIA: Neste contexto powerof, é parte 778 00:43:26,942 --> 00:43:30,774 da linguagem de programação em oposição à maneira como você 779 00:43:30,774 --> 00:43:33,952 pensar em powerof em [inaudível]? 780 00:43:33,952 --> 00:43:35,660 DAN AMRMENDARIZ: Então, Neste caso, powerof 781 00:43:35,660 --> 00:43:39,280 é simplesmente o nome do função que eu definido aqui em cima. 782 00:43:39,280 --> 00:43:41,801 Portanto, não é inerente para a própria linguagem, 783 00:43:41,801 --> 00:43:43,550 mas em vez disso, é só uma função que possui 784 00:43:43,550 --> 00:43:45,628 esse nome porque eu dar-lhe esse nome. 785 00:43:45,628 --> 00:43:48,770 786 00:43:48,770 --> 00:43:51,920 Alguma outra pergunta? 787 00:43:51,920 --> 00:43:52,800 Tudo certo. 788 00:43:52,800 --> 00:43:54,750 >> Agora, isso é ótimo. 789 00:43:54,750 --> 00:43:58,170 Mas você não vai ver um série de funções de fecho que 790 00:43:58,170 --> 00:44:03,440 são como este onde você define, dentro de uma função, uma outra função. 791 00:44:03,440 --> 00:44:04,320 E você pode fazê-lo. 792 00:44:04,320 --> 00:44:06,430 Mas não é o tipo de realmente necessário, certo? 793 00:44:06,430 --> 00:44:09,189 Como por que eu definir esta função chamada exponentiator 794 00:44:09,189 --> 00:44:10,480 e, em seguida, devolvê-lo imediatamente. 795 00:44:10,480 --> 00:44:15,220 Por que não posso apenas imediatamente retornar essa função? 796 00:44:15,220 --> 00:44:18,890 >> E, de fato, este é precisamente a idéia por trás de um conceito chamado 797 00:44:18,890 --> 00:44:22,410 funções anônimas, onde funções anônimas na verdade não 798 00:44:22,410 --> 00:44:25,270 tem um nome, porque eles Não é necessário ter um. 799 00:44:25,270 --> 00:44:28,700 E assim, neste caso, em 7B, podemos encontrar exatamente o que. 800 00:44:28,700 --> 00:44:31,470 É tudo o mesmo código, faz exatamente a mesma coisa, 801 00:44:31,470 --> 00:44:35,570 mas agora nós mudamos-lo um pouco para que esta função powerof imediatamente 802 00:44:35,570 --> 00:44:37,750 retorna uma função. 803 00:44:37,750 --> 00:44:44,150 Observe que após o regresso, há um colchete aberto. 804 00:44:44,150 --> 00:44:46,410 Ele está esperando esta entrada dobro. 805 00:44:46,410 --> 00:44:48,560 Ele está esperando que a saída de casal. 806 00:44:48,560 --> 00:44:52,175 E, em seguida, a palavra-chave separa o código em si. 807 00:44:52,175 --> 00:44:53,550 Portanto, esta é uma função anônima. 808 00:44:53,550 --> 00:44:57,030 Na verdade, não tem um nome, enquanto antes de ter sido chamado exponentiator. 809 00:44:57,030 --> 00:45:00,229 Mas, como vimos, apenas realmente não se referia a exponentiator 810 00:45:00,229 --> 00:45:01,270 fora dessa função. 811 00:45:01,270 --> 00:45:02,470 Por isso, não importa. 812 00:45:02,470 --> 00:45:06,300 Portanto, esta função anônima é assim chamado porque é sem nome, 813 00:45:06,300 --> 00:45:09,107 mas ele ainda está sendo usado no contexto deste código. 814 00:45:09,107 --> 00:45:13,690 815 00:45:13,690 --> 00:45:16,079 >> O casal próximo que eu sou vai continuar esperançosamente 816 00:45:16,079 --> 00:45:17,370 soprando sua mente um pouco. 817 00:45:17,370 --> 00:45:20,410 Podemos simplificar ainda mais. 818 00:45:20,410 --> 00:45:24,490 Porque, como foi astutamente apontado anteriormente, 819 00:45:24,490 --> 00:45:29,100 talvez nós realmente sabe, por inferindo a partir deste código, o que 820 00:45:29,100 --> 00:45:31,750 a saída deste código vai ser. 821 00:45:31,750 --> 00:45:38,180 E, de fato, nesta função anônima, que pode, de facto, inferir os tipos de dados. 822 00:45:38,180 --> 00:45:41,650 >> Então, em um presente, já não precisa definir explicitamente 823 00:45:41,650 --> 00:45:44,850 o tipo de dados que está sendo entrada e saída desta função 824 00:45:44,850 --> 00:45:45,890 para um par de razões. 825 00:45:45,890 --> 00:45:51,390 Uma delas é que nós definimos, até ao protótipo da função delimitador, 826 00:45:51,390 --> 00:45:55,770 que tipo de dados que este anônimos função deve entrada e saída. 827 00:45:55,770 --> 00:45:57,900 E do outro, nós pode-se inferir a partir do código 828 00:45:57,900 --> 00:46:01,930 aqui que estamos aceitando entrada que é do tipo Double 829 00:46:01,930 --> 00:46:03,670 e retornando um duplo. 830 00:46:03,670 --> 00:46:07,890 >> Note que aqui nós não tem explicitamente definido os nomes dos argumentos 831 00:46:07,890 --> 00:46:11,220 que esta função está aceitando. 832 00:46:11,220 --> 00:46:16,180 E assim vemos que pode se referir a esses parâmetros usando US $ 0, $ 1, 833 00:46:16,180 --> 00:46:20,140 assim por diante e assim por diante, dependendo que o número de parâmetro usados 834 00:46:20,140 --> 00:46:20,850 nesta função. 835 00:46:20,850 --> 00:46:23,370 836 00:46:23,370 --> 00:46:29,740 >> Isso é algo que você está indo para ver um monte é este colchete aberto 837 00:46:29,740 --> 00:46:32,797 seguido por uma definição R $ 0, e depois alguma operação, 838 00:46:32,797 --> 00:46:34,130 e, em seguida, um colchete fechado. 839 00:46:34,130 --> 00:46:38,630 Essa é uma função anônima que executa esta operação. 840 00:46:38,630 --> 00:46:42,940 Ele tem esse parâmetro onde é tipo é inferido. 841 00:46:42,940 --> 00:46:44,860 Esse primeiro parâmetro é $ 0. 842 00:46:44,860 --> 00:46:49,010 E alguma operação é acontecendo naquele $ 0. 843 00:46:49,010 --> 00:46:52,100 >> AUDIÊNCIA: Então o cifrão parâmetro significa, basicamente, 844 00:46:52,100 --> 00:46:53,429 e 0 significa o primeiro? 845 00:46:53,429 --> 00:46:54,720 DAN ARMENDARIZ: Isso está correto. 846 00:46:54,720 --> 00:46:59,100 Assim, o sinal de dólar significa, basicamente, parâmetro, e 0 significa que a primeira. 847 00:46:59,100 --> 00:47:02,760 Mas ele funciona especificamente em Neste caso onde eu não tenha nomeado 848 00:47:02,760 --> 00:47:07,940 os argumentos a minha função anônima. 849 00:47:07,940 --> 00:47:11,119 >> AUDIÊNCIA: Será que Perl ou algo tem este sinal de dólar, dólar 0 lá? 850 00:47:11,119 --> 00:47:12,702 DAN ARMENDARIZ: Será que, me desculpe? 851 00:47:12,702 --> 00:47:15,360 AUDIÊNCIA: Será que Perl tem esta dólar 0, dólar 1-- 852 00:47:15,360 --> 00:47:17,318 DAN ARMENDARIZ: Eu não sou muito familiarizado com Perl, 853 00:47:17,318 --> 00:47:21,340 PHP mas o que define variáveis com base em sinais de dólar. 854 00:47:21,340 --> 00:47:26,120 E pode haver alguns idiomas que têm características como esta. 855 00:47:26,120 --> 00:47:28,240 Na verdade, Swift pede uma monte de recursos como este 856 00:47:28,240 --> 00:47:29,489 a partir de um monte de outras línguas. 857 00:47:29,489 --> 00:47:32,380 Vemos indícios de Python na mesma. 858 00:47:32,380 --> 00:47:35,800 Esta definição de tipo parece vir do OCaml. 859 00:47:35,800 --> 00:47:38,932 E nós temos apenas um monte de material de lotes de diferentes línguas. 860 00:47:38,932 --> 00:47:40,640 Esse é um dos agradável coisas sobre Swift 861 00:47:40,640 --> 00:47:43,390 é que ele tem um monte de o melhor idéias de um grupo de idiomas 862 00:47:43,390 --> 00:47:47,229 e shoehorns-los todos juntos em uma linguagem super. 863 00:47:47,229 --> 00:47:49,520 Na verdade, se você me permitir a continuar soprando sua mente, 864 00:47:49,520 --> 00:47:51,000 por isso temos vindo a fazer tudo isso. 865 00:47:51,000 --> 00:47:56,690 Podemos talvez simplificar isso um pouco bit por perceber que, é claro, 866 00:47:56,690 --> 00:48:02,120 Swift tem uma exponencializando função incorporada. 867 00:48:02,120 --> 00:48:04,660 Se eu importar Darwin, que é apenas que a biblioteca 868 00:48:04,660 --> 00:48:09,680 apresenta esta função chamada prisioneiro de guerra, agora Eu posso simplificar o meu poder de função 869 00:48:09,680 --> 00:48:11,830 para ser o seguinte. 870 00:48:11,830 --> 00:48:15,860 Ele vai voltar esta função anônima. 871 00:48:15,860 --> 00:48:17,950 >> Mas olhe o quão simples isso é agora. 872 00:48:17,950 --> 00:48:22,780 Esta é uma função anônima que está a aceitar dados de algum tipo, 873 00:48:22,780 --> 00:48:26,600 e ele vai ser um argumento especificamente, 874 00:48:26,600 --> 00:48:29,320 referenciada em $ 0 que é do tipo Double. 875 00:48:29,320 --> 00:48:32,680 Ele vai retornar um tipo duplo. 876 00:48:32,680 --> 00:48:35,760 Mas a instrução de retorno agora é implícito. 877 00:48:35,760 --> 00:48:39,990 >> E é este estilo exato que é muito, muito prevalente na Swift, 878 00:48:39,990 --> 00:48:40,790 por todo o lugar. 879 00:48:40,790 --> 00:48:43,190 Nós vamos ver isso todo o tempo em Swift. 880 00:48:43,190 --> 00:48:46,150 Então, eu estou mostrando tudo isso para você por causa dessa sintaxe. 881 00:48:46,150 --> 00:48:49,070 Isto é muito comum para ver, o que significa que 882 00:48:49,070 --> 00:48:51,420 é uma função anônima que está a efectuar 883 00:48:51,420 --> 00:48:54,640 alguma operação sobre esses argumentos. 884 00:48:54,640 --> 00:48:56,940 E há um retorno implícito. 885 00:48:56,940 --> 00:49:01,850 Por isso, é absolutamente a mesma coisa para nos dizer isto, aqui mesmo. 886 00:49:01,850 --> 00:49:05,730 887 00:49:05,730 --> 00:49:08,150 >> Porque este encaracolado suporte é uma função, 888 00:49:08,150 --> 00:49:10,480 estamos executar esta operação no primeiro argumento. 889 00:49:10,480 --> 00:49:12,170 Nós vamos voltar isso. 890 00:49:12,170 --> 00:49:14,815 Mas esse retorno exterior é voltando toda essa função, 891 00:49:14,815 --> 00:49:19,855 Toda essa função anônima que acabou de criar. 892 00:49:19,855 --> 00:49:21,689 Alguma outra pergunta? 893 00:49:21,689 --> 00:49:23,980 Tudo bem, eu não sei se vocês estão prontos para isso, 894 00:49:23,980 --> 00:49:27,455 mas podemos ir ainda mais louco com Swift. 895 00:49:27,455 --> 00:49:28,560 Esta pronto? 896 00:49:28,560 --> 00:49:29,930 OK, isso é ótimo. 897 00:49:29,930 --> 00:49:35,310 >> Agora nós realmente ter a capacidade para, em Swift, devido à forma como modular 898 00:49:35,310 --> 00:49:39,650 e como protocolo baseado é, a definir nossos próprios operadores que freaking. 899 00:49:39,650 --> 00:49:44,060 Como neste caso, não tínhamos operador para exponentiation-- bem, 900 00:49:44,060 --> 00:49:47,990 para a realização de poderes de alguma coisa. 901 00:49:47,990 --> 00:49:53,632 Mas eu posso, na Swift, definir um novo operador que faz precisamente isso. 902 00:49:53,632 --> 00:49:55,590 Portanto, neste caso há um bando de sintaxe aqui. 903 00:49:55,590 --> 00:49:59,980 E eu vou permitir que você olhar para ele em casa quando você olha para isto. 904 00:49:59,980 --> 00:50:06,890 Mas estamos definindo este infix operador, **, que irá permitir-nos, 905 00:50:06,890 --> 00:50:09,840 definindo o que isso ** função realmente 906 00:50:09,840 --> 00:50:15,010 que, para aceitar uma mão esquerda lado e um lado direito, 907 00:50:15,010 --> 00:50:21,190 e, em seguida, voltar para o expoente dessa lado esquerdo para o lado direito. 908 00:50:21,190 --> 00:50:24,850 >> E agora, de repente eu criaram um novo numerador. 909 00:50:24,850 --> 00:50:29,490 Então, 2 ** 3 significa 2 para a terceira potência. 910 00:50:29,490 --> 00:50:34,420 [MENTE SÃ SOPRO] Este por em si deve fazer você ser como, 911 00:50:34,420 --> 00:50:37,960 OK, parafuso C. Vou Swift todo o caminho. 912 00:50:37,960 --> 00:50:38,740 Isso é ótimo. 913 00:50:38,740 --> 00:50:40,140 Isso é muito fantástico. 914 00:50:40,140 --> 00:50:42,240 >> Embora este é um grande exemplo. 915 00:50:42,240 --> 00:50:45,570 Mas eu nunca tenho uma vez fora deste exemplo realmente 916 00:50:45,570 --> 00:50:46,800 definida meu próprio operador. 917 00:50:46,800 --> 00:50:49,710 Mas ainda assim, ele mostra uma Muito do poder do Swift 918 00:50:49,710 --> 00:50:54,050 e por que isso é, na verdade, realmente muito legal. 919 00:50:54,050 --> 00:50:55,832 OK, sim? 920 00:50:55,832 --> 00:50:57,790 Audiência: Se você é definir o seu próprio operador, 921 00:50:57,790 --> 00:51:02,940 como você sabe que você não acidentalmente tentar criar um operador que é 922 00:51:02,940 --> 00:51:06,040 em algum lugar em C, como escondido em algum lugar Swift, 923 00:51:06,040 --> 00:51:12,210 como uma obscura, que pode não ter visto antes. 924 00:51:12,210 --> 00:51:15,050 >> DAN ARMENDARIZ: Então, se você está tentando para definir os seus próprios operadores, 925 00:51:15,050 --> 00:51:20,970 existe o risco de que define um sobre um operador existente. 926 00:51:20,970 --> 00:51:24,870 Que entra em um nível de detalhe que Eu não acho que temos tempo para passar por cima. 927 00:51:24,870 --> 00:51:27,620 Mas isso é um risco. 928 00:51:27,620 --> 00:51:31,320 E isso é de fato a razão pela qual Eu não utilizar o símbolo de acento circunflexo, que 929 00:51:31,320 --> 00:51:36,210 quando estamos digitando o poder, nós normalmente usar pouco acento circunflexo 4 5 ou algo 930 00:51:36,210 --> 00:51:40,560 assim, apenas quando estamos Gchatting amigos ou qualquer outra coisa. 931 00:51:40,560 --> 00:51:43,660 Mas, nesse caso, que na verdade teria provocado uma colisão. 932 00:51:43,660 --> 00:51:46,450 E assim eu evitava-lo apenas porque Aconteceu de eu saber, neste caso, 933 00:51:46,450 --> 00:51:50,430 que que causaria que a colisão. 934 00:51:50,430 --> 00:51:52,270 >> Tudo certo. 935 00:51:52,270 --> 00:51:55,080 Agora, infelizmente, para os últimos sete minutos, 936 00:51:55,080 --> 00:51:57,410 Eu tenho que manter sopro suas mentes um pouco. 937 00:51:57,410 --> 00:52:00,230 Então, permita-me mostrar-lhe algumas outras coisas também. 938 00:52:00,230 --> 00:52:03,710 >> Nós mostramos-lhe esta ideia de tendo estas funções anônimas, 939 00:52:03,710 --> 00:52:07,040 estes encerramentos que permitem que você tipo de passar funções ao redor. 940 00:52:07,040 --> 00:52:08,100 Você pode devolvê-los. 941 00:52:08,100 --> 00:52:09,490 Você pode manipulá-los. 942 00:52:09,490 --> 00:52:11,790 Você pode fazer todos os tipos de coisas loucas. 943 00:52:11,790 --> 00:52:14,850 >> Mas uma outra coisa que passa a ser útil 944 00:52:14,850 --> 00:52:19,740 é a capacidade de, ao contrário para devolver essas funções 945 00:52:19,740 --> 00:52:25,146 em uma função, para passar uma função como um parâmetro para outra função. 946 00:52:25,146 --> 00:52:30,430 Você pode estar pensando bem por que na Terra que eu iria querer fazer algo assim? 947 00:52:30,430 --> 00:52:33,660 >> Bem, digamos que eu quero a tomar este operador que eu 948 00:52:33,660 --> 00:52:40,260 trabalhou tão duro para criar e aplicar -lo para um monte de números diferentes 949 00:52:40,260 --> 00:52:41,770 em uma matriz. 950 00:52:41,770 --> 00:52:46,700 Portanto, neste caso eu tenho uma matriz de integers-- 1, 4, 7, 2, 5, 10, 56. 951 00:52:46,700 --> 00:52:48,080 E eu quero dobrar todos eles. 952 00:52:48,080 --> 00:52:50,430 A maneira que nós faria normalmente fazê-lo é apenas escrever 953 00:52:50,430 --> 00:52:53,440 um loop for simples que itera sobre todos eles 954 00:52:53,440 --> 00:52:57,140 e realizar algum tipo de operação quadrado sobre eles, 955 00:52:57,140 --> 00:53:02,700 introduzir os novos valores em uma nova variável, ou melhor, uma nova matriz aqui. 956 00:53:02,700 --> 00:53:07,370 E o valor da saída de resultado é, em seguida, todas essas matrizes, 957 00:53:07,370 --> 00:53:10,200 ou em vez de todos aqueles elementos agora ao quadrado. 958 00:53:10,200 --> 00:53:12,680 >> E nós poderíamos fazer o mesmo cubing coisa para ele, 959 00:53:12,680 --> 00:53:15,360 mas um pequeno sino de alarme deve ir off 960 00:53:15,360 --> 00:53:17,360 dizendo que talvez haja alguma maneira que faríamos 961 00:53:17,360 --> 00:53:19,860 ser capaz de simplificar isso um pouco. 962 00:53:19,860 --> 00:53:21,130 E na verdade não existe. 963 00:53:21,130 --> 00:53:25,320 E se pudéssemos criar uma função que nos permite 964 00:53:25,320 --> 00:53:28,350 a aceitar, como um predador, uma função? 965 00:53:28,350 --> 00:53:30,350 Portanto, neste caso, tomar uma olhar para estes argumentos. 966 00:53:30,350 --> 00:53:33,220 Nós estamos indo para aceitar uma lista de duplas. 967 00:53:33,220 --> 00:53:35,030 E então nós vamos a aceitar uma função 968 00:53:35,030 --> 00:53:40,990 em uma variável chamada F que vai para tomar um casal e retornar um duplo. 969 00:53:40,990 --> 00:53:43,320 E toda a produção desta função inteira 970 00:53:43,320 --> 00:53:47,310 chamado de mapeador vai retornar um array chamado duplo. 971 00:53:47,310 --> 00:53:52,380 >> O que isto seria, então permita-me fazer é iterar sobre essa lista 972 00:53:52,380 --> 00:53:56,350 e fazer a mesma coisa, mas agora aplicar essa função em cada 973 00:53:56,350 --> 00:53:58,970 dos valores individuais na lista. 974 00:53:58,970 --> 00:54:00,750 Então, eu realmente não sei o que é f. 975 00:54:00,750 --> 00:54:02,010 Não importa para mim. 976 00:54:02,010 --> 00:54:06,530 Mas desde que leva em um casal, realizar alguma operação sobre ele, 977 00:54:06,530 --> 00:54:08,640 e, em seguida, retorna uma Duplo, eu seria, então, 978 00:54:08,640 --> 00:54:13,415 capaz de mapear essa função através cada elemento na lista. 979 00:54:13,415 --> 00:54:16,270 980 00:54:16,270 --> 00:54:20,930 >> E esse tipo de programação é chamadas funções de ordem superior, 981 00:54:20,930 --> 00:54:24,440 onde estamos passando funções em torno de como parâmetros 982 00:54:24,440 --> 00:54:26,430 e fazer as coisas com funções. 983 00:54:26,430 --> 00:54:29,640 É uma espécie de como tomar todos estes idéias que aprendemos em CS50 984 00:54:29,640 --> 00:54:31,390 e levá-los espécie do para o nível seguinte. 985 00:54:31,390 --> 00:54:34,140 E isso é tudo coisa estilo CS51. 986 00:54:34,140 --> 00:54:37,080 E assim vamos em profundidade mais nas aulas como essa. 987 00:54:37,080 --> 00:54:38,930 >> Mas esta é também importante aqui, porque nós 988 00:54:38,930 --> 00:54:42,010 ver um monte de funções que são utilizados em Swift 989 00:54:42,010 --> 00:54:45,590 que faz essencialmente este, onde temos 990 00:54:45,590 --> 00:54:48,300 alguns números, alguns matriz de números. 991 00:54:48,300 --> 00:54:50,850 Nós vamos passar isso matriz em nosso mapeador. 992 00:54:50,850 --> 00:54:55,770 E nós também vamos passar alguma função, que 993 00:54:55,770 --> 00:54:57,950 nós já definido aqui em cima. 994 00:54:57,950 --> 00:54:59,690 Vai ser quadrado. 995 00:54:59,690 --> 00:55:02,220 E nós estamos indo, em seguida, quadratura todos esses números 996 00:55:02,220 --> 00:55:04,710 e armazenar isso em este resultado aqui. 997 00:55:04,710 --> 00:55:07,280 998 00:55:07,280 --> 00:55:11,000 >> Então, neste caso, nós definimos nossa própria função chamada mapeador. 999 00:55:11,000 --> 00:55:15,370 Mas essa coisa exata é, Na verdade, construído em Swift. 1000 00:55:15,370 --> 00:55:18,960 Há uma variedade de funções chamado mapa. 1001 00:55:18,960 --> 00:55:21,520 Há uma função de mapa, há uma função de reduzir, 1002 00:55:21,520 --> 00:55:25,630 e há uma função de filtro, que se aplicam essencialmente funções 1003 00:55:25,630 --> 00:55:30,782 para cada elemento em um lista para modificá-los de alguma forma. 1004 00:55:30,782 --> 00:55:34,510 >> AUDIÊNCIA: Então, já que você está transformando os dados para outro formato 1005 00:55:34,510 --> 00:55:36,134 através de um function-- 1006 00:55:36,134 --> 00:55:37,050 DAN ARMENDARIZ: Certo. 1007 00:55:37,050 --> 00:55:39,420 É, portanto, a função que nós estamos aceitando 1008 00:55:39,420 --> 00:55:41,790 está transformando os dados de alguma forma. 1009 00:55:41,790 --> 00:55:44,700 Neste caso, ambos os nós quadratura-lo, ou que foram cubing-lo, 1010 00:55:44,700 --> 00:55:50,060 ou realmente, poderíamos realizar nenhuma operação sobre ele em tudo. 1011 00:55:50,060 --> 00:55:54,150 >> Mas deixe-me mostrar-lhe então como este vai olhar na prática. 1012 00:55:54,150 --> 00:55:56,681 E novamente, eu estou correndo um pouco de tempo. então eu não tenho 1013 00:55:56,681 --> 00:55:59,430 vai ser capaz de passar por cima de tudo do código-fonte aqui em detalhe. 1014 00:55:59,430 --> 00:56:00,721 Mas eu encorajá-lo a fazer isso. 1015 00:56:00,721 --> 00:56:03,850 Vamos publicá-la o mais rapidamente possível após essa conversa. 1016 00:56:03,850 --> 00:56:07,610 >> Mas se você der uma olhada nisso, assumir que temos uma lista de números, 1017 00:56:07,610 --> 00:56:10,260 uma matriz de números nesta números chamados variáveis. 1018 00:56:10,260 --> 00:56:16,670 Então eu quero executar este operação do filtro sobre esses números. 1019 00:56:16,670 --> 00:56:19,730 Assim, é um filtro maior função a fim de que 1020 00:56:19,730 --> 00:56:24,660 aceita uma matriz e também uma função. 1021 00:56:24,660 --> 00:56:28,760 E em que cada elemento array, ele executa essa função. 1022 00:56:28,760 --> 00:56:31,990 >> Se essa função retorna verdade, ele mantém esse item. 1023 00:56:31,990 --> 00:56:36,100 Se essa função retorna falso, ele joga fora esse item. 1024 00:56:36,100 --> 00:56:40,480 E, em seguida, ele retorna uma lista que é então constituída por todos 1025 00:56:40,480 --> 00:56:44,360 desses itens que foram filtradas. 1026 00:56:44,360 --> 00:56:47,150 >> Portanto, em outras palavras, este é a mesma idéia, o livro de notas. 1027 00:56:47,150 --> 00:56:50,800 Podemos ter uma variedade de classes a este valor os números de chamada. 1028 00:56:50,800 --> 00:56:55,590 Poderia ser 100, e 70, e 40, assim por diante e assim por diante. 1029 00:56:55,590 --> 00:56:59,110 O que este filtro faz é aviso que este é que o açúcar sintático 1030 00:56:59,110 --> 00:57:01,310 para uma função anônima. 1031 00:57:01,310 --> 00:57:05,980 Esta é uma função anônima dizendo que o parâmetro que eu estou aceitando 1032 00:57:05,980 --> 00:57:09,690 vai ser, se é superior a 70, 1033 00:57:09,690 --> 00:57:15,837 então isso irá retornar true, o que significa que produto que vai ser mantido neste filtro. 1034 00:57:15,837 --> 00:57:17,920 Então, vamos ser um pouco mais concreto sobre isso. 1035 00:57:17,920 --> 00:57:25,760 Se eu tenho essa matriz de números e consiste em 100, 70 e 40, 1036 00:57:25,760 --> 00:57:29,730 Eu executar este filtro operação em cada um desses. 1037 00:57:29,730 --> 00:57:33,270 Assim que este é um primeiro valor de 100. 1038 00:57:33,270 --> 00:57:36,770 100 maior ou igual 70 é verdade, que 1039 00:57:36,770 --> 00:57:41,950 significa que 100 é mantido em esta nova cópia desta matriz. 1040 00:57:41,950 --> 00:57:44,290 70 também passa. 1041 00:57:44,290 --> 00:57:46,020 Mas 40 não. 1042 00:57:46,020 --> 00:57:54,290 Então, o que é devolvido em passingCount é a matriz de elementos 100 e 70-- 1043 00:57:54,290 --> 00:57:57,410 100, vírgula, 70. 1044 00:57:57,410 --> 00:57:59,870 Aqueles foram os dois únicos itens que foram mantidos. 1045 00:57:59,870 --> 00:58:03,740 E assim a razão de eu rapidamente passou por um monte de este tipo de ordem alta 1046 00:58:03,740 --> 00:58:08,680 as coisas são, porque isso é tão comum coisa que você vai ver em Swift bonita 1047 00:58:08,680 --> 00:58:16,810 com freqüência, está realizando alguma operação usando esta sintaxe função anônima. 1048 00:58:16,810 --> 00:58:18,450 >> Há algumas coisas interessantes. 1049 00:58:18,450 --> 00:58:24,730 Os switches são realmente poderoso em Swift, Quero dizer apenas como um louco, louco poderoso. 1050 00:58:24,730 --> 00:58:28,250 Você pode usar o interruptor, e você pode realmente aplicá-las 1051 00:58:28,250 --> 00:58:33,160 a intervalos, o que é meio louco, e fazer coisas extravagantes como isso. 1052 00:58:33,160 --> 00:58:37,540 >> Mas, nos últimos minutos, Eu quero pular muito longe 1053 00:58:37,540 --> 00:58:46,940 e mostrar-lhe um exemplo concreto de como podemos criar em iOS app usando Swift. 1054 00:58:46,940 --> 00:58:49,040 Então, quando você está fazendo isso, você vai ter que tomar 1055 00:58:49,040 --> 00:58:51,990 um olhar sobre at-- Apple documentação, eles 1056 00:58:51,990 --> 00:58:56,084 tem um monte de realmente bons tutoriais para criar a sua primeira aplicação. 1057 00:58:56,084 --> 00:58:58,250 E eu encorajo você a fazer isso porque eles levá-lo 1058 00:58:58,250 --> 00:59:04,110 através de todos os passos do que exactamente à clique em criar um aplicativo iOS. 1059 00:59:04,110 --> 00:59:07,290 >> Mas aqui nós temos este app iOS. 1060 00:59:07,290 --> 00:59:10,960 E é um app realmente muito simples. 1061 00:59:10,960 --> 00:59:13,840 Se eu executar isso, deixe-me mostrar você é o que parece. 1062 00:59:13,840 --> 00:59:19,480 Tudo o que essencialmente faz é puxa a partir da Internet um arquivo JSON 1063 00:59:19,480 --> 00:59:22,300 que eu tenha armazenado em um servidor. 1064 00:59:22,300 --> 00:59:26,310 E esse arquivo JSON define imagens que permitem 1065 00:59:26,310 --> 00:59:31,680 me para então percorrer, em minha app, imagens do meu servidor web. 1066 00:59:31,680 --> 00:59:32,880 >> Então, eu tenho aqui getNextImage. 1067 00:59:32,880 --> 00:59:37,100 Ele carrega uma imagem a partir da Internet, e depois o exibe na tela. 1068 00:59:37,100 --> 00:59:38,200 >> Por isso é muito simples. 1069 00:59:38,200 --> 00:59:41,550 Mas o objetivo aqui é mostrar como podemos combinar as coisas 1070 00:59:41,550 --> 00:59:47,820 Deste último semanas de CS50 em uma aplicação real iOS. 1071 00:59:47,820 --> 00:59:53,140 Em outras palavras, talvez um dos coisas que você vai querer fazer 1072 00:59:53,140 --> 00:59:56,340 é ter um aplicativo iOS que pode extrair dados a partir da Internet 1073 00:59:56,340 --> 00:59:59,070 e mostrar ao utilizador uma informação. 1074 00:59:59,070 --> 01:00:03,130 Isto é inteiramente o ponto deste código-fonte aqui. 1075 01:00:03,130 --> 01:00:07,890 >> Portanto, há muito a ser dito sobre como fazer desenvolvimento real iOS. 1076 01:00:07,890 --> 01:00:12,860 Há um monte de sintaxe louco que não temos visto muito ainda 1077 01:00:12,860 --> 01:00:15,580 como uma classe, uma classe que realmente é. 1078 01:00:15,580 --> 01:00:19,470 Podemos ignorar em grande parte que, por enquanto. 1079 01:00:19,470 --> 01:00:23,250 >> Mas note que tenham contido dentro desta uma variedade de coisas 1080 01:00:23,250 --> 01:00:27,720 que já vimos como funções que têm nomes específicos. 1081 01:00:27,720 --> 01:00:32,650 E quando damos àqueles Funciona os nomes corretos 1082 01:00:32,650 --> 01:00:36,530 que são esperados pelo iOS, de fato isto parece um pouco mágico. 1083 01:00:36,530 --> 01:00:40,300 Mas quando você cria um aplicativo iOS, há 1084 01:00:40,300 --> 01:00:47,590 são os nomes das funções específicas que são chamados pelo próprio telefone 1085 01:00:47,590 --> 01:00:52,440 como o aplicativo está carregando para tentar para criar o processo que efectivamente 1086 01:00:52,440 --> 01:00:54,787 executa o aplicativo. 1087 01:00:54,787 --> 01:00:58,120 Então, novamente, há um monte de coisas que eu tem que passar por cima aqui para que nós 1088 01:00:58,120 --> 01:01:00,570 para falar sobre isso especificamente. 1089 01:01:00,570 --> 01:01:06,050 Mas eu encorajo-vos a olhar para talvez outro seminário iOS, mas também alguns 1090 01:01:06,050 --> 01:01:09,290 do tutoriais on-line que fazer um trabalho muito melhor de descrever 1091 01:01:09,290 --> 01:01:11,030 a informação específica. 1092 01:01:11,030 --> 01:01:15,760 >> Mas podemos ver um par de coisas que são interessantes a partir do código aqui. 1093 01:01:15,760 --> 01:01:17,950 Observe que temos se declarações. 1094 01:01:17,950 --> 01:01:20,400 By the way, um importante coisa sobre se as declarações 1095 01:01:20,400 --> 01:01:24,860 é que os parênteses em torno da Expressão booleana são opcionais. 1096 01:01:24,860 --> 01:01:30,800 Mas as chaves não são opcionais, não importa o quão poucas ou muitas linhas de código 1097 01:01:30,800 --> 01:01:32,360 você tem em uma instrução if. 1098 01:01:32,360 --> 01:01:38,670 Você não pode ter um if sem chaves em Swift. 1099 01:01:38,670 --> 01:01:41,000 >> E este é, assim, uma espécie de bobo. 1100 01:01:41,000 --> 01:01:43,910 Mas há razões históricas para isso. 1101 01:01:43,910 --> 01:01:46,180 É suposto salvá-lo de si mesmo. 1102 01:01:46,180 --> 01:01:49,899 Gosta dessa por exemplo, você não pode eliminar as chaves em torno de que 1103 01:01:49,899 --> 01:01:50,440 if. 1104 01:01:50,440 --> 01:01:52,730 Aqueles são na verdade necessária. 1105 01:01:52,730 --> 01:01:54,480 Então, eu encorajá-lo a dê uma olhada neste. 1106 01:01:54,480 --> 01:01:56,230 Mas há mais uma construir o que eu quero 1107 01:01:56,230 --> 01:02:02,640 para mostrar-lhe que sobre Swift é nova para Swift 2.0 comparação 1108 01:02:02,640 --> 01:02:08,460 para versões mais antigas do Swift, que é o seguinte. 1109 01:02:08,460 --> 01:02:11,620 Vamos ver onde é que eu colocá-lo aqui? 1110 01:02:11,620 --> 01:02:16,630 >> Portanto, nesta função chamada fetchJSON, esta função 1111 01:02:16,630 --> 01:02:23,450 é responsável por puxar que JSON arquivo de uma URL, o que só acontece 1112 01:02:23,450 --> 01:02:26,310 estar em execução no meu CS50 IDE. 1113 01:02:26,310 --> 01:02:28,580 Eu só comecei a Apache, colocar meu arquivo JSON lá, 1114 01:02:28,580 --> 01:02:32,110 e eu sou capaz de puxe que dados da internet usando 1115 01:02:32,110 --> 01:02:36,430 esta função e este URL, que é fornecido pelo telefone. 1116 01:02:36,430 --> 01:02:40,490 É fornecido por um biblioteca que você usa quando 1117 01:02:40,490 --> 01:02:43,140 você está fazendo algum desenvolvimento app iOS. 1118 01:02:43,140 --> 01:02:49,690 >> Note aqui que há esta incomum construção sintática chamado guarda. 1119 01:02:49,690 --> 01:02:53,530 E realmente tudo isso está em Swift é uma maneira de verificar 1120 01:02:53,530 --> 01:02:56,870 que algumas coisas têm foram atendidos antes que você 1121 01:02:56,870 --> 01:03:00,000 prosseguir com o resto da função. 1122 01:03:00,000 --> 01:03:04,260 Então, eu poderia ter, usando este tipo opcional, 1123 01:03:04,260 --> 01:03:10,530 Eu poderia ter encontrado o URL por de executar esta função NSURL 1124 01:03:10,530 --> 01:03:16,640 e armazenar isso em uma URL constante, e, em seguida, verificar 1125 01:03:16,640 --> 01:03:20,820 URL para ver se era nula, porque estava indo para retornar um tipo opcional. 1126 01:03:20,820 --> 01:03:25,660 E se fosse nula, então eu iria imprimir um erro e depois voltar. 1127 01:03:25,660 --> 01:03:29,970 >> Mas em vez disso, o que permite que guarda nós fazemos é que muito coisa, 1128 01:03:29,970 --> 01:03:34,550 mas garantir que ele é realmente o caso que url 1129 01:03:34,550 --> 01:03:38,020 foi devidamente definido pelo NSURL. 1130 01:03:38,020 --> 01:03:41,810 E se for, então salta sobre isso, e ele 1131 01:03:41,810 --> 01:03:46,110 irá permitir-lhe avançar com url tendo sido adequadamente definidas. 1132 01:03:46,110 --> 01:03:48,830 Mas, se for o caso de que url não está devidamente definido, 1133 01:03:48,830 --> 01:03:52,550 se esta função retorna um erro ou alguma outra coisa inesperada 1134 01:03:52,550 --> 01:03:58,030 na verdade, ocorre, este construto guarda permite-nos então a saída que o erro 1135 01:03:58,030 --> 01:04:00,390 e retornar imediatamente. 1136 01:04:00,390 --> 01:04:00,890 Sim? 1137 01:04:00,890 --> 01:04:04,839 >> AUDIÊNCIA: Então é tipo de como um se então mais? 1138 01:04:04,839 --> 01:04:07,130 DAN ARMENDARIZ: É uma espécie de como um se então mais, sim, 1139 01:04:07,130 --> 01:04:14,200 exceto que esta url é, então, definido para tudo isso abaixo. 1140 01:04:14,200 --> 01:04:20,420 Se ele passar pela guarda, então ele será efectivamente preenchido com dados 1141 01:04:20,420 --> 01:04:29,500 e utilizáveis ​​nos restantes código fonte em sua função. 1142 01:04:29,500 --> 01:04:33,790 Então, eu suspeito que você vai começar a ver este guarda também. 1143 01:04:33,790 --> 01:04:36,670 E estar atento a isso. 1144 01:04:36,670 --> 01:04:46,270 >> Então, basta olhar para um par de outro coisas, isso aqui é o que, 1145 01:04:46,270 --> 01:04:53,377 você acha que, apenas com base no que nós estávamos falando antes? 1146 01:04:53,377 --> 01:04:56,650 >> AUDIÊNCIA: Acho que vai correr na lista? 1147 01:04:56,650 --> 01:04:59,100 >> DAN ARMENDARIZ: Assim que é perto. 1148 01:04:59,100 --> 01:05:02,360 Esta é uma função que estamos definindo. 1149 01:05:02,360 --> 01:05:07,240 E nós estamos introduzindo essa função como um argumento para esta função aqui. 1150 01:05:07,240 --> 01:05:09,120 >> AUDIÊNCIA: [inaudível], se não nulo. 1151 01:05:09,120 --> 01:05:11,470 Portanto, é na lista, certo? 1152 01:05:11,470 --> 01:05:15,450 >> DAN ARMENDARIZ: Se o erro não é nulo, de modo que é-- então eu tenho que percorrer. 1153 01:05:15,450 --> 01:05:18,060 Bem, vamos ver, eu realmente não posso rolar para a direita aqui. 1154 01:05:18,060 --> 01:05:23,161 erro é um argumento que está sendo passado para esta função anônima. 1155 01:05:23,161 --> 01:05:24,410 Esta é uma função anônima. 1156 01:05:24,410 --> 01:05:25,480 Não tem nome. 1157 01:05:25,480 --> 01:05:29,850 Mas estamos aceitando estes três argumentos, dados, resposta, e erro. 1158 01:05:29,850 --> 01:05:33,590 E ele está indo para retornar void, então ele não vai retornar nada. 1159 01:05:33,590 --> 01:05:37,910 E este é o conteúdo dessa função. 1160 01:05:37,910 --> 01:05:41,961 E então nós temos acesso ao interior que função para cada um desses argumentos. 1161 01:05:41,961 --> 01:05:45,650 1162 01:05:45,650 --> 01:05:48,679 >> Portanto, é um turbilhão excursão da língua. 1163 01:05:48,679 --> 01:05:50,470 Mas eu espero que com isso, espero que você tomar 1164 01:05:50,470 --> 01:05:54,490 uma olhada em alguns dos tutoriais específico para o desenvolvimento iOS com Swift, 1165 01:05:54,490 --> 01:05:57,481 especialmente se você vai para Desenvolvedor web página-- da Apple 1166 01:05:57,481 --> 01:05:59,980 eles têm um monte de realmente bom tutoriais para você começar. 1167 01:05:59,980 --> 01:06:05,010 Mas espero que apenas nesta hora de falar sobre a sintaxe em si tem dado 1168 01:06:05,010 --> 01:06:08,760 você o suficiente para começar com isso. 1169 01:06:08,760 --> 01:06:12,950 >> Vamos postar tudo isso fonte código no site do seminário 1170 01:06:12,950 --> 01:06:17,800 logo que possível, e também as lâminas então você tem uma referência para todos aqueles. 1171 01:06:17,800 --> 01:06:20,530 Mas boa sorte com seus projetos. 1172 01:06:20,530 --> 01:06:23,640 E obrigado a todos muito por ter vindo. 1173 01:06:23,640 --> 01:06:26,990 >> [Aplausos] 1174 01:06:26,990 --> 01:06:28,026