Aprenda a desenvolver aplicativos para iOS e SwiftUI (2021) | Chris Ching | Skillshare

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Aprenda a desenvolver aplicativos para iOS e SwiftUI (2021)

teacher avatar Chris Ching, Co-Founder of CodeWithChris.com

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      Introdução

      0:48

    • 2.

      01: o Ecosystem da Apple

      3:59

    • 3.

      02: Tutorial de Xcode

      20:09

    • 4.

      03: como criar interfaces de usuários

      13:21

    • 5.

      04: visualizações que and containers

      11:40

    • 6.

      05: crie a interface de cartões de guerra

      15:23

    • 7.

      06: variáveis constants e tipos de dados

      14:42

    • 8.

      07: funções de programação Swift

      21:23

    • 9.

      08: estruturas de programação Swift

      15:22

    • 10.

      09: instâncias de programação Swift

      26:42

    • 11.

      10: botões: SwiftUI

      15:02

    • 12.

      11: Propriedades do estado

      13:46

    • 13.

      12: se as declarações 12:

      14:55

    • 14.

      13: desafio bônus

      1:58

    • 15.

      14: o que está a ela?

      4:15

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

1.555

Estudantes

8

Projetos

Sobre este curso

Ei, é Chris aqui.

Quero dar uma boa mensagem por dar o primeiro passo na jornada de aplicativos e oferecer algumas palavras com conselhos e encorajamento.

Uma vista, pode parecer que um curso que você fez antes, mas é muito mais que isso.

Este é material de treinamento que eu utilizei e refino desde 2013 e milhares de estudantes já passou a ser a

Além disso, foi meu meu esforço de tempo completo nos últimos 8 anos que significa que as pessoas estão apoiando me e pagando por este treinamento, porque estão recebendo resultados. Estou dizer tudo isso, porque espero que não I'm a transformação que você vai passar pelos próximos 14 dias.

Essas aulas foram para trazer você a nível o mundo do desenvolvimento de aplicativos iOS, mesmo que a a mesma linha de código.

Você vai ter uma ideia de como aplicativos são criados, como o código Swift pode ser entendido e escrito até mesmo por não codificadores e você também vai fazer seu primeiro aplicativo concluindo este desafio.

Depois de completar esses 14 dias, você tem uma decisão a tom.. deseja continuar o caminho a caminho de aprendizagem que pode ser resultado em uma nova carreira ou negócios?

Ou talvez você tenha descobrir que o desenvolvimento de aplicativos não é para você e não é you .

de forma, essa maneira sólida e a e earnest para o desenvolvimento de aplicativos iOS aplicativos e estou muito humilde que você está aprendendo com eu.

Eu appreciate isso. Agradecemos você.

Tudo Bem, posso esperar para começar, vamos lá!

Chris

Conheça seu professor

Teacher Profile Image

Chris Ching

Co-Founder of CodeWithChris.com

Professor

If you’re a beginner and you want to learn app development step by step, in plain simple terms, then you’ve come to the right place.

Thousands of people, just like you, have used my actionable video and article tutorials to go from a beginner to a full fledged iOS developer.

What makes CodeWithChris different is the focus on staying motivated through small gains while building momentum to get to the finish line and cross the “Hump”.

My effective and motivational approach is why thousands of beginners are finding success using my material.

If you’d like to learn more, join my Skillshare class, visit CodeWithChris.com or search for CodeWithChris on YouTube.

Visualizar o perfil completo

Level: Beginner

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. Introdução: Olá e seja bem-vindo. Neste desafio para iniciantes de 14 dias, você começará sua jornada com um estrondo. Você aprenderá como os aplicativos são feitos e como eles acabam na loja de aplicativos. Você se familiarizará com o Xcode e portanto, iniciará seu próprio projeto de aplicativo. Você aprenderá a criar interfaces de usuário com a interface do usuário Swift. E você aprenderá os conceitos básicos de programação Swift para que você possa ler e escrever um código Swift simples. Agora, nas próximas 14 lições, você ganhará todas essas novas habilidades. E você criará seu próprio aplicativo que pode instalar no seu dispositivo e mostrar a todos os seus amigos e familiares o que você fez. Mais importante do que isso, no entanto, você ficará extremamente confiante e animado para continuar crescendo suas habilidades de desenvolvimento de aplicativos além do que abordamos aqui. Isso realmente pode ser o começo de algo novo para você. Ok, então se você estiver pronto, vamos arregaçar as mangas e começar. 2. 01: o Ecosystem da Apple: Vou percorrer este diagrama e depois, vou te dizer onde obter todas as peças, tudo começa com o Xcode IDE. Agora, IDE significa Integrated Development Environment, que é um termo para o aplicativo e todas as ferramentas que um desenvolvedor usa para criar algo. Para o resto deste curso, vamos simplesmente chamá-lo de Xcode. É aqui que criamos nosso aplicativo escrevendo código Swift, construindo a interface do usuário ou a interface do usuário para abreviar e conectá-lo com todos os nossos dados. Swift é a linguagem de programação que usamos para expressar nossa lógica e dizer ao sistema o que queremos fazer. Podemos até criar a interface do usuário por meio de código rápido, como você verá em breve. Agora, o Swift UI é uma estrutura de interface do usuário que facilita a criação rápida aplicativos para todas as plataformas apple. Um bom benefício de aprender a interface do usuário Xcode, rápida e rápida é que elas são as mesmas habilidades e ferramentas usadas para criar todos os aplicativos para todas as plataformas da Apple, incluindo iOS, iPadOS, tvOS, watchOS, e Mac OS. E, em alguns casos, seu aplicativo poderá funcionar em várias plataformas sem muitas alterações. Agora, depois que seu aplicativo for criado, você pode distribuí-lo com a App Store da Apple. Isso é feito juntando-se ao Apple Developer Program, que requer uma taxa de inscrição anual. Depois de se inscrever, você terá acesso a vários benefícios, incluindo o portal de conexão da App Store, voo de teste e o portal de provisionamento. Há mais alguns benefícios , incluindo acesso ao software beta e suporte dos engenheiros da Apple. E fornecerei um link para a lista completa abaixo. O portal de provisionamento oferece acesso a ferramentas para identificação e assinatura de código do aplicativo. É como colocar sua assinatura no aplicativo para que a Apple possa identificar quem a criou. E isso é importante para a segurança dos usuários finais baixando seu aplicativo. E também é importante para você porque impede codificadores maliciosos de fingir ser você. Quando seu aplicativo estiver em um estado testável, o voo de teste permite que você convide pessoas para baixar e testar o aplicativo beta. Será possível enviar comentários e relatórios de bugs diretamente para você através do programa de voo de teste. Use o voo de teste para garantir que seu aplicativo seja mais refinado possível antes do lançamento. E, finalmente, a App Store connect é onde você criará a coisa do atlas para seu aplicativo, incluindo todos os metadados e capturas de tela. Se o aplicativo tiver compras de aplicativos, também é aqui que você os configuraria. Depois que seu aplicativo for testado e a listagem estiver pronta, você poderá fazer o upload do aplicativo do Xcode para a App Store connect a partir daí, a equipe de certificação da Apple analisará seu aplicativo para garantir que ele atenda ao aplicativo Diretrizes de qualidade da loja. Isso leva alguns dias e não se preocupe se você falhar porque você pode corrigir o que eles apontam e reenviá-lo para revisão. Se tudo estiver bem, eles aprovarão o aplicativo e seu aplicativo estará ativo. Parabéns. Tudo bem, então onde você pode obter essas diferentes partes do Apple Developer Ecosystem? Você pode baixar o Xcode gratuitamente na Mac App Store. Vou fornecer um link abaixo. Você não precisa obter a interface do usuário Swift ou Swift. Acabam de vir com o Xcode. Quanto ao Apple Developer Program, fornecerei um link para a página de inscrição abaixo. Quero mencionar que ingressar no Apple Developer Program é completamente opcional se seu objetivo não for distribuir aplicativos na App Store, não participe dele. Você ainda poderá aprender a criar aplicativos para você mesmo. Então esse é o ecossistema de desenvolvedores da Apple. É o processo pelo qual vou te levar se você continuar com esta jornada do aplicativo. Agora, ao final desse caminho de aprendizado, você estará criando seus próprios aplicativos usando todas essas ferramentas que abordamos, mesmo que você não tenha nenhuma experiência de codificação agora, eu prometo que você será o que você pode fazer até o final deste desafio. Na próxima lição, vamos mergulhar direto no Xcode. Tudo bem, te vejo lá. 3. 02: Tutorial de Xcode: Olá e seja bem-vindo. Neste tutorial do Xcode, você se familiarizará com o ambiente de desenvolvimento no qual você criará aplicativos. Mostrarei onde baixar o Xcode e como iniciar um novo projeto de aplicativo. E então vamos passar pelas principais áreas do Xcode e, em seguida, o que cada um dos arquivos em seu projeto de aplicativo é quatro. E, finalmente, terminaremos a lição com algumas dicas rápidas sobre como navegar no Xcode. Tudo bem, com isso dito, vamos mergulhar. Vamos começar falando sobre onde obter o Xcode. É grátis, então você não precisa pagar por isso. Basta iniciar a Mac App Store no seu computador e depois procurar o Xcode. Você chegará a uma página como essa nos resultados da pesquisa. Clique nele e você poderá baixá-lo gratuitamente. Então eu já o baixei. É por isso que diz atualizar aqui. Quero que você ignore o aviso aqui. Na verdade, é um aplicativo muito grande com muitos recursos diferentes. É compreensível que existam alguns bugs. E se você olhar para os comentários, há pessoas reclamando outras coisas não relacionadas ao aplicativo. Eles estão reclamando da forma como a Apple está administrando seus negócios e assim por diante. E alguns deles são muito, muito antigos. Ok, eu quero que você tome nota dessa informação importante. Clique nisso apenas para garantir quais são os requisitos para instalar o Xcode. E também verifique se você tem espaço livre suficiente no disco rígido. Agora, na minha experiência, na verdade, é preciso mais espaço no disco rígido ao longo do tempo. Então o que diz aqui. Então, se você tem algo como 12 shows grátis, talvez não permita que você instale isso porque durante o processo de instalação ele realmente ocupa mais espaço e acho que ele se livra de um monte de arquivos e ele pára neste tamanho. No entanto, com o tempo, quando você baixa componentes adicionais do desenvolvedor e simuladores iOS adicionais, isso pode ficar ainda maior. Portanto, certifique-se de ter espaço suficiente no disco rígido. Tudo bem, então, se por algum motivo você não conseguir acesso à Mac App Store, também poderá visitar a página oficial do Xcode no site do desenvolvedor da Apple. Portanto, o URL é o ponto do desenvolvedor apple.com slash Xcode. E você pode clicar imediatamente no link Recursos aqui. E então você será levado para uma página onde você pode baixar o Xcode aqui, basta levá-lo pela Mac App Store. Na verdade, você também pode baixar versões beta do Xcode. Agora eu não recomendaria isso porque muitas vezes é realmente muito buggy. Há software beta. Então eu recomendaria ficar com os lançamentos oficiais. Se, por algum motivo, você quiser baixar uma versão mais antiga do Xcode, você pode rolar aqui para baixo e clicar neste link aqui. Agora, apenas uma nota, para baixar versões beta do software Apple, você precisa estar inscrito no Apple Developer Program, sobre o qual falamos na lição anterior. Para baixar versões mais antigas do Xcode, acho que você não precisa estar inscrito nesse programa. Acho que você só precisa de um Apple ID gratuito. E, por fim, se você estiver em um PC, você está executando o Windows. Verifique os recursos no início do curso para obter opções para você. Tudo bem, então agora aproveite a oportunidade para baixar e instalar o Xcode se você ainda não e inicie-o pela primeira vez. Durante o primeiro lançamento, ele solicitará sua senha administrativa para sua senha administrativa para instalar componentes de desenvolvimento adicionais. Você vai querer fazer isso. Então vá em frente e insira sua senha de administrador. Depois de fazer isso, vamos continuar com o resto do vídeo. Tudo bem, então agora vamos falar sobre como iniciar um novo projeto Xcode. Esta deve ser a primeira tela de boas-vindas que você vê ao iniciar o Xcode. Se você não vir isso, não se preocupe, você sempre pode ir para Arquivo Novo e escolher projeto. Caso contrário, nesta tela de boas-vindas, você pode seguir em frente e clicar em Criar um novo projeto Xcode daqui. A partir daqui, você escolherá um modelo para seu novo projeto. Você configurará as propriedades do projeto para isso e, em seguida, escolherá um local para salvá-lo. Então, vamos começar escolhendo um modelo. O mais básico para nossos propósitos está no iOS e no aplicativo. Então vá em frente e escolha isso e clique em Avançar. E aqui você configurará as propriedades do seu projeto. Então, se você não tem uma equipe aqui, não se preocupe. Posteriormente, você pode adicionar sua conta Apple aqui e, em seguida, você pode configurar a equipe para o projeto. Uma coisa que você vai querer ter certeza é definir o identificador da sua organização aqui. Se você tem uma empresa ou um site, você pode usar o nome de estilo de domínio reverso aqui, com ponto, seja lá o que for. E você pode até usar seu nome e sobrenome aqui, se quiser. E aqui você preencheria o nome do aplicativo ou do nome do produto. Então aqui, se eu colocá-lo em teste, você verá que esse identificador de pacote é uma combinação do identificador da organização o nome do produto. E isso juntos forma esse identificador de pacote exclusivo. Esse identificador de pacote é usado em locais diferentes para identificar seu aplicativo, como na loja de aplicativos ou no portal de provisionamento, ou na App Store connect. Portanto, isso é muito importante. Não se preocupe, você pode alterar o identificador do pacote para seu projeto mais tarde. Eu só quero chamar sua atenção para como ela é formada e para que ela é usada. Tudo bem, em seguida. Sua interface, você garantirá que você tenha a interface do usuário Swift selecionada. E para o ciclo de vida, você garantirá que tenha o aplicativo Swift UI selecionado. E, finalmente, para o idioma, escolha swift e para essas opções, basta deixá-las todas desmarcadas ou se estiverem verificadas, basta desmarcar. Agora, uma breve nota sobre esses suspensos aqui. Com o tempo, à medida que o desenvolvimento de aplicativos para iOS evoluiu, houve algumas linguagens de programação e também algumas maneiras de criar interfaces de usuário. O mais recente e melhor é a interface rápida e rápida. Então é isso que queremos usar. Vamos em frente e aperte Next. Se você estiver feliz com todas as suas seleções aqui e, em seguida, escolher um lugar para salvá-lo. Vou salvá-lo na minha área de trabalho para que seja fácil de encontrar. Como já tenho o projeto dela lá, eu ia substituí-lo. Tudo bem, bem-vindo ao seu novo projeto Xcode. Agora pode parecer esmagador com todos os diferentes painéis e áreas, mas na verdade não é tão complexo uma vez que você sabe como ele é quebrado, existem apenas quatro áreas principais do Xcode. Vamos começar da muito, muito à esquerda. Aqui temos o painel do navegador ou a Área do Navegador, como você pode ver aqui, temos uma lista de arquivos de todos os arquivos diferentes em nosso projeto de aplicativo. A área do navegador, na verdade, tem guias diferentes para navegar por coisas diferentes também, às quais chegaremos em lições futuras por enquanto, está definida para a primeira guia e temos um listagem de nossos arquivos. Quando você clica em um arquivo, ele muda o que é mostrado nesta grande área principal, e isso é chamado de área do editor. Ele nos permite editar os arquivos que escolhemos no navegador de arquivos, você pode ver que ele se adapta ao tipo de arquivo escolhido. Escolha um arquivo rápido de ponto, esses são arquivos de código. Se eu escolher esse arquivo de ativos XC, esta é uma biblioteca de imagens, então está me mostrando algo assim. A área do editor é um lugar para editar o arquivo que eu escolho aqui. Portanto, a última guia está no lado direito e isso é chamado de área do inspetor. E isso me mostra informações suplementares adicionais sobre o que selecionei a área do editor, ou me permite configurar ou editar a coisa que eu seleciono na área do editor, dependendo em que tipo de editor estou trabalhando atualmente. Por exemplo, este é um editor de código porque estou olhando para um arquivo rápido de ponto. Quando eu passar o mouse sobre ou selecionar a palavra-chave aqui, se eu estiver nesta guia Ajuda rápida, ela está me mostrando algumas informações rápidas sobre o que serve esse pedaço de código ou palavra-chave. O painel do inspetor também tem algumas abas diferentes aqui. Por exemplo, esta é uma guia de identidade. Ele me mostra informações sobre esse arquivo que selecionei sobre onde ele está localizado e qual aplicativo ele está incluído em um se estivéssemos criando nossa interface de usuário. Agora, se eu selecionasse um desses elementos e vá para essa guia, isso me permitiria configurá-lo. Então, para resumir, o painel do inspetor aqui é contextual ao que você seleciona na área do editor. E a área do editor é contextual ao que você seleciona na área do navegador. Então, tudo decorre do que você seleciona aqui no lado esquerdo primeiro. E, em seguida, no topo, temos a barra de ferramentas aqui. Deixe-me explicar o que é isso. Há um botão aqui à esquerda e à direita para esconder e mostrar o navegador e o inspetor. Eles são úteis se você não tiver muitos imóveis de tela. A próxima coisa que eu quero chamar sua atenção é no meio aqui. Esta é a barra de status. Ele diz o que está acontecendo atualmente. O que o Xcode está fazendo? Você tem algum erro? Você tem algum aviso, e assim por diante e assim por diante. À esquerda disso, você tem uma lista suspensa para selecionar um simulador. E este simulador iOS é basicamente um dispositivo virtual que aparece na tela onde você pode executar seu aplicativo e testá-lo. Na verdade, você não precisa de um dispositivo físico. Se você tiver um, por mais novo, conecte-o e deseja executar seu projeto Xcode em seu dispositivo real, você descobrirá que ele será selecionável a partir daqui depois de conectá-lo. E, à esquerda deste menu, você verá alguns botões aqui para executar seu projeto. Pressionar este botão realmente executará seu projeto neste simulador. E apertar o botão de parada parará de executar seu projeto no simulador. E então, no lado direito, também há mais dois botões. Este é o botão da biblioteca onde você encontrará diferentes elementos da interface do usuário, diferentes maneiras de modificar esses elementos. Trechos de código nos ativos que você adicionou ao projeto, as cores especificadas para o projeto e assim por diante. Este pequeno painel de biblioteca é útil para fazer uma pesquisa. E para selecionar e adicionar coisas rapidamente na área do editor. Vamos chegar a isso na próxima lição. Mas, por enquanto, essa é a área da biblioteca. Isso, você provavelmente não usará muito no começo. Este é um tipo de botão de revisão ou revisão de código que mostrará se você estiver usando o controle de origem, como seus arquivos foram alterados ao longo do tempo. Portanto, essas são as quatro principais áreas da interface de usuário do Xcode. Tudo bem, agora vamos rever os arquivos em seu novo projeto. Vamos começar do topo. Este é o nó raiz ou é o arquivo do projeto. Se você selecionou, a área do editor mudará esta tela de configuração para que você edite alguns dos detalhes que pertencem ao seu projeto. Por exemplo, aqui está o identificador do pacote que é mutável. Você pode configurar a orientação do dispositivo em quais dispositivos e quais plataformas podem ser executadas, coisas assim. Se descermos um nível, você pode ver que há duas pastas aqui. Este contém todos os seus arquivos de código e arquivos de projeto. Este produto contém a saída. Quando você constrói seu aplicativo e o compila, ele é transformado neste aplicativo, que, em última análise, é aquele pequeno pacote ou pacote implantável que enviamos para a App Store. Você realmente não precisa fazer muito aqui com isso, mas é aí que ele está armazenado. Tudo bem, vamos dar uma olhada neste arquivo. Isso será nomeado após o nome do seu produto, app dot swift. E você pode ver aqui com esta tag principal aqui, esse é o ponto de entrada do seu aplicativo. Neste ponto, não há muito para configurar aqui. Tudo o que realmente faz é criar a primeira visualização que o usuário vê, que é a visualização de conteúdo. E você pode ver que esse nome mapeia para o ponto de exibição de conteúdo rápido. Então, vamos dar uma olhada nisso. Esse arquivo representa a exibição que o usuário vê. Agora você pode criar visualizações adicionais, mas, por padrão, você obtém essa visualização de conteúdo para começar. E sim, é tudo código aqui. Isso significa que a interface do usuário é gerada pelo código. Mas também há uma maneira visual de personalizar a interface do usuário, que você verá na próxima lição. Vamos seguir em frente com nossos outros arquivos. Este, como mencionei antes, é nossa biblioteca de ativos. É aqui que podemos armazenar as cores do nosso aplicativo, bem como os ícones do aplicativo, bem como quaisquer outras imagens que queremos adicionar ao nosso projeto. Nós apenas arrastamos e soltamos aqui. E esse é o nosso ativo de imagem. Bem, não apenas imagens, mas a Biblioteca de ativos. E então temos um info.plist e essas são algumas informações de configuração adicionais para o projeto. Aqui temos conteúdo de visualização, e essa é outra biblioteca de ativos, mas estes são apenas para ativos de pré-produção. Portanto, apenas imagens, texto e cores e coisas como essa com as quais você está testando , como sugere a visualização do nome, se for um ativo que acabará por chegar ao aplicativo que você vai empurrar o App Store, então você pode colocá-lo na biblioteca de ativos aqui. Então, essa é uma explicação rápida de todos os arquivos em seu projeto em poucas palavras. Nas lições futuras, vamos nos aprofundar em cada uma delas e você verá como cada um desses arquivos desempenha um papel na construção do seu aplicativo. A última coisa que quero fazer nesta lição é dar algumas dicas rápidas sobre como navegar pelo Xcode em termos de percorrer seus arquivos e também em termos de edição de código. Então, antes de tudo, vamos falar sobre navegar e arquivos. Você notará essas duas flechas aqui. Eles são realmente úteis porque isso vai deixar você ir para o último arquivo que você estava vendo. E embora pareça um pouco trivial agora, quando você está pulando em torno de edição e arquivos, isso se torna realmente útil. Em vez de ter que selecionar novamente esse arquivo no navegador, você pode simplesmente clicar de volta e voltar para o arquivo anterior. Você também notará que você pode ter várias guias aqui. Assim, você pode manter o controle pressionado e clicar em um arquivo e você sempre pode escolher abrir em nova guia. Você também pode abrir em uma nova janela, se quiser. Então, como eu já tenho isso como guia, ele não abrirá uma segunda guia para mim. Agora, se você quiser ter coisas lado a lado, você também pode fazer isso. Então, digamos que eu queria ver esses dois arquivos lado a lado. Então eu posso fechar isso. E então eu posso ir em frente e posso adicionar outro painel do editor no lado direito, para poder dividir minha área do editor em duas áreas do Editor. Você pode ver que aqui estou olhando para a visualização de conteúdo tão rápida por aqui. Vejamos o aplicativo de teste. Então, são áreas independentes. Talvez eu queira me livrar da minha tela. E então eu posso ver os dois PFOS assim. Se você preferir que eles sejam empilhados horizontalmente, você pode manter a opção pressionada. E você pode ver que esse ícone muda. Certo, se você apertar este botão novamente, ele adicionará outra área do editor à direita. Então você vai se dividir em três. Ou você pode manter pressionada Option e você pode adicionar um editor na parte inferior. Então você faz isso. Você também pode fazer isso aqui, mantenha pressionada a opção e faça isso. Agora, uma maneira rápida de iniciar um arquivo em uma visualização do editor dividido. Então, digamos que eu esteja analisando o aplicativo de teste e queira abrir a visualização de conteúdo como uma área de editor separada. Posso manter pressionada a opção e clicar no arquivo que quero abrir em uma exibição separada do editor. Portanto, essas são algumas das maneiras pelas quais você pode trabalhar com seus arquivos. Só para recapitular, você pode navegar. Você pode voltar e seguir em frente. Você pode ter guias diferentes. E, em seguida, você também pode dividir sua área do editor em várias instâncias do editor. Agora eu quero falar sobre edição de código porque isso é muito do que você vai fazer. E o código parece bem curto agora, mas pode ficar mais longo. Portanto, é útil saber algumas maneiras de lidar com isso. No topo aqui, você verá esse tipo de menu de pão ralado. E você notará que esse é o nó raiz corresponde a isso, certo? Esta é uma pasta ou grupo, pode ver isso. E então esta é a visualização de conteúdo, que é o arquivo que você está vendo, que está aqui dentro dos testes. E aqui, podemos realmente clicar nisso e você pode pular para diferentes seções do seu código. Você pode ver que a visualização de conteúdo corresponde a isso. O corpo combina com isso, certo? Portanto, essa é uma ótima maneira de pular para diferentes seções em seu arquivo de código caso seu arquivo de código fique muito longo. Você também pode adicionar comentários diferentes aqui que corresponderão ao que você vê aqui. Então você pode ver aqui, eu criei minha própria documentação e ela a adiciona aqui. Portanto, essa é uma ótima maneira de organizar seu arquivo. Vamos falar novamente sobre isso no futuro. Portanto, não se preocupe se isso estiver indo um pouco rápido demais. Tudo bem, agora vamos falar sobre esse pequeno botão aqui. Você me viu usar isso para abrir o Canvas, mas você também pode abrir este minimapa aqui. E esse minimapa mostrará um esboço do arquivo de código. Você pode arrastar isso para esfregar seu código. Infelizmente, não posso fazer isso muito aqui porque esse arquivo de código não é muito longo. Mas se você tivesse um arquivo de código muito longo, ele mostraria o esboço desse arquivo de código aqui. E você pode navegar facilmente clicando e arrastando isso. Você vai notar que, mesmo que eu destaquei, isso vai me mostrar as diferentes partes do meu código correspondentes ao que temos aqui. Mais uma vez, essas foram apenas algumas dicas de fogo rápido. Não se preocupe se isso voou muito rápido porque usaremos todas essas coisas juntos nas próximas lições. Então esse é um tutorial rápido para você começar. Não é tão complicado quando você sabe onde as coisas estão certas, apenas para recapitular, você descobriu onde baixar o Xcode e como iniciar um novo projeto de aplicativo. Você aprende para que serve cada um dos arquivos em seu projeto. E você aprende as principais áreas do Xcode, incluindo o navegador, o editor, o inspetor, a barra de ferramentas. Finalmente, você também aprenderá algumas dicas rápidas sobre como navegar com esse Xcode. Agora, não se preocupe se for um pouco avassalador agora, você se sentirá em casa com Xcode, pois o usamos com mais frequência juntos nas próximas lições para ajudá-lo a se instalar, Na verdade, criei uma folha de truques do Xcode que você pode imprimir e manter ao seu lado enquanto aprende a usar o Xcode, eu recomendo que você tente criar seu próprio projeto Xcode no seu próprio computador apenas para prática extra. Na próxima lição, e vamos usar o Xcode para criar nossa primeira interface de usuário. Tudo bem, te vejo lá. 4. 03: como criar interfaces de usuários: Olá e seja bem-vindo. Nesta lição, você aprenderá como usar o Xcode pode criar interfaces de usuário com a interface do usuário Swift. Primeiro, vamos aprender a visualizar o aplicativo para que você possa ver como a interface do usuário se parece. Eles não mostram como usar o Xcode para construir visualmente a interface do usuário ou a interface do usuário para abreviar. Até agora, o aprendizado tem sido praticamente passivo, o que significa que você pode simplesmente sentar e assistir aos vídeos. Mas a partir de agora, vamos mudar para um aprendizado mais ativo. Eu quero que você faça o que eu faço, replique-o em seu próprio projeto Xcode. E eu quero que você tente qualquer um dos desafios que você, esta é a melhor maneira de aprender. E, francamente, se você só vai sentar e assistir as lições e não fazer nenhum trabalho. Você não está aproveitando o melhor do seu tempo. Esta tem sido minha experiência pessoal e acho que será a mesma para você. Então, se você estiver pronto, vamos começar a sujar nossas mãos. Vamos fazer isso. Vamos começar criando um novo projeto Xcode. Vamos escolher o aplicativo iOS. E vou chamar este teste de interface do usuário. Apenas certifique-se de que as interfaces ciclo de vida da IU Swift seja rápido aplicativo de interface do usuário e o idioma é rápido. Fora isso, você pode nomear tudo o que quiser. Vamos seguir em frente e salvar nosso projeto. E, como mencionei na lição anterior, o ponto de visualização de conteúdo Swift representa sua visualização. Mas, como você pode ver, é tudo código. Então, como você realmente vê como sua interface de usuário se parece? Bem, existem duas maneiras diferentes. A primeira maneira é iniciar seu aplicativo em um simulador iOS, como mencionei antes. Então, vamos em frente e faça isso primeiro. Selecione um que você gosta. Então, vou selecionar o iPhone 11. E eu vou apertar este botão de compilação e execução. Agora é a primeira vez que você está lançando o simulador iOS. Vai demorar um pouco para inicializar, assim como seria para inicializar um dispositivo real para mim porque eu lancei o simulador antes. Está acontecendo muito, muito rapidamente. Como você pode ver, por padrão, seu projeto tem um rótulo Hello World. Vamos falar sobre isso em um segundo. Mas primeiro, deixe-me mostrar a outra maneira de visualizar seu aplicativo. Então, vamos em frente e interromper nosso projeto. E isso impedirá que o aplicativo executado no simulador. A segunda maneira é visualizar seu aplicativo nesta tela aqui. Isso faz parte da área do editor. Se você não vir isso, você pode clicar neste pequeno botão aqui e garantir que haja uma marca de seleção ao lado do Canvas. E se você estiver olhando para um arquivo rápido de ponto, que é uma visualização, você poderá ver esta tela. Caso contrário, se você estiver olhando para este arquivo de ponto de entrada aqui, você pode ver que não há pré-visualização. Então, vamos voltar para a visualização de conteúdo. Certifique-se de que temos nossa pré-visualização aqui e clique em currículo. Ele vai construí-lo e executá-lo. E então você verá a pré-visualização aqui. Mais uma vez. Se esta for a primeira vez que você faz isso, pode demorar um pouco. Vamos usar os controles de zoom aqui e diminuir um pouco para que possamos ver a coisa toda. Agora só de cara, há algumas coisas que eu quero mencionar aqui. Isso é simplesmente uma pré-visualização, enquanto quando você inicia isso no simulador, você está realmente instalando esse aplicativo em um dispositivo virtual para que possa interagir com ele e testá-lo. Aqui, esta é uma prévia com a qual você não pode interagir, mas há uma maneira que você pode. Então, se você clicar neste botão aqui, visualização ao vivo, ele entra em um modo em que é exatamente como o simulador que você viu antes. Mas está nesta tela de visualização. Então você pode ir em frente e clicar em Stop. E, novamente, ele só se torna uma prévia normal. Isso é apenas para fins de visualização. Outra coisa legal sobre o uso desta tela de visualização é que você pode apertar este botão aqui e escolher um dispositivo diferente. Você pode escolher um layout, escolher o modo escuro ou o modo claro e escolher várias coisas diferentes. Essa é a maneira preferida de visualizar sua interface do usuário porque, à medida que você está construindo sua interface do usuário por meio de código desse lado, sua interface do usuário por meio de código desse lado, você poderá ver as coisas mudarem à direita aqui sem ter para relançar o aplicativo no simulador. Tudo bem, agora vamos mergulhar e falar sobre como vamos realmente construir a interface do usuário. Portanto, certifique-se de ter o ponto de exibição de conteúdo rapidamente destacado e vá em frente e oculte o navegador de arquivos. Agora há um monte de código aqui que compõem a exibição. Mas vamos passar por isso em profundidade mais tarde quando você aprender algumas das noções básicas de programação Swift por enquanto, para evitar confusão, eu só queria chamar sua atenção para uma coisa, que é esse pedaço de código aqui. O que eu destaquei na tela é o que está gerando esse rótulo aqui que você vê na visualização. Observe que temos uma palavra-chave de texto. Temos o texto helloworld que você pode ver aqui. E também temos esse elemento de preenchimento aqui, que dá o preenchimento em torno da palavra. Vamos dar uma olhada neste pedaço de código e dividi-lo. Na verdade, vou apenas ir em frente e excluí-lo. Como você pode ver, o Xcode lançará todos os tipos de reclamações e erros. Mas não se preocupe, vamos consertá-lo imediatamente. Agora, nossos elementos de interface de usuário precisam estar entre esse suporte de abertura e esse suporte de fechamento. E você só pode ter um elemento de interface de usuário. Agora, obviamente, isso não faz sentido porque nossas interfaces de usuário são compostas de mais de um elemento. Mas é aí que os elementos do contêiner entram em jogo. E eu vou mostrar alguns desses nesta lição também. Por enquanto, vamos recriar esse elemento de texto. Então, o que escrevemos é aquela palavra-chave de texto seguida por um par de colchetes como esse, colchetes arredondados. E então lá dentro temos um par de aspas. E então colocamos o pedaço de texto que queremos exibir. Então aqui vou colocar olá. Mas você notará que essa moldura azul aumenta muito firmemente contra o meu texto de saudação. Se você quisesse adicionar o preenchimento de volta , escreveria ponto. E então você simplesmente digitaria preenchimento e usando o preenchimento automático, basta selecionar esse mesmo ali. E assim, recriamos esse rótulo com preenchimento. Este aqui é o elemento de texto ou o rótulo. Esta parte com o preenchimento de pontos. Isso é chamado de modificador. E você pode pensar em um modificador como um anexo a um elemento que altera a aparência e o comportamento dele. Nesse caso, esse modificador de preenchimento adiciona preenchimento aos elementos de texto para que , se houver um elemento ao lado dele, haverá algum espaço ao redor do nosso elemento de texto. E, na verdade, existem muitos outros modificadores que podemos adicionar aos nossos elementos de interface de usuário. Por exemplo, posso adicionar um plano de fundo chamado e vou adicioná-lo ao final do preenchimento. E vou dizer que o plano de fundo desse rótulo deve ser azul. Então você pode ver que nossa tela de visualização representa muito bem o que estamos escrevendo aqui através do código. Se houver algum momento em que as coisas ficam fora de sincronia, talvez o código que você está escrevendo aqui esteja dizendo que o plano de fundo deve ser verde, mas você não está vendo aqui. O código é considerado a fonte da verdade porque, em última análise, a tela de visualização e até mesmo o que você vê no painel Inspetor são apenas representações visuais do código. E isso me leva ao meu próximo ponto, que é quando você está construindo a interface do usuário, você não precisa escrever código. Existem muitas maneiras visuais de você criar o código. Vamos apagar esse elemento de texto e novamente, e deixe-me mostrar algumas das maneiras pelas quais você pode criar visualmente a interface do usuário. Eu falei sobre o painel da biblioteca antes. Assim, você pode ver aqui que podemos simplesmente selecionar, procurar o elemento de texto selecionado e podemos arrastá-lo para o nosso editor de código aqui. E então podemos alterar o texto do espaço reservado, mas nem precisamos alterar o texto aqui. Se você clicar neste elemento de texto e entrar no painel do inspetor, poderá alterá-lo aqui assim. E também neste painel do inspetor, você verá que há um monte de modificadores que podemos adicionar. Então, adicionando o preenchimento, eu poderia clicar nele para adicionar apenas o preenchimento superior. E você pode ver que o código muda. E está especificando que ele apenas um preenchimento na parte superior. E você pode vê-lo refletido aqui. Ou posso clicar neste aqui e ativar ou desativar o preenchimento. E você pode ver agora eu tenho preenchimento por todos os lados. Então, além de alguns dos modificadores que você vê aqui, aqui embaixo, há uma caixa de texto onde você pode procurar mais modificadores. Assim, posso procurar o plano de fundo e clicar nele. E, em seguida, selecione esse fundo azul, como você pode ver aqui. E então também posso adicionar esse preenchimento. Agora, além de usar os modificadores que você vê aqui e usar esta caixa de texto Adicionar modificador, você também pode usar a biblioteca para adicionar modificadores. Portanto, esta primeira guia fornece todos os elementos da interface do usuário que você pode adicionar à sua exibição aqui na segunda guia ou modificadores. Então, como você pode ver, há o preenchimento, há o segundo plano. Então, como você adiciona esses modificadores? Bem, basta clicar e arrastá-lo. Mas aqui você tem que se certificar arrastá-lo para o final do código. Porque se você arrastá-lo acidentalmente no meio do seu código, talvez não seja necessário, ou você pode obter algo assim. Isso claramente é um erro. Então, vamos desfazer isso. Então, como se isso não bastasse, há mais algumas maneiras mostrar a você sobre como você pode modificar os elementos da interface do usuário visualmente em vez de escrever código. Primeiro de tudo, vamos terminar de configurar esse plano de fundo e vamos selecionar azul ali mesmo, ou talvez verde. Certo, isso não está mudando isso. Então, está mudando isso, mas não está mudando aqui. Então vou seguir em frente e selecionar a cor, e vamos fazer verde, minúsculas g. Tudo bem, para que você possa manter pressionada o Command no seu teclado e, em seguida, você pode clicar no elemento da interface do usuário da sua pré-visualização aqui. E, em seguida, há várias coisas que você pode fazer com esse elemento, incluindo este, mostrar Swift UI inspector. E, novamente, você obtém esse Modificador Adicionar, TextField, o que você pode procurar por modificadores para adicionar. Então, vou adicionar um chamado Blur. Você pode ver que ele está desfocando a cor verde. E você pode ver que agora meu fundo é um verde embaçado. Agora você pode fazer a mesma coisa nos lados do editor de código. Assim, você pode manter pressionado o comando e clicar no elemento de texto e obter este menu. Você pode, novamente, clicar em Mostrar inspetor de interface do usuário Swift. E a partir daqui você pode ver que esse menu se parece com o inspetor aqui. E também podemos adicionar modificadores também. Então, para ilustrar meu ponto, mostrei várias maneiras diferentes de você modificar sua interface de usuário visualmente. Você não precisa escrever o código. Mas com o tempo, como você está fazendo isso da maneira visual, você está vendo o código que é gerado repetidamente. Você chegará a um ponto em que é tão familiar, será mais rápido para você apenas digitá-lo em vez de clicar em todos os lugares. Portanto, é uma maneira muito boa de aprender o código da interface do usuário. Isso não é muito legal? Xcode percorreu um longo caminho no passado. Costumava ser muito exigente usar o construtor de interface visual com o Xcode, mas o Swift UI realmente mudou as coisas para melhor. Agora, nesta lição, você aprenderá a usar o elemento de texto e modificou sua aparência e comportamento usando modificadores. Além disso, você também aprende que a interface do usuário é realmente gerada a partir do código Swift. No entanto, existem várias maneiras no Xcode para criar sua interface do usuário visualmente. E à medida que você constrói sua IU visualmente através do painel anterior do Canvas ou do inspetor, como demonstramos, o código rápido no editor de código é atualizado automaticamente para refletir essas alterações. Portanto, essa é uma ótima maneira de aprender o código rápido. Na próxima vez que nos sentarmos juntos, apresentarei visualizações e contêineres adicionais que você pode usar para que você possa criar interfaces de usuário mais complicadas. Tudo bem, te vejo lá. 5. 04: visualizações que and containers: Olá e seja bem-vindo. Nesta lição, você aprenderá a usar uma variedade de diferentes elementos e contêineres da interface do usuário. E, no final da lição, mostrarei algumas interfaces de usuário que eu gostaria que você tentasse se construir como prática. Lembre-se, você vai tirar muito mais deste curso se você parou durante toda a lição e tentar replicar o que eu fiz em seu próprio projeto Xcode. Tudo bem o suficiente para falar. Vamos para a parte divertida. Tudo bem, certo, então você aprendeu sobre o elemento de texto. Agora eu quero mostrar a você o elemento da imagem. Então, vamos seguir em frente e apagar isso. E por que não usamos a biblioteca para procurar o elemento de imagem. Então, vamos seguir em frente e arrastar e soltar a imagem lá. Agora, o problema é que não temos nenhuma imagem para exibir. Mas antes de eu lhe dizer como especificar isso, apenas percebi que está no mesmo formato que o elemento de texto certo? Há a palavra-chave image aqui e, em seguida, há um conjunto de colchetes redondos. E no meio, vamos colocar o nome da nossa imagem. Agora, esse nome de imagem é mapeado para qualquer ativo gráfico que colocamos em nossa biblioteca de ativos. Então, se abrirmos nosso navegador de arquivos e entrarmos em nossa biblioteca de ativos, você poderá ver que está tudo vazio. Não temos nada aqui. Então, vamos seguir em frente e colocar uma imagem aqui. Se você entrar nos recursos da aula, verá um arquivo zip chamado Logotipo assets. E vamos em frente e descompactá-los. E então, dentro, você encontrará uma imagem local. Você vai encontrar três arquivos na verdade. E eles são nomeados da mesma maneira, exceto com um apt to x e depois adicionam três x. e isso é literalmente apenas duas vezes maior do que o primeiro. E este é três vezes maior do que o primeiro. E a razão pela qual eles vêm em tamanhos diferentes é porque existem dispositivos iOS com diferentes resoluções de tela. Portanto, adicionando todos os três tamanhos, a plataforma escolherá o tamanho certo para usar para a resolução da tela. Ele está sendo exibido em. Então, tudo o que você precisa fazer é pegar todos os três e arrastá-los para a biblioteca de ativos assim. Vai ser inteligente o suficiente para saber que esses três estão no mesmo grupo. E isso vai dar um nome a ele. Você sempre pode renomear isso para que você possa clicar nele e dar o nome do que quiser. Mas esse nome aqui é o que você fará referência no elemento de imagem. Então vá em frente e coloque aspas, nome do ativo da imagem, e você deve vê-lo aparecer aqui. Na verdade, pré-visualização automática, atualização, pausa, vá em frente e clique em Continuar. Tudo bem, lá vemos nossa imagem. Agora, por padrão, ele exibe a imagem no tamanho do ativo gráfico que você importou. No entanto, se você quiser redimensioná-lo, dimensioná-lo para cima ou para baixo, você pode adicionar um modificador chamado redimensionável. Quando você acertar isso, ele poderá se esticar. Quando ele se estende se você quiser manter a proporção porque você pode ver aqui tudo está esticado e não se parece com a imagem original. Você pode adicionar outro modificador chamado proporção. E não se esqueça, mesmo que eu esteja digitando esses modificadores por meio de código aqui, você sempre pode adicioná-los neste menu. Você pode encontrá-lo ali mesmo. E, em seguida, o modificador de proporção permite que você selecione diferentes maneiras pelas quais isso deve ser dimensionado. Então, se eu disser adequado, ele vai escalá-lo para caber dentro dos limites. Mas com a manutenção da proporção. E enquanto estamos adicionando esses modificadores, esse seria um bom ponto para mencionar que uma boa prática é pressionar Enter em seus modificadores aqui para que eles se alinhem. Como alguns elementos podem ter uma lista de modificadores e colocá-los todos em uma nova linha, eles recuam automaticamente sob os elementos da interface do usuário aos quais pertencem e torna-se muito fácil leia. Tudo bem, agora você sabe sobre texto e elementos de imagem. Como vamos combinar os dois? Como podemos ter mais de um elemento para nossa interface de usuário? É aqui que os elementos do contêiner entram em jogo. Então, vamos em frente para nossa biblioteca e vamos procurar por pilha v. Este é o que estou me referindo, pilha vertical. E você pode ir em frente e clicar e arrastá-lo para aqui. Agora, você vai ter alguns erros porque isso conta como um elemento para. Agora, parece que o Xcode não alcançou, mas isso não seria uma interface do usuário válida. Essencialmente, temos dois elementos aqui. O que queremos fazer é pegar nossa imagem e eu vou cortar esse código e vou colá-lo entre esse suporte de abertura e o esse suporte de abertura e fechamento da pilha vertical. Dentro da pilha vertical, você pode colocar até 10 elementos e isso os empilhará verticalmente um sobre o outro. Então aqui eu também vou colocar. Elemento de texto assim. E você pode ver que agora eu sou capaz de ter dois elementos e eles são automaticamente empilhados um sobre o outro. Além da pilha vertical, há também uma horizontal. E em vez da pilha, isso é a pilha H. E se você mudar isso para um H de volta, verá que agora está empilhado horizontalmente um ao lado do outro. E há também um chamado zed stack, estou no Canadá, ou pilha z se você preferir. E isso coloca as coisas umas sobre as outras, com os elementos no topo sendo os mais distantes na parte de trás. Então você pode ver que nosso elemento de texto hello fica no topo da imagem. Agora, a coisa legal é que você pode aninhar esses diferentes elementos de contêiner. Então eu posso ter, digamos, quero que minha imagem, logotipo seja o plano de fundo e, por cima, quero ter que texto elementos lado a lado. Então eu posso usar uma pilha H aqui. E em vez de digitá-lo ou arrastá-lo da biblioteca, mostrarei outra maneira incorporar seus elementos nas pilhas. Se você pressionar Command e clicar no elemento, você já viu esse menu antes. Você pode incorporar na pilha H e ela só criará isso para você. E essa é provavelmente a maneira mais fácil de fazer isso. Então, nesta pilha H, vou adicionar hello world. Você pode ver aqui que agora minha imagem está por trás dessa pilha H com dois elementos de texto. Agora parece bastante intuitivo usar essas pilhas, certo? Mas como você organiza os elementos dentro desse imposto? Bem, existem algumas opções. Então, se eu clicar nesta pilha aqui, na verdade, vamos dar uma olhada na pilha. Então, vou seguir em frente e clicar nisso. Este realmente tem alinhamento. Assim como esse veado não acontece porque ele apenas coloca tudo um em cima do outro. Mas para a pilha H e a pilha, há um alinhamento. Assim, você pode optar por alinhar tudo por seus meios, alinhar tudo por suas linhas de base ou alinhar tudo pelo topo. E você também pode adicionar espaçamento. Então você pode ver aqui que estou adicionando um espaçamento de três. Você pode ver como ele muda o código e, na verdade, adiciona um espaçamento lá. Agora é muito pouco para você perceber que deixe-me adicionar 20. Você pode ver que há uma lacuna agora. Tudo bem, então você aprendeu que pode alinhar os elementos dentro de uma pilha e também pode adicionar espaçamento entre elementos em uma pilha. Mas quero mostrar outra maneira de organizar elementos dentro de uma pilha. Para fazer isso, vou mudar essa pilha em pilha V. Então, vamos conseguir algo assim. Agora vamos dizer que eu queria que esse logotipo estivesse no topo, e eu queria que meus dois rótulos de texto aqui estivessem na parte inferior. Uma maneira que eu poderia fazer isso é na verdade, adicionando espaçamento na minha pilha v, certo? Então, digamos que eu adicione um 100. Você pode ver que eles estão afastados. Se eu puder adicionar mais, 300. Mas esse é um valor fixo. E, como você sabe, há uma tonelada de tamanhos e resoluções de tela diferentes. Portanto, essa não é uma boa maneira de se aproximar disso. Deixe-me me livrar desse valor de espaçamento. Em vez disso, o que podemos usar é um elemento chamado espaçador. Então deixe-me mostrar como isso funciona. Entre o elemento de imagem e a pilha H que contém os dois elementos de texto. Vou inserir um elemento espaçador. E o nome desse elemento é espaçador, seguido por dois colchetes arredondados. O que esse elemento espaçador faz é ocupar todo o espaço disponível. Ele só se expande e empurra tudo para longe. Então você pode ver, eu tenho a imagem aqui. Tenho o espaçador ocupando o máximo de espaço possível. E então minha pilha H contendo os dois elementos lá. O legal sobre o elemento espaçador, no entanto, é que ele joga bem com outros elementos espaçadores na mesma pilha. Então, se eu subir aqui acima do logotipo e adicionar outro elemento espaçador, o que acaba acontecendo é que os dois elementos espaçadores ocupam uma quantidade igual de espaço. Você pode ver acima e abaixo do logotipo da guerra, há uma quantidade igual de espaço. Se eu adicionar um terceiro elemento espaçador abaixo da minha pilha H, o que você acha que vai acontecer? Bem, todos os três espaços onde os elementos compartilharão o espaço em branco disponível. Então, os primeiros elementos espaçadores aqui, o segundo aqui, e o terceiro está lá, e tudo tem uma quantidade igual de espaço. Esta é uma ótima maneira de espaçar as coisas igualmente. Agora, na verdade, eu poderia fazer a mesma coisa com minha pilha H em vez de especificar o espaçamento aqui. E observe desta vez eu vou excluir esse espaçamento 20 lá. Em vez de alterá-lo no Inspetor. Posso adicionar um espaçador lá. Vou copiar isso. E você pode ver aqui que ocupa todo o espaço disponível, empurrando meus dois rótulos para o lado. Mas se eu adicionar um aqui no lado direito, ele vai empurrá-lo para o meio. E então, se eu adicionar um no meio, isso vai torná-lo tudo equidistante. Incrível. Você aprendeu a usar a imagem e o espaço para elementos além do elemento de texto. Você também aprenderá a usar os contêineres Stack, HCI Stack e zed stack. Na próxima vez que nos sentarmos juntos, estaremos construindo a interface de usuário do jogo duro. 6. 05: crie a interface de cartões de guerra: Olá e seja bem-vindo. Nesta lição, estaremos construindo a interface do usuário do jogo de cartas de guerra. Na verdade, vou fazer você mesmo construí-lo primeiro porque acho que você pode fazer isso. Vamos lá. Vou começar você. Você faz uma tentativa honesta e depois passaremos pela solução juntos. Negócio. Vamos lá, você tem isso, vamos fazer isso. Tudo bem, então vamos começar com um projeto Xcode, lançar o Xcode e vamos criar um novo projeto Xcode. Vamos escolher o aplicativo no iOS. E você pode nomear isso o que quiser. Mas vou chamar esse desafio de guerra porque é isso que é e é um desafio que estou confiante que você pode fazer. Interfaces O ciclo de vida da interface Swift UI é rápido aplicativo de interface do usuário e o idioma é rápido. Deixe o resto desmarcado e vamos salvá-lo em algum lugar. Então, vou salvá-lo na minha área de trabalho. Tudo bem, aqui está nosso novo projeto Xcode. Vamos para a biblioteca de ativos primeiro porque vamos adicionar todos os ativos de imagem que precisamos para este aplicativo. Se você entrar na pasta Recursos do curso nesta lição especificamente , encontrará um arquivo zip com todos os ativos de imagem. Então vá em frente e descompacte isso. E então vamos arrastar todos esses ativos para a biblioteca de ativos. Agora você deve ter o cartão de volta, o plano de fundo para todo o aplicativo. E então você deve ter cartões dois a 14 e não, você não está faltando o carrinho número um. O ás é carbono-14. E a razão pela qual eu os numerei dessa maneira é porque vamos usar esse número no final dos nomes dos cartões aqui para representar o valor. E vamos comparar esse valor para ver qual cartão supera o outro. E então vamos ter uma imagem de botão de negócio e uma imagem de logotipo. Agora, caso eu não tenha mencionado isso antes, temos três tamanhos diferentes para cada imagem porque existem diferentes resoluções de tela para dispositivos iOS. Então, todos os dispositivos mais novos têm tela super retina e, portanto, eles estão usando os a3x e eu não acho que eles realmente criam dispositivos que usam o ativo de imagem única. Mas esse aplicativo foi de muito tempo atrás e nós reconstruímos em muitos momentos diferentes, então ainda temos todos os três. Agora deixe-me mostrar a interface de usuário finalizada. E esse é o resultado final que você tentará alcançar sozinho. Isso é o que parece. Não preste muita atenção ao espaçamento, desde que você tenha tudo geralmente no lugar certo. Acho que isso é ótimo. Outra coisa a mencionar é que isso deveria ser um botão, mas como ainda não passamos por botões, sinta-se à vontade para usar um elemento de imagem para isso. E isso será perfeito para quando fizermos a transição para usar botões. E posso mostrar como alterar esse elemento de imagem para um botão. Outra coisa que tenho que mencionar para você é o conceito da área segura. Agora, a área segura é essa região que começa aqui sob o entalhe deles, e termina aqui acima deste pequeno guiador. E, em alguns casos, existem margens no lado esquerdo e direito também. E qualquer coisa dentro desta região está na área segura. Agora, esta área está garantida para não ser obstruída. Qualquer coisa fora da área segura. Então, qualquer coisa neste canto ou neste canto pode ser obstruída como você pode ver por ícones ou no momento. E, obviamente, há esse guidão aqui que pode estar bloqueando as coisas também. Se você quiser um plano de fundo de tela cheia, como este fundo verde que temos aqui, você terá que ignorar a área segura porque, por padrão, quando você adicionar elementos à exibição, ele tentará ficar dentro da área segura. Então, há um modificador que ainda não mostrei. É chamado ignorar área segura que você pode aplicar a uma imagem que permitirá que ela se estenda além da área segura que ela atinja as bordas. E essa é provavelmente a única outra informação que você precisa. Além disso, você aprendeu sobre pilhas, aprendeu sobre elementos de imagem e texto, tudo o que você precisa para criar essa interface de usuário. Então vá em frente, pause este vídeo e experimente você mesmo. E depois, voltaremos juntos e eu o guiarei sobre como construir isso. Então, bem-vindo de volta. Como você conseguiu construir essa interface de usuário? Parabéns, se você conseguir construir isso ou algo parecido com isso. E se você ficou preso ou não conseguiu se preocupar porque vamos passar por isso agora. E muitas vezes eu acho que se você tentar você mesmo, ficar preso e depois encontrar a solução. Essas são muitas vezes as melhores experiências de aprendizado. Tudo bem, vamos passar por isso juntos agora. Agora, antes de mergulharmos e começarmos a construir essa interface de usuário, quero tirar um momento para dividir quais elementos posso ver aqui. Então, antes de tudo, posso ver que precisaremos de uma pilha zed porque. Temos uma imagem por trás de todos esses elementos. E assim como essa pilha nos permitirá posicionar elementos uns sobre os outros. Em seguida, temos uma pilha V onde os elementos são empilhados uns sobre os outros verticalmente. Assim, você pode ver uma pilha V percorrendo toda essa interface de usuário de cima para baixo. Agora, alguns dos elementos nesta pilha V estarão realmente contidos em uma pilha H, como essas duas placas lado a lado, por exemplo. E esse elemento aqui em baixo será uma pilha H de pilhas TUV. Portanto, esta é uma pilha V contendo os dois elementos de texto. Esta é uma pilha V contendo os dois elementos e, em seguida, você os encapsula em uma pilha H. Então esse é o colapso que eu vejo. E agora vamos entrar em nosso ponto de visualização de conteúdo rapidamente, e vamos construí-lo. Tudo bem, então aqui estou vendo o conteúdo Vue.js Swift. A primeira coisa que vou fazer é mudar esse simulador para o iPhone 11. E vamos acertar Resume. E em alguns segundos, o tempo pode ser maior, verá uma prévia aqui. Perfeito. Agora vamos alterar esse elemento de texto padrão. Livre-se disso. Vamos colocar uma pilha z lá, abrir um par de suportes encaracolados. Agora, o que está sentado atrás de todos esses elementos é uma imagem. E a imagem que temos é chamada de fundo. Observe que ele não chega até o topo. Agora ele se sobrepõe um pouco a essa área segura. Eu disse que a área segura estava sob o entalhe aqui. Então você vê que ele transborda, mas não vai até lá. Assim, podemos adicionar um modificador chamado ignora área segura. Quando você faz isso, ele só vai cobrir tudo. Então, tudo bem. Então, o que vai estar em cima desse plano de fundo? Bem, como eu disse antes, teremos uma pilha vertical contendo todos esses elementos. O primeiro é o logotipo. E então teremos uma pilha H com duas cartas e, em seguida, um elemento de imagem representando o botão de negociação. E depois disso, teremos a pontuação pilhas verticais em uma pilha horizontal. Então deixe-me, deixe-me digitar isso para que faça um pouco mais de sentido. Vamos começar com o logotipo na parte superior. Vamos ter uma imagem e nosso nome de ativo de imagem é logotipo. Então você pode ver que ele simplesmente aparece no tamanho certo lá. E isso porque nosso ativo de imagem é desse tamanho. Ok, agora vamos colocar uma pilha H aqui. E aqui dentro vamos colocar mais dois elementos de imagem. Vamos colocar o cartão, vamos colocar também. E depois cartão três. Então, temos duas cartas em uma pilha H. E depois disso, vamos colocar outro elemento de imagem. E este vai ser o botão de negociação. E agora vem os rótulos de pontuação. Então, vai ser uma pilha H. Mas dentro da pilha , na verdade, temos dois V's. Obrigado. Cada VSAT contém dois elementos de texto. Então, vamos ter o Jogador e teremos a pontuação real. E então, para este, vamos ter CPU. E vamos ter a pontuação real, a CPU. Então, basicamente, temos todos os nossos elementos dispostos. Agora, vamos adicionar algum espaçamento a eles. Então, para fazer isso, podemos usar espaçadores. Então, vamos começar adicionando um espaçador logo acima, logo acima da pilha H das duas cartas abaixo da imagem do logotipo. Então, vou colocar um elemento espaçador ali mesmo. E o que você aprendeu sobre elementos espaçadores, certo? Ele ocupa todo o espaço disponível. No entanto, se você tiver vários elementos espaçadores no mesmo contêiner, ele dividirá uniformemente esse espaço entre os dois espaçadores. Então, vou colocar outro espaçador logo abaixo das cartas. Então agora você pode ver que há duas quantidades iguais de espaços. Vou colocar outro espaçador abaixo do botão de negociação ou imagem por enquanto. E então vou colocar um espaçador abaixo dos rótulos de pontuação. Então você tem que se certificar de que você não o coloca no lugar errado aqui. Queremos colocá-lo abaixo desta pilha H. E se você clicar neste colchete final, verá que o Xcode acende brevemente os colchetes iniciais para que você possa verificar se é onde você deseja. Tudo bem, e a última coisa a fazer é colocar um elemento espaçador acima do logotipo do pensamento. Então isso está bem aqui. Agora, do ponto de vista vertical, está tudo bem espaçado. Para esta pilha H com as duas cartas. Por que não colocamos alguns espaços lá? Então, vamos começar colocando um espaçador entre as duas cartas. E então o espaço dela antes todas as cartas e o espaçador depois das cartas. Vamos fazer a mesma coisa com os rótulos de texto aqui embaixo. Nesta pilha H. Vamos colocar um espaçador entre o imposto dos dois V. E então vamos colocar um espaçador antes da TI. E o espaço ou depois dele. Tudo bem, e agora a última coisa a fazer é apenas alterar as cores da fonte desses elementos de texto. E também para alterar seus pesos de fonte e tamanhos de fonte. E talvez adicione um pouco de espaço entre a pontuação e o rótulo. Ok, então vamos clicar neste elemento de texto e dar uma olhada no que poderíamos fazer. Portanto, se você procurar no painel do inspetor a fonte, poderá escolher um desses tamanhos de fonte predefinidos. Para este, vamos escolher o título. E você pode vê-lo. Fica um pouco mais ousado lá. Vamos mudar isso para branco. Faremos a mesma coisa pelo rótulo da CPU. Vamos mudá-lo para título. Vamos mudar a cor para branco. Então, para a pontuação real, vamos mudar a fonte para, digamos, subtítulo. E vamos mudar a cor para branco também. E para esse rótulo de pontuação, vamos mudá-lo para sub-título, e vamos mudá-lo para branco também. Tudo bem, e se quiséssemos fazer isso realmente, acho que na interface de usuário original eu tinha como título grande. Então, vou mudá-lo para isso. Então, vou mudar o 0 de sub-título para título grande. Agora, para adicionar algum preenchimento entre o rótulo e a pontuação aqui. O que você pode fazer é escolher o rótulo. Vamos começar com o jogador aqui. E vamos clicar apenas neste preenchimento inferior. Então habilite isso. E então você pode alterar esse número para, digamos 20. Você pode ver esse aumento. E isso parece um pouco demais. Então, talvez vamos ficar com 10. Faremos a mesma coisa com a CPU aqui e clicaremos apenas no preenchimento inferior e, em seguida, adicionaremos 10. Você pode ver o código correspondente aqui. Está adicionando preenchimento, mas está especificando apenas para a borda inferior e em 10 pontos. E esta é uma boa prática sempre que você modifica algo, visualmente, adicionando um modificador ou alterando algo no painel do inspetor aqui, É uma boa prática dar uma olhada no que mudou no lado do código, só para que você possa se lembrar ao longo do tempo, quanto mais você vê, mais você se lembra disso, ei, se eu quisesse alterá-lo para uma fonte de estilo de título, eu teria que adicionar um modificador de fonte de ponto e passar em uma opção de título. mesma coisa para a cor de primeiro plano para este elemento de texto, cor do primeiro plano do ponto, ponto de cor branco. Você não precisa tentar memorizá-lo, mas apenas preste atenção nisso. E com o tempo, você só vai se lembrar. E digitá-lo acabará sendo mais rápido do que ter que clicar visualmente e configurar as coisas através do painel do inspetor ou da tela de visualização. Tudo bem, última coisa a fazer, certifique-se salvar o projeto e está pronto. Então, nesta lição, você construiu a interface do usuário do jogo de cartas de guerra, mas para responder à interação do usuário e alterar programaticamente as imagens do cartão, teremos que aprender alguma programação rápida. Então, nas próximas quatro lições, você será apresentado ao básico de codificação com o Swift. Agora, se esta é a primeira vez que aprende a codificar, leve-a devagar e não tente memorizar nenhuma das palavras-chave. E depois disso, vamos voltar para essa interface de usuário do jogo de cartas de guerra e dar vida a ela com código. Tudo bem, te vejo lá. 7. 06: variáveis constants e tipos de dados: Olá e bem-vindo. Nesta lição e nas próximas três, você aprenderá o básico da linguagem de programação Swift. Agora, essas são as habilidades que você terá que ter para completar o jogo de cartas de guerra, bem como a criação do aplicativo de recursos que vamos fazer juntos. Agora, se você nunca codificou antes, eu sei que isso pode parecer um pouco intimidante, mas eu realmente quero que você fique com isso e realmente preste muita atenção. Na verdade, abra o Xcode em sua própria máquina e digite exatamente o que estou mostrando. Isso realmente ajudará a reforçar a estrutura da linguagem e todas as palavras-chave. Não há necessidade de memorizar nada. Garanto que até o final deste módulo, você estará escrevendo seu próprio código Swift. Tudo bem, vamos mergulhar. Quero começar analisando ciclo de vida da Atualização de visualização de um aplicativo simples e mostrar-lhe onde o código Swift desempenha um papel em cada parte do ciclo de vida. Vamos começar com o que você já aprendeu nas lições anteriores que a interface do usuário é gerada a partir do código Swift. Vamos chamar isso de seu código de visualização. Ele gera uma interface do usuário para o usuário ver. Agora, normalmente, com um aplicativo, temos algum tipo de dados que queremos recuperar e exibir. Por exemplo, um aplicativo de notícias. Gostaríamos de obter esses dados de uma fonte de dados e depois recuperá-los em nosso aplicativo e exibi-los em nossa interface do usuário. Você pode usar o código Swift para isso. O código rápido pode buscar os dados e depois processá-los em um formato que nosso aplicativo possa entender. Em seguida, usando o código Swift, também podemos vincular esses dados ao nosso código de visualização para que, quando a interface do usuário for renderizada a partir desse código de visualização, esses dados possam ser exibidos para o usuário. Além disso, quando o usuário interage com a interface do usuário, como tocar em um botão, podemos usar o código Swift para capturar esse evento e responder a ele. Agora, com base no que o usuário acessou, podemos usar algum código Swift para alterar nossos dados. Quando essa alteração de dados acontece porque vinculamos esses dados ao nosso código de visualização. Essas alterações de dados são detectadas automaticamente e a nova interface do usuário é renderizada novamente com os dados atualizados para que o usuário possa ver o que mudou. Agora, esse ciclo é essencialmente tudo o que o aplicativo está fazendo repetidamente. E vamos explorar este aplicativo, visualizar, atualizar o ciclo de vida com mais detalhes em lições futuras. Mas, por enquanto, só quero que você entenda que o código Swift tem um papel a desempenhar em cada parte desse ciclo de vida. Das últimas lições, você já viu o código para criar UI. Então você meio que sabe como esse código de visualização se parece. Vamos mudar nosso foco para a parte de dados onde podemos ver qual código Swift é usado para acompanhar os dados. Além disso, o que isso parece no nosso aplicativo? Para experimentar alguns dos códigos rápidos e encontrar a resposta para nossa pergunta, vamos usar um playground Xcode. Um playground é uma maneira leve testar alguns dos nossos códigos sem comprometer com um projeto de aplicativo completo que podemos fazer aqui. Pense nisso no playground do Xcode como o seu bloco de rabiscos, mas para o código, agora basta começar um novo. Vá para Arquivo, clique em Novo e, em seguida, vamos clicar no playground. Vamos escolher um playground em branco. E vamos dar um nome a ele. E vamos salvá-lo em algum lugar. Vamos fechar esta guia do navegador clicando neste botão porque não precisamos disso. Agora, aqui no canto inferior esquerdo, você notará que temos um botão chamado mostrou a área do bug. Vá em frente e clique nisso para revelar essa bandeja. Essa área do console do depurador é onde vamos gerar muitos dados. Então, basta ligar isso, certifique-se de ver esta pequena área aqui embaixo. E então este botão, quero que você clique nele agora, ele estará executando o playground. Ele executará todas as linhas de código na área do editor aqui. Observe, no entanto, que você também tem esse pequeno botão Run azul ao longo dos números de linha. E isso permite que você selecione qual linha você deseja executar o código até. Então, se eu passar o mouse sobre a linha três e eu apertar o botão aqui, ele vai rodar as linhas 123 oposição a este botão aqui, que executa tudo. Então, a primeira vez que você executa este playground, pode demorar algum tempo. Você mostra o spinner por até um minuto. Eu quero que você faça isso e deixe-o funcionar até que ele diga pronto para continuar. E isso vai nos configurar para executar algum código na próxima parte. Por enquanto, vamos apenas ir em frente e excluir essas linhas de código para que possamos começar de novo. Tudo bem, agora que sua configuração, vamos voltar à nossa pergunta original. Como são os dados e como usamos o código Swift para acompanhá-los? Vejamos alguns tipos diferentes de dados. Primeiro, vamos começar com um tipo de dados comum, um pedaço de texto. Em Swift, você cerca textos com aspas como esta. E isso é conhecido como um pedaço de dados de string. Vamos adicionar uma nota para nós mesmos aqui com duas barras para frente. Quando você faz isso, é chamado de comentário, e é uma maneira de deixarmos uma nota ou um pequeno pedaço de documentação para lembrarmos a nós mesmos ou a outras pessoas que podem estar olhando nosso código, o que esse código faz. E quando o Xcode vê essas duas barras, ele não executará essa linha. Agora vamos dar uma olhada em outro tipo de dados, números inteiros. Então, algo que se parece com isso. Em Swift, isso é conhecido como int, abreviação de inteiro. E quanto aos números decimais? Bem, sim, esse também é um tipo de dados que o Swift pode reconhecer e lidar. Cada um desses. Eles são conhecidos como um duplo. E o swift também pode lidar com valores booleanos. Então coisas como verdadeiras e falsas. Em Swift, isso é conhecido como bool. Agora string, int, double e bool. Esses são todos chamados de tipos de dados e é como o Swift classifica os dados. Agora, esses não são todos os tipos de dados disponíveis, mas esses são os, longe, os mais comuns que você usará, pelo menos no começo. E é um ótimo ponto de partida para nós. Tudo bem, agora vamos dar uma olhada em criar e manter o controle dos dados. No Swift, existem muitas maneiras de acompanhar os dados, mas duas delas são maneiras básicas usar variáveis e constantes. Vamos voltar ao nosso playground Xcode e dar uma olhada em um exemplo. Vamos começar com nossos dados de string hello aqui. Agora, esse pedaço de dados por conta própria será inútil para nós, a menos que tenhamos uma maneira de referenciá-los e rastreá-los. E poderíamos fazer isso com uma variável. Então, vamos ver como podemos declarar uma variável para acompanhar esse pedaço de dados de saudação. Então, usamos a palavra-chave var e isso é para declarar uma nova variável. E depois digitamos o nome da variável. Esse nome é o que vamos usar para referenciar esse pedaço de dados e lembrá-los. Então eu vou chamar isso de MyVar, e depois seguimos com dois pontos. E depois disso, colocamos o tipo de dados que essa variável vai rastrear. Como os dados que queremos referenciar são um pedaço de dados de string, vou colocar string aqui. E, em seguida, geralmente na mesma linha que declaramos a variável, atribuímos os dados à variável para acompanhar. E podemos fazer isso usando o operador de atribuição, que é apenas um símbolo igual. E, no lado direito disso, colocamos os dados que queremos atribuir a essa variável. Vou pegar isso e mover isso aqui. Então, essencialmente, o que esta linha de código está dizendo, estamos declarando uma nova variável chamada MyVar. Estamos dizendo que ele mantém o controle dos dados do tipo de string. E, em seguida, estamos atribuindo esses dados de string de saudação a essa variável. É como se estivéssemos anexando um rótulo a esse pedaço de dados chamado MyVar. Agora, sempre que eu quero fazer referência a esse pedaço de dados, tudo o que preciso fazer é referenciá-lo pelo nome da variável. Então, vamos tentar isso. Podemos usar um comando especial que emitirá os dados para a área do console abaixo aqui no playground. E esse comando é apenas impresso seguido por dois colchetes arredondados. E entre esses colchetes você coloca a variável ou quaisquer dados que você deseja produzir. Então, vou fazer isso. E então aqui eu vou parar meu playground e executar todo o código nele novamente. E então, como você pode ver lá embaixo e diz olá, que o conteúdo do MyVar, que é exatamente o que esperaríamos. Observe que quando faço referência à minha variável, não preciso mais usar a palavra-chave var. Isso foi apenas para declarar a variável. E depois de declarar minha variável, posso apenas referenciá-la pelo final do nome. Também posso reatribuir novos dados a ele. Posso usá-lo repetidamente. Não preciso redeclará-lo. Então, por exemplo, depois declarar um olá atribuído a ele, posso me virar e atribuir outra coisa a ele. Vamos atribuir esse pedaço de dados de string chamado world para MyVar. E, essencialmente, o que fizemos aqui é que dissemos a essa variável para rastrear esse pedaço de dados. Então, o que você esperaria se eu executar o código no playground agora? Nós só produziríamos mundo porque MyVar não está mais rastreando esse pedaço de dados de saudação. Agora, uma coisa que quero enfatizar é o tipo de dados da variável. Se eu especificar que myVar é um tipo de string, só poderei rastrear partes de dados de string. Por exemplo, se eu tivesse um número inteiro como 100 e tentei atribuí-lo ao MyVar, bem, receberei um erro que não é permitido. O que eu preciso fazer é declarar uma nova variável do tipo int para acompanhar esse pedaço de dados int. Então, vamos seguir em frente e usar a palavra-chave var e nomeá-la. E depois dois pontos e depois o tipo de dados que eu quero que isso rastreie. E agora está tudo bem. Vamos tentar imprimir isso. O Xcode não ajudará você a corrigir automaticamente nenhum erro ortográfico. Tudo bem, então temos mundo e 100. Agora, à medida que estamos codificando mais juntos, você começará a notar diferentes tipos de convenções de nomenclatura, como o que você vê aqui, onde meus nomes de variáveis começam com uma letra minúscula e então cada palavra subseqüente no nome da minha variável começa com uma letra maiúscula. Então isso é uma espécie de convenção de nomenclatura padrão. Você realmente poderia fazer o que quiser. Mas quando você começa a codificar mais e trabalhar em equipes, é importante ter. Padrão que todos usam, e esse é comum. Tudo bem, agora mais uma coisa que eu quero falar antes de avançarmos para o próximo tópico é o fato de que existem taquigrafias no Xcode. Você realmente não precisa digitar todas as informações. Por exemplo, aqui, estamos declarando que essa variável, meu int, é um tipo int e estamos atribuindo dados inteiros a ela. Mas o problema é poderíamos realmente omitir esse tipo de dados e simplesmente atribuí-lo 102. Quando fazemos isso, o Xcode pode ver que este é um pedaço de dados int. Então, vai supor que meu int só vai rastrear em tipos. Agora, essa mesma regra ainda se aplica. Quero dizer, depois que o Xcode infere que essa variável é do tipo n porque você atribuiu 100 a ela. Não posso ir e atribuir uma string a ela. Isso não será permitido porque o Xcode é, já detectou que isso deveria ser um tipo n. Então, a mesma coisa vale para aqui em cima. Não preciso especificar o tipo de dados. Se eu vou atribuir um pedaço de dados de string a ele imediatamente porque isso diz ao Xcode que essa será uma variável do tipo string. Então isso é apenas um pouco abreviado para poupar algum tipo de digitação. Tudo bem, então você aprendeu a declarar uma nova variável, atribuir dados a ela e recuperar esses dados usando o nome da variável. E você também aprendeu a atribuir novos dados a essa variável. Vamos falar sobre a outra maneira de acompanhar os dados. Constantes. Portanto, as constantes são como variáveis, exceto que você não pode reatribuir dados a elas depois atribuir o primeiro pedaço de dados a ele. Então sigillata, como declarar uma constante para acompanhar esses dados de string. Em vez da palavra-chave var, você usa a palavra-chave let. E então o resto é o mesmo que uma variável. Então, começamos com um nome constante, meus dois pontos, e então você adivinhou que o tipo de dados seguido pelo operador de atribuição. E então vamos mover esse pedaço de dados para o lado direito desse operador de atribuição assim. Agora vamos tentar fazer referência a essa constante. Vamos tentar imprimir os dados no meu contexto. Como você pode ver, funciona conforme o esperado. Agora, vamos tentar fazer o que não é permitido. Vamos tentar atribuir outra coisa a ele. E, como esperado, não podemos reatribuir dados a eles porque é uma constante. Agora as constantes são úteis. É uma ferramenta adicional que podemos usar se não esperarmos que esse pedaço de dados mude. E, portanto, não precisamos fazer nenhuma alteração nisso nunca. Então, quando você usaria uma constante sobre uma variável? Bem, isso realmente depende do que você está tentando fazer. Você provavelmente vai se encontrar usando variáveis na maioria das vezes por causa de sua versatilidade e porque os dados mudam, no entanto, a melhor prática é preferir constantes em vez de variáveis onde ele faz senso. Na verdade, o Xcode é inteligente o suficiente para saber se você usa uma variável e nunca acaba alterando essa variável, isso sugerirá que você altere essa palavra-chave var para uma palavra-chave let e usar uma constante em vez disso. Tudo bem, vamos fazer uma rápida recapitulação antes de finalizar a lição, você aprendeu sobre o ciclo de vida da atualização de visualização e como o código Swift desempenha um papel nela. Você aprendeu sobre tipos de dados como string, int, bool e double. Você aprendeu sobre como usar variáveis e constantes para referenciar dados. Você está fazendo grandes progressos até agora. E na próxima lição, vou te ensinar como organizar suas instruções de código em funções. Tudo bem, te vejo lá. 8. 07: funções de programação Swift: Olá e bem-vindo. Na lição anterior, você aprendeu sobre variáveis e constantes Swift. Você aprenderá a criar alguns dados e declarar uma variável ou constante para acompanhá-los. Enquanto nesta lição você aprenderá a organizar, agrupe suas declarações de código. Portanto, esse número um, todas as instruções de código que você agrupou podem trabalhar juntas para uma tarefa comum. E o número dois, uma vez que seu código é organizado em grupos, você pode escolher qual grupo de coats executar dependendo da tarefa que você precisa ser feita. Esses grupos têm instruções de código são conhecidas como funções no Swift. Tudo bem, agora vamos dar uma olhada no diagrama do ciclo de vida da atualização da exibição da lição anterior e ver onde as funções podem desempenhar um papel nesse ciclo de vida. Lembre-se de que quando o usuário interage com a interface do usuário, código Swift captura esse evento e reage a ele. Bem, aqui podemos ter algumas funções diferentes, dependendo de como o usuário interage com nossa UI. Por exemplo, o usuário tocando em um botão pode acionar o aplicativo para alternar de tela. Nesse caso, talvez executemos função a para executar essa tarefa. Ou, por outro lado, se o usuário tocar em um item para ver mais detalhes? Então, nesse caso, executaremos função B para abrir a tela de detalhes. Agora vamos examinar o código que executa a recuperação de dados. Por exemplo, podemos ter uma função C que faça a recuperação real dos dados, talvez o código de rede. E ele pega os dados e, em seguida , fornece a função D como entrada. E a responsabilidade dessa função pode ser processar esses dados e transformá-los em um formato que nosso aplicativo possa entender. Portanto, a função D usa esses dados como entrada e produz os dados formatados para o nosso aplicativo. Agora eu poderia continuar, mas como você pode ver, as funções são um componente básico da programação rápida. Está em todos os lugares. Então, agora vamos ver como podemos criar nossas próprias funções. Tudo bem, então aqui eu tenho um novo playground Xcode e vamos dar uma olhada na sintaxe da função. E no caso de eu ainda não ter explicado isso, a sintaxe da palavra é simplesmente uma palavra descreve a estrutura ou a gramática da linguagem. Então, sintaxe de função para declarar uma nova função, você começa com a palavra-chave func FUN, veja. É uma função funky. E então você o segue pelo nome da função. E então um conjunto de parênteses são colchetes arredondados e, em seguida, um conjunto de colchetes encaracolados. Dentro do conjunto de colchetes encaracolados, você coloca suas instruções de código, qualquer coisa que você queira executar ou executar sempre que chamarmos essa função. Então deixe-me colocar algumas declarações aqui. Digamos que declare duas constantes como esta e, em seguida, vamos imprimir um plus b. Então, se eu executar isso agora e executar todas essas linhas de código, nada vai acontecer. Você não vê nenhuma saída. E isso porque na verdade não chamamos essa função. Para chamar e executar essa função, só precisamos referenciá-la pelo nome da função. Então esse é o meu FUN, C, seguido pelos parênteses do par, e é assim que você executa todo o código entre aqui. Então, vamos experimentar isso. Vou parar de executar e depois executar meu playground novamente. E recebemos 30 como esperamos. Se eu quisesse executar esse conjunto de instruções novamente, então eu posso simplesmente chamá-lo novamente. E se eu imprimi-lo, agora executa esse código duas vezes. Agora eu quero voltar para esse diagrama de ciclo de vida de atualização de visualização por apenas um segundo. Porque se você notar de volta nessa área de recuperação de dados, eu disse que poderíamos ter duas funções, c e funções dy, onde C iria buscar os dados e passá-los para D como parâmetros de entrada. Assim, essa função D pode funcionar com esses dados e formatou como precisamos. Portanto, uma função poder aceitar dados nele para trabalhar com eles é um recurso muito poderoso. Vamos dar uma olhada em como declararíamos uma função que aceitaria algum tipo de dados de entrada. Tudo bem, então vou apagar essas duas linhas e vou modificar minha função aqui. Em vez de declarar duas constantes, a e b, vou especificar que a e b devem ser passados para a função. Então, a maneira como fazemos isso é através do uso de parâmetros de função entre os dois colchetes arredondados. É aí que especificaríamos todos os parâmetros que queremos passar para essa função. Você pode passar vários parâmetros, mas, na verdade, vamos começar com um e vamos começar com a. Então primeiro eu colocaria o nome do perímetro, então eu gostaria que fosse oito. E então eu colocaria dois pontos especificados pelo tipo de dados que esse parâmetro é. Como eu espero que seja, vou declarar esse parâmetro como um seguido pelo datatype int. E então eu posso apagar essa constante daqui. Como você pode ver, isso é quase como uma declaração de variável ou uma declaração constante, exceto sem o var e sem a esquerda. Aqui estamos especificando que sempre que essa função é chamada, um parâmetro int precisa ser passado junto com ela. E ele será referenciado por esse nome de parâmetro a dentro dessa função. Então agora você pode ver que em nenhum lugar eu declarei uma variável a ou constante a, mas ainda posso colocar um como parte da minha equação a mais B porque está sendo passado como um parâmetro. Então, vamos dar uma olhada em como seria chamar essa função. Agora, vou contar com o preenchimento automático. Então vou digitar MY FUN e você pode ver assim que eu fizer isso, ele detecta minha função aqui. Então, vou seguir em frente e clicar nisso. E você pode ver que agora, no processo de chamar essa função, eu também tenho que passar um pedaço inteiro de dados. Então eu vou seguir em frente e passar isso, passando algo diferente no passado e cinco, você pode ver aqui, indica que este é o parâmetro que estou passando. Vamos prosseguir e parar, executar e executar minhas linhas de código novamente. E desta vez a saída é 25, porque 5 estava sendo passado para a função. Mais 20 é 25. Agora, voltando ao diagrama do ciclo de vida View Update novamente, função D aceita entrada como parâmetro, mas também retorna a saída. Então esse é outro recurso muito poderoso das funções. Ser capaz de receber alguma entrada, trabalhar com esses dados e fornecer alguma saída de volta à cor da função. Vamos dar uma olhada em nosso playground e ver como podemos especificar que uma função deve retornar alguns dados. Então, para modificar essa função para indicar que ela retornará alguns dados. Subimos aqui logo após o suporte arredondado para o perímetro, e pouco antes do início dos suportes encaracolados. Aqui, escrevemos um traço seguido por um símbolo maior que, que faz uma espécie de seta como saída. E, em seguida, especificamos o tipo de dados da saída. Então, o que vou fazer é gerar a soma de a e B em vez de imprimi-la no console. Então, vou apagar essa linha. E então vou produzir um int. Então é aí que eu especifico isso depois desse traço maior que o símbolo. Agora você pode ver que o Xcode lança alguns erros agora porque além de especificar que sua função retorna um int, você realmente precisa retornar um int dentro das instruções de código. Então, como a última linha do nosso código, podemos usar a palavra-chave return, o que significa que esses são os dados que vamos retornar da função. E, em seguida, especificamos os dados que queremos retornar. Então, vou retornar a mais b. E tudo é, bem, agora lembre-se de que qualquer tipo de dados que você especificar aqui na declaração da função, esse é o tipo de dados que você tem para retornar se houver uma incompatibilidade. Por exemplo, se eu especifiquei que essa função retorna um int, mas vou em frente e retorno uma string. Como um pedaço de texto. Você vai ver o Xcode. Reclame disso também porque isto é, isso está incorreto. Então, vamos retornar a mais b e vamos retornar um int. Então, por que não executamos nossa função agora e vemos o que acontece. Nada acontece. Bem, o que está acontecendo? Estou devolvendo um plus b. Então aqui está o que está acontecendo. Chamar essa função está retornando esses dados, mas preciso de alguma forma referenciar e rastrear esses dados, certo? E é para isso que serve uma variável. Então, vou declarar uma variável aqui, var. Vamos declarar constante na verdade, já que não vou mudar isso, deixe minha soma ser igual ao resultado dessa função. Então você pode entender essa taxa de declaração de código, estamos declarando uma constante chamada minha soma. E então estamos chamando essa função na mesma linha que retorna 25 e estamos atribuindo 25 à minha soma. Então agora posso imprimir minha soma. E vamos verificar novamente se obtemos a saída. Lá vamos nós. Agora, antes de seguirmos em frente, há duas coisas muito importantes que eu quero mencionar. Portanto, essa instrução retorna realmente encerra a execução dessa função. Então, uma vez que essa instrução return é executada, a execução retorna dessa função. Então, qualquer declaração de código que você colocou aqui, digamos que eu tenha retornado um b ali mesmo, e eu imprimi a mais b aqui. Essa instrução print não será executada o código C depois que o retorno nunca será executado. Então, isso é importante ter em mente que quando você escreve retorno e ele executa essa linha de código, a execução pára e sai dessa função. Outra coisa que eu queria mencionar é esse tipo de retorno. Então, mais cedo, quando eu disse que declarar uma função não tinha um tipo de retorno como esse. Bem, na verdade aconteceu. Foi só que o tipo de retorno foi nulo. E vazio não significa nada. Então deixe-me, deixe-me fazer uma demonstração básica, na verdade, deixe-me declarar outra função aqui. Vou chamar isso de microfone para ver naquela época eu disse que era uma declaração básica de uma função, mas na verdade isso era uma abreviação. A declaração completa realmente tem um tipo de retorno de vazio como esse se você não for retornar nada. Mas é só que quando você não retorna nada, então você não precisa especificar o tipo de retorno de vazio. Então, pensei que tinha mencionado isso. Então você sabe o que essa palavra-chave vazia significa. Então, se você vir alguma função que tem um tipo de retorno de vazio, você sabe que isso basicamente significa que ela não está retornando nada. Tudo bem, então agora vamos redefinir um pouco. Está começando a ficar um pouco confuso. Então, vamos apagar tudo, exceto isso, exceto nossa função aqui. Agora eu quero mostrar como podemos passar em vários parâmetros. Então, em vez de especificar estar aqui, vamos colocar B na listagem de parâmetros aqui e fazer com que ela seja passada. Ok, então deixe-me apagar esta linha de código para que obtenhamos B apareça. Bem, como adicionamos outro parâmetro a este? O que você faz é simplesmente colocar vírgula e depois declarar outro parâmetro para sua função. Calma, certo? Vamos nomear este ser seguido por dois pontos e, em seguida, o tipo de dados de B, que será outro inteiro. Tudo bem, então agora vamos dar uma olhada em como chamamos essa função com dois parâmetros. Meu func, você pode ver isso aqui. Não, basta especificar, oh, uma coisa rápida é quando você está chamando funções, uma maneira fácil de preencher os parâmetros na lista é pressionando tab. Isso apenas leva você ao próximo parâmetro que você precisa preencher. Então vou colocar 2 e 3. Vamos executar todo esse código e obtemos um resultado. Não obtemos resultado. Lembre-se que apaguei minha linha de código. Então, por que não imprimimos o resultado em vez de atribuí-lo a uma variável desta vez. Então, vou prosseguir e passar diretamente essa chamada de função para a minha declaração de impressão. Isso imprimirá a saída da minha função. Vamos seguir em frente e executar esse código e obtemos 5. Agora, obviamente, você pode ter mais de dois parâmetros. Basta colocar uma vírgula entre cada parâmetro em sua função. E então outra coisa que eu queria mencionar que é muito legal com parâmetros, é que você pode especificar um valor padrão para um parâmetro. Então, por exemplo, para o parâmetro b, eu poderia tornar isso um dado de entrada opcional especificando um valor padrão para esse parâmetro. Se eu fizer isso, isso significa que quando essa função for chamada, passar dados para o parâmetro b será opcional. Vamos dar uma olhada em como isso funciona. Então, depois de especificar o tipo de dados para o meu parâmetro b, posso colocar um sinal de igual e, em seguida, posso dar um valor a ele. Digamos que 0 seja o valor padrão. Se b não for passado, então B será apenas 0. Agora, vamos apagar minha chamada de função, e vamos tentar chamá-la novamente e dar uma olhada no que o menu de preenchimento automático nos mostra. Aqui você pode ver que existem duas formas diferentes de minha chamada de função agora, uma é com os parâmetros a e b. Então eu passo em ambos os dados. E um é simplesmente passar um parâmetro a. Se eu fizer isso, v vai ser apenas 0. Mas se eu passar em ambos, digamos que eu passe 23 novamente, então B será três em vez de 0. Portanto, essa é uma maneira de tornar seus perímetros opcionais. Agora eu quero falar sobre rótulos de argumento. Como você pode imaginar, quanto mais parâmetros tivermos, mais coisas confusas serão em termos dessas chamadas de função, especialmente quando se trata de nomes de parâmetros como a e B. Bem, às vezes a e B fazem sentido no contexto do código dentro da função. Mas para a cor da função, a e B. Eles não significam nada. Portanto, há um recurso especial chamado rótulos de argumento. E deixe-me mostrar o que isso parece. Então, vou declarar uma nova função aqui. Vou chamá-lo de meu func também. E eu vou realmente, sabe o quê? Vou simplesmente copiar essa função e fazer uma cópia dela e mostrar como, como os rótulos de argumento a alteram. Portanto, um argumento rotulado vai na frente de cada parâmetro. Portanto, cada parâmetro pode ter seu próprio rótulo de argumento, e você está essencialmente apenas colocando um nome na frente desse parâmetro. Vou chamar esse primeiro parâmetro. Vou dar a ele um rótulo de argumento chamado primeiro número. E para o meu, para o segundo parâmetro, vou dar a ele um argumento chamado segundo número. Então isso é literalmente tudo o que é. Um rótulo de argumento é um nome na frente do nome do parâmetro separado por um espaço. Vamos dar uma olhada em como isso afeta a chamada de função. Se eu digitar meu func, você pode ver aqui que eu ainda tenho esses dois primeiros, a e B, e isso é da primeira função aqui. Mas olhe aqui, tenho o primeiro número e o primeiro número e o segundo número. E isso corresponde à minha segunda função aqui, porque o segundo número ainda é opcional, certo? Porque eu tenho esse valor padrão lá. Então, se eu chamar isso. Minha chamada de função se torna este myfunc primeiro número 1, segundo número 3. No entanto, internamente dentro dessa função, ainda estou referenciando esses parâmetros usando a e b. Portanto, rótulos de argumentos lá. Uma maneira de distinguir a nomeação uma chamada de função versus como ela é referenciada dentro do código. Considerando que, se você omitir os rótulos de argumento, como fizemos aqui, os nomes dos parâmetros serão usados tanto para a chamada de função quanto a referência desses parâmetros dentro de a função. Então, espero que você perceba a diferença aqui. Um truque legal que você pode fazer com rótulos de argumento é que se você não quiser mostrar nenhum texto em sua chamada de função, você pode usar um sublinhado como seu rótulo de argumento. Então, se você fizer isso, vamos ver o que acontece com sua chamada de função. Então meu func, você pode ver aqui esses dois correspondem ao que eu fiz aqui, usando sublinhados para os rótulos de argumento. Então, se você usar um sublinhado para o rótulo de argumento, as chamadas de função se tornam myfunc. E, em seguida, o primeiro pedaço de dados, vírgula, segundo pedaço de dados. Não há nomes de parâmetros, não há rótulos de argumento em sua chamada de função. Então, isso torna as coisas realmente sucintas e muito arrumadas e arrumadas, mas também torna as coisas mais confusas se não estiver claro quais esses parâmetros devem ser quatro. Portanto, há muita versatilidade aqui. Minha preferência pessoal é simplesmente fazer isso desta primeira maneira. E geralmente não especifico nenhum rótulo de argumento. E eu simplesmente uso os nomes do perímetro. Ok, a última coisa que prometi antes de terminarmos com funções é que não sei se você notou, mas declaramos duas funções diferentes aqui, ambas com o mesmo nome de função. Não podemos fazer isso com variáveis, certo? Se você tentar declarar a variável a e depois a variável a novamente, receberá um erro na segunda. E o Xcode vai reclamar, você não pode redeclarar a variável 8. Para funções. As coisas são um pouco diferentes. As funções têm o que é chamado de assinatura de função. E isso é composto pelo nome da função, na listagem de parâmetros e, em seguida, seguido pelo tipo de retorno. Então, vamos digitar myfunc e dar uma olhada no que o menu de preenchimento automático nos dá. Como você pode ver, todas essas quatro variações têm o mesmo nome de função chamado myfunc. Mas como os valores de parâmetros, rótulos de argumento, eles são diferentes, Xcode é capaz de discernir e saber qual função estamos tentando chamar, certo? Então, se eu chamar este e não especificar nenhum nome de parâmetro ou rótulo de argumento. Ele sabe que estou tentando chamar esse segundo aqui porque essa chamada de método, essa chamada de função. Quero dizer, não corresponde a este primeiro. Enquanto que se eu fizer meu func e especificar rótulos de parâmetros a e b, então ele definitivamente sabe que estou tentando chamar o primeiro porque essa chamada, essa listagem de parâmetros aqui corresponde aqui. Ok, então eu prometi que fomos um pouco mais fundo do que você provavelmente precisa saber agora, mostrando todas essas opções e maneiras pelas quais funções podem ser flexíveis à medida que codificamos mais juntos, você vai me ver apenas usando formas mais básicas de funções, mas pelo menos pague agora você sabe muito mais e tenho certeza que você pode apreciar o quão poderosas essas funções são. Tudo bem, esta lição foi bastante cheia de ação. Vamos fazer uma recapitulação antes de encerrarmos a lição. Primeiro de tudo, você aprendeu a declarar funções básicas e, em seguida, aprenderá a declarar funções que aceitam dados de entrada como parâmetros. Além disso, você aprenderá a declarar uma função com vários parâmetros. E, novamente, funciona quando quase tão útil se não puder produzir dados, certo? Você aprenderá a fazer isso usando tipos de retorno e a palavra-chave return. Você também aprendeu sobre rótulos de argumento. E, finalmente, você aprendeu sobre assinaturas de funções. Você está fazendo um grande progresso. E na próxima lição, mostrarei como organizar suas funções em duas estruturas. Então eu te vejo lá. 9. 08: estruturas de programação Swift: Olá e seja bem-vindo. Até agora você aprendeu sobre variáveis e constantes e como elas são usadas para acompanhar os dados. Você também aprendeu sobre funções para organizar e agrupar, você tem instruções de código. Enquanto estiver nesta lição, você aprenderá sobre estruturas ou estruturas resumidamente. E esses são os blocos básicos para representar seus dados ou representar algo em seu aplicativo. As estruturas reúnem as funções que variáveis e constantes, tudo o que você aprendeu até agora nas últimas lições, tudo em um pequeno pacote limpo. Tudo bem, vamos mergulhar e ver do que se trata. Agora vamos fazer uma recapitulação rápida. Primeiro, você tinha casacos, coisas como essas. E então mostrei a você como usar funções para organizá-las e agrupá-las. Agora, com estruturas, você pode agrupar suas funções. Você também pode ter variáveis e constantes, acompanhar os dados dentro de sua estrutura, mas fora de qualquer função. E vamos falar sobre isso um pouco mais tarde nesta lição. Agora vamos dar uma olhada no diagrama do ciclo de vida da atualização de exibição novamente. Para o código de visualização que representa a IU dela, você pode criar uma estrutura para representar sua tela inicial e todo o código de visualização da tela inicial entraria nessa estrutura. Se você tivesse uma segunda tela em seu aplicativo, talvez crie outra estrutura para essa segunda tela. E todo o código de visualização segunda primavera entraria nessa estrutura. Nesse caso, cada estrutura representa uma tela diferente em seu aplicativo. Agora vamos passar para a parte de recuperação de dados deste diagrama. Você pode criar uma estrutura e chamá-la de gerenciador de dados. E você colocará todos os códigos e funções relacionados à recuperação e processamento dos dados dentro dessa estrutura do gerenciador de dados. Nesse caso, a estrutura não representa uma triagem de seu aplicativo, em vez disso, representa um componente crucial do seu aplicativo. Assim, como você pode ver, as estruturas são muito flexíveis e leves e são usadas em todo o seu aplicativo. Agora vamos entrar em um playground do Xcode e dar uma olhada em como podemos declarar nossa própria estrutura. Tudo bem, então aqui eu tenho um novo playground vazio. Vamos dar uma olhada em como podemos definir nossas próprias estruturas. Primeiro, você começa com a palavra-chave struct, seguida por um espaço e, em seguida, o nome da sua estrutura. Então, vou chamar isso de minha estrutura. E então você coloca um espaço e abre um conjunto de suportes encaracolados. Dentro dos colchetes encaracolados, você colocaria todo o código em sua estrutura, e é isso. Nós declaramos nossa própria estrutura. Agora, antes de seguirmos em frente e dar uma olhada no que está dentro da estrutura, quero apontar a convenção de nomenclatura da estrutura. Observe que eu comecei com uma letra maiúscula. Esta é a convenção padrão. Isso é diferente do invólucro de camelo que usamos para as variáveis e constantes e os nomes das funções. Aqueles começaram com uma letra minúscula e tinha cada palavra subseqüente começando com uma letra maiúscula. Enquanto que para estruturas, ele começa com uma letra maiúscula e, em seguida, cada palavra subseqüente tem uma letra maiúscula. Tudo bem, agora que você sabe sobre nomear estruturas, vamos entrar e dar uma olhada em como organizamos as coisas dentro da estrutura. Então, geralmente no topo da estrutura, dentro dos colchetes encaracolados, declararíamos aqui todas as nossas variáveis e constantes usadas para rastrear dados relacionados à estrutura. Agora, eles têm um nome especial, como mencionei anteriormente, e chegaremos a isso mais tarde nesta lição. Então, aqui em cima, depois de declarar todas as variáveis e constantes dados de rastreamento para essa estrutura, a próxima seção que você tem são todas as funções relacionadas à estrutura. Agora, não há seções claramente definidas em uma estrutura. Você sabe, todo o código realmente vai entre os colchetes encaracolados. Mas geralmente é assim que você organizaria todos os diferentes pedaços de código dentro de sua estrutura. Então, na parte superior, variáveis e constantes e, em seguida, na parte inferior, todas as funções. Então, como você pode ver, as estruturas são ótimas para agrupar funções, variáveis e constantes estão relacionadas para uma coisa. Mas as estruturas geralmente são destinadas a representar algo em seu aplicativo no diagrama do ciclo de vida da View Update que você viu anteriormente, vimos exemplos de uma estrutura sendo usada para representar uma tela do seu app, bem como representar um componente crucial do seu aplicativo como o Network Manager. Então, por que não fazemos outro exemplo, e mostrarei uma estrutura que é um pouco mais concreta. Vamos modelá-lo depois de alguma coisa. Então, no início do diagrama do ciclo de vida da Atualização da visualização, você viu que poderíamos usar estruturas para representar uma visualização em nosso aplicativo. Então, vamos com isso. Vamos ter um aplicativo de bate-papo hipotético. E digamos que essa estrutura represente minha visualização de bate-papo. Então, vou mudar o nome da minha estrutura para a visualização de bate-papo. Agora, em variáveis e constantes, talvez eu tenha uma variável para acompanhar a mensagem, como a mensagem de bate-papo que estou digitando na caixa de bate-papo. Então, vou chamar essa mensagem. E o tipo de dados que isso seria, provavelmente seria uma string. E vou atribuir uma string vazia, nada no meio, apenas duas aspas. Então isso é o que é conhecido como uma string vazia. Agora, em funções, eu poderia ter grupos de código que executariam diferentes tarefas na tela. Por exemplo, talvez quando o usuário toca no botão enviar bate-papo, ele executaria algum código para enviar a mensagem de bate-papo para o servidor. Então eu declararia uma função. Então isso é funk, seguido de, vamos chamar isso de envio de bate-papo e dois parênteses arredondados. E vou abrir um par de suportes encaracolados. E aqui dentro, eu colocaria o código para enviar uma mensagem de bate-papo. E, em seguida, entre as variáveis e constantes e as funções, eu teria o código de visualização para esta tela e como todo o código para a interface do usuário. Então, agora, nesta estrutura de visualização de bate-papo, temos um pequeno pacote elegante contendo todo o código dessa tela. Agora, anteriormente mencionei que as variáveis e constantes que você declara no topo da estrutura, elas têm um nome diferente. Então agora eu quero te dizer o que é isso. Esta declaração de variável que tenho aqui em cima mensagem. Isso é conhecido como uma propriedade da estrutura de exibição de bate-papo. Se eu tivesse declarações adicionais de variáveis ou constantes, elas seriam conhecidas como propriedades do chat. Você estrutura também? E aqui em baixo, as funções também têm um nome diferente. Uma função dentro de uma estrutura é conhecida como um método dessa estrutura. Portanto, esta função de envio de bate-papo é , na verdade, um método de exibição de bate-papo. Então agora vamos apenas atualizar nossos comentários aqui para que usemos a terminologia adequada em vez de variáveis e constantes aqui. Vou renomear isso, bem não renomeado, mas basta redigitar meu comentário e chamar essas propriedades. E em vez de funções, essas serão chamadas de métodos, só para ficarmos claros. Agora, dentro de uma estrutura, propriedades e métodos podem realmente trabalhar juntos para cumprir os deveres da exibição de bate-papo. Vamos dar uma olhada em algumas das maneiras especiais pelas quais eles podem trabalhar juntos. Agora vamos dar uma olhada nisso enviar um método de bate-papo. Por exemplo, se escrevermos o código aqui para enviar uma mensagem de bate-papo, certeza seria útil se pudéssemos acessar a mensagem real nesta propriedade de mensagem, certo? Bem, na verdade, podemos. Então, se eu escrevi algo assim, imprima e depois dentro dos parênteses, coloquei o nome da propriedade. Na verdade, posso acessar esses dados. E a razão para isso é porque essa propriedade é declarada no escopo dessa estrutura. Portanto, o escopo da estrutura é qualquer coisa entre esses dois suportes encaracolados, essencialmente a abertura e fechamento de suportes encaracolados da estrutura. Então, qualquer um dos métodos que eu declaro aqui, por exemplo, se eu declarar outro, vamos chamar esse chat de exclusão. Porque esses dois métodos também estão no mesmo escopo. Você sabe, está dentro do escopo da visualização do chat. Sou capaz de acessar a propriedade. As propriedades que você declara aqui são avaliáveis para tudo dentro do mesmo escopo. Isso inclui todos os métodos que são declarados aqui em baixo. Agora tenho que dizer que cada método tem seu próprio escopo local. Portanto, esse método de bate-papo de envio tem um escopo dentro aqui. E esse método de chat de exclusão tem seu próprio escopo entre esses colchetes. Então, se eu declarar uma variável dentro do meu método de chat de envio, digamos que o prefixo var seja igual a Chris, digamos. E então digamos que eu use esse prefixo e prependi à minha mensagem de bate-papo. Então, toda a mensagem de bate-papo seria Chris diz, e depois alguma coisa. Então, talvez eu imprima o prefixo mais a mensagem para obter esse tipo de efeito. E eu queria fazer a mesma coisa dentro do chat de exclusão. Se eu tentar acessar a variável de prefixo, digitar, imprimir, prefixo mais mensagem aqui dentro do método delete chat, você verá que, o Xcode reclama. Nssa não consegue encontrar o prefixo no escopo porque essa variável não é declarada no mesmo escopo. Ele é declarado dentro do escopo do envio de bate-papo. Então, como resolveríamos isso? Bem, uma das maneiras que poderíamos fazer isso é transformar essa variável de prefixo em uma propriedade que declaramos no topo de nossa estrutura. Você sabe, mova-o para fora do escopo do chat do Sen e coloque-o aqui no escopo da exibição de bate-papo. Então, agora que estou declarando meu prefixo como uma propriedade da exibição de bate-papo, você pode ver que os erros desaparecem. E posso acessar essa propriedade de prefixo dentro. Ambos enviam um bate-papo e excluem métodos de bate-papo. Agora eu quero falar sobre outro tipo de propriedade. Primeiro, vamos definir quais são essas propriedades aqui. Eles são chamados de propriedades armazenadas. E o motivo é porque quando você acessa essas propriedades e referência a elas pelo nome próprio, ela só retorna o valor armazenado. Há outro tipo de propriedade quando você acessa, ela precisa calcular ou calcular o valor antes de devolvê-lo para você. Então, vamos dar uma olhada em como esse segundo novo tipo de propriedade se parece. Então, deixe-me começar apagando essa propriedade de prefixo aqui e excluindo isso. E então vou declarar esse novo tipo de propriedade. Começa como um normal. Use o espaço VAR e, em seguida, o nome da propriedade calculada. Vou chamá-lo de mensagem com prefixo, seguido pelo nome. Em vez de atribuir alguns dados, você abre um conjunto de colchetes. E aqui você pode colocar o código computacional para calcular o valor que você retornará quando essa propriedade for chamada. Uma coisa, porém, porque o valor não é imediatamente conhecido, Xcode não pode inferir qual é o tipo de dados. Portanto, você realmente precisa especificar o tipo de dados após o nome da propriedade computada. Então, depois de mensagem com prefixo, vou colocar dois pontos e vou colocar string porque esse é o tipo de valor que essa propriedade retornará. Isso é diferente dessa mensagem de propriedade armazenada aqui em cima , onde eu posso realmente usar a abreviação e apagar o tipo de dados. Portanto, é apenas mensagem var igual a string. E posso fazer isso porque estou atribuindo imediatamente um valor a essa propriedade. Assim, o xcode pode examinar esse valor e pode determinar e inferir qual deve ser o tipo de dados dessa propriedade. Com uma propriedade computada, preciso especificar explicitamente o tipo de dados. Tudo bem, então para minha mensagem de propriedade computada com prefixo, vamos dar uma olhada no código dentro dos colchetes encaracolados. Aqui, vou usar a palavra-chave return, assim como com funções, certo? Vou voltar. Chris diz, então esta é uma mensagem de string mais. Então, agora no meu método de envio de bate-papo, em vez de imprimir prefixo mais mensagem, posso simplesmente retornar mensagem com prefixo. A mesma coisa para excluir bate-papo. Em vez de prefixo mais mensagem, vou retornar a mensagem com prefixo. Portanto, toda vez que essa propriedade for acessada, ela executará o código dentro desses colchetes e retornará isso como o valor dessa propriedade e precisa computá-la. É por isso que ela é chamada de propriedade computada. Agora, com as propriedades do computador, também há um atalho. Se houver apenas uma linha de código aqui, não preciso da palavra-chave return porque o Xcode pode supor que essa única linha de código emitirá os dados que eu quero retornar para o meu computador propriedade. Então, na verdade, posso excluir a palavra-chave return. No entanto, se eu tiver várias linhas de código, eu definitivamente precisaria dessa palavra-chave de retorno porque o Xcode não sabe qual linha de código deve ser o valor que é retornado. Por exemplo, dentro da propriedade do meu computador, se eu disser let prefix é igual, diz Chris, e então aqui eu tenho prefixo mais mensagem. Ele não saberá qual instrução de código retorna o valor. Então, eu realmente tenho que usar a palavra-chave return assim. E isso vai ficar bem. Agora, no que diz respeito às propriedades calculadas, definitivamente há mais sobre os quais podemos falar, mas isso será suficiente por enquanto. Nos capítulos posteriores deste curso. Definitivamente vamos examinar as propriedades calculadas novamente. Tudo bem, vamos fazer uma rápida recapitulação antes de encerrarmos esta lição, você aprendeu a declarar uma estrutura básica. Você aprendeu sobre propriedades e métodos na estrutura, aprendeu sobre escopo e aprenderá sobre propriedades computadas também. Agora eu sei que a parte difícil é envolver sua cabeça em torno desses conceitos. À medida que codificamos ainda mais juntos, você verá esses conceitos colocados em prática. Só quero dizer uma coisa antes de terminarmos. Você fez isso. Se você é novo na codificação dessas três lições, onde as alucinantes. Na próxima lição, mostrarei como esses conceitos se relacionam com seu projeto Xcode real. Tudo bem, te vejo lá. 10. 09: instâncias de programação Swift: Olá e seja bem-vindo. Então você aprendeu que muitos Swift nas últimas lições, você começou com variáveis, constantes e tipos de dados. Então você aprendeu sobre as funções. E então você aprende sobre estruturas que você pode agrupar todas essas coisas para representar ou modelar algo em seu aplicativo. Agora esta lição será a peça final do quebra-cabeça. Não estou dizendo que você vai ser um mestre rápido ou algo assim. Mas até o final desta lição, você verá como todos os conceitos e códigos se encaixam e funcionam juntos dentro de um aplicativo rápido de interface do usuário. Tudo bem, com isso dito, vamos mergulhar bem. Tudo bem, então vamos começar com um playground vazio. Você se lembra naquela época quando aprendeu sobre funções e eu ensinei a declarar uma função usando a palavra-chave func seguida pelo nome da função. Digamos que minha função seguiu por um conjunto de parênteses e, em seguida, um conjunto de colchetes encaracolados. E dentro dos colchetes encaracolados, teríamos o código para a função. Mas isso é apenas uma declaração de função que nenhum código é executado, nada acontece. Não é até chamarmos a função que o código dentro dessa função é executado certo? Então eu chamaria a função dizendo minha função, e depois os parênteses. Se eu executar meu playground agora, você pode ver que ele envia Hello para o console. Portanto, as estruturas também são assim. Quando declaramos uma estrutura usando a palavra-chave struct seguida pelo nome da estrutura. Então, digamos que minha estrutura, seguida por um conjunto de colchetes encaracolados. E então colocamos o código dentro dessa estrutura. Deixe-me mover minha função aqui, e vamos declarar uma propriedade aqui em cima, mensagem var é igual a olá. E então vamos imprimir minha mensagem de propriedade dentro da minha função. Esta é apenas uma declaração de uma estrutura. Na verdade, não faz nada. Pense nisso como um projeto para um prédio. Para usarmos essa estrutura, precisamos trazê-la à vida. Precisamos criar o que é chamado de instância da estrutura. Você pode pensar nisso como transformar esse plano para construir em um edifício real. Então, como criamos uma instância dessa estrutura? Bem, isso é fácil. Você acabou de escrever o nome da estrutura seguido por um par de parênteses como esse. Agora, apenas no caso de você ainda estar confuso sobre o conceito de criar uma instância de uma estrutura. Deixe-me dar-lhe algumas analogias diferentes para ajudá-lo a tentar entender esse conceito. Algumas pessoas acham mais fácil quando digo que declarar uma estrutura ou a declaração dessa estrutura é como um modelo para um carro ou um plano de arquitetura para uma casa. Usando esse blueprint ou usando esse plano de arquitetura, posso criar carros e criar casas, e esses são os objetos reais. Enquanto o blueprint ou o plano de arquitetura é mais parecido com um modelo. Ele simplesmente descreve como essa coisa vai funcionar quando você a dar vida. Então é isso que está acontecendo aqui. Esta é uma declaração de uma estrutura. Ele descreve todas as suas propriedades e funções. Você sabe, as coisas que ele pode fazer. E então é só até darmos vida ao criar uma instância dela que podemos realmente usá-lo. Então, agora que criamos uma instância dela, vamos explorar o que podemos fazer com ela. Agora, antes de tudo, precisamos acompanhar essa instância porque ela é considerada um pedaço de dados, precisamos acompanhá-la e ter uma maneira de referenciá-la. Então, vamos criar uma variável chamada Eu vou chamá-la de uma questão de simplicidade. E vou atribuir essa nova instância à minha variável a. Ei, espere um minuto. Se essa instância for um pedaço de dados, qual é o tipo de dados desse pedaço de dados? E que tipo de dados essa variável está mantendo? Bem, o tipo de dados é o nome da sua estrutura. Isso mesmo. Então eu posso realmente mudar minha declaração de variável de var a, var a dois pontos, minha estrutura. Sim, sua estrutura é seu próprio tipo de dados. Portanto, essa instância que você criou, o tipo de dados é minha estrutura. Agora, essa pequena instância tem superpoderes porque nós a projetamos dessa maneira. Ele pode conter dados em sua propriedade message e pode gerar essa mensagem usando o método myfunction. Então, como podemos acessar essas coisas dessa instância? Bem, é aí que entra a notação de pontos. Vamos dar uma olhada no que é notação de pontos. Então, vamos fazer referência à variável a, seguida por um ponto ou um ponto. E, como você pode ver no menu de preenchimento automático, você pode escolher a mensagem que está acessando a propriedade, ou você pode selecionar minha função, que executará o código nesse método. Portanto, usando a notação de pontos, você pode acessar as propriedades e os métodos dessa instância. Vamos experimentar isso. Então, antes de tudo, vou atribuir algo à propriedade desta instância. Vou atribuir, vamos dizer oi. E depois vou imprimir. A.me, só para mostrar que eu realmente posso acessar esta propriedade e posso imprimi-la. Em seguida. Em vez de usar essa instrução print aqui, vou simplesmente chamar o método dessa instância. Vou chamar minha função. E vou executar esse código novamente. E ainda nos elevamos porque o código dentro desse método na verdade, apenas imprime a propriedade. Agora, essas pequenas instâncias, o herói de ação, não é? Ele pode fazer todas as coisas que projetamos para fazer. Agora, como essa declaração de estrutura é como um blueprint ou um plano de arquitetura, isso significa que podemos criar quantas instâncias quisermos. Então, vamos seguir em frente e criar uma segunda instância. Desta vez vou declarar outra variável, var ser para armazenar outra instância da minha estrutura. Agora, o importante a observar é que essas são instâncias completamente independentes. Voltando à analogia do projeto do carro, é como se a fábrica de carros fizesse dois carros da mesma planta. Esses dois carros são tratados como dois carros diferentes. A mesma coisa aqui. Acabei de criar duas instâncias da minha estrutura. Por exemplo, se eu atribuir uma mensagem para ser alta , imprimo o talão na mensagem, ou deixe-me atribuir outra coisa para ser.message e imprimo isso. Você verá que, para um ponto myfunction chamando esse método, ele imprime alto. E quando imprimo b.me, ele gera mundo para o console. Assim, você pode ver que cada instância controla seus próprios valores dentro da propriedade message. Agora você sabe que precisa criar uma instância de uma estrutura para usá-la. Vamos dar uma olhada em como instâncias de estruturas podem trabalhar juntas. Agora, para usar um exemplo anterior da lição anterior, suponha que eu tenha uma visualização de bate-papo no meu aplicativo, então declarei uma estrutura para representar essa visualização. Ele agrupa todas as propriedades, o código de visualização e os métodos relacionados à minha visualização de bate-papo. E suponha que eu tivesse outra estrutura para agrupar todo o código de rede ou o código do banco de dados para salvar os dados. Vamos declarar algo assim aqui. Então struct, vamos chamar isso de rede, ou vamos chamá-lo de gerenciador de banco de dados. Certo? E suponha que eu tivesse um método aqui. Então func, vamos chamar isso de dados salvos. E o parâmetro de entrada para isso são os dados que queremos salvar. Então, digamos que eu declare um único parâmetro chamado data e torne-o um tipo de string, e ele retorna um valor, ele retornará um valor booleano, true ou false, indicando se isso foi bem-sucedido ou não. Verdadeiro para um sucesso, falso por mal sucedido. E na vida real, não seria viável realmente retornar um resultado instantaneamente como este, porque dependendo das condições da rede e de outros fatores, você não quer esperar por os dados a serem salvos. Então você não quer que a execução pare. Mas, por uma questão de simplicidade, digamos que podemos retornar o resultado imediatamente. Então, quando você ouve isso, esse código salva os dados e retorna um resultado booleano. Então, neste exemplo, vou voltar a verdade. Então, vou transformar um valor codificado porque não vou implementar esse método. A principal coisa que quero mostrar é como a visualização de bate-papo usará o gerenciador de banco de dados para salvar a mensagem. Então, de volta à exibição de bate-papo, neste envie um método de bate-papo, por exemplo, eu poderia criar uma instância do gerenciador de banco de dados. Então, digamos que var d b seja igual ao gerenciador de banco de dados, seguido por um conjunto de parênteses. E assim, criei uma nova instância desse gerenciador de banco de dados. E agora, se eu quisesse salvar minha mensagem, chamaria de método de dados salvos. Então db dot salvou dados e eu passaria minha propriedade de mensagem como os dados de entrada. Vou seguir em frente e passar uma mensagem. Mas lembre-se, quando chamo esse método de dados salvos, ele retorna o valor booleano para que eu indique se o salvo foi bem-sucedido ou não. Assim, posso atribuir a saída desse método a uma constante. Vou chamar que isso foi sucesso, certo? Então, vou atribuir essa saída booleana em uma nova constante chamada foi sucesso. Ou talvez eu o chame de sucesso. E então aqui em baixo, posso escrever algum código. Verifique o valor booleano bem-sucedido. Se não for bem-sucedido. Mostrar alerta para o usuário. Agora, em lições futuras, você aprenderá a escrever essas declarações com base nas condições. Mas, por enquanto, esse comentário terá que fazer. O principal takeaway. Para este exemplo que estou mostrando é o fato de que dentro do método de envio de bate-papo da estrutura de visualização do chat, ele está usando outros métodos de estruturas criando uma instância dele. É assim que instâncias de estruturas podem trabalhar juntas para fazer com que seu aplicativo funcione. E isso é essencialmente tudo o que seu aplicativo é. São diferentes instâncias de estruturas trabalhando juntas para produzir as visualizações, lidar com a entrada do usuário e executar a lógica. Agora eu quero falar sobre níveis de acesso por um segundo. Suponha que, por exemplo, no meu gerenciador de banco de dados, eu tivesse algum tipo de informação que eu estava rastreando como uma propriedade que apenas o gerenciador de banco de dados precisava. Não seria relevante para nenhuma outra estrutura. Talvez seja um nome de servidor ou algo assim. Então, deixe-me escrever uma nova propriedade no meu gerenciador de banco de dados chamada nome do servidor. E atribuirei a ele uma string chamada server one. Agora, essa propriedade não seria interessante para nenhuma outra estrutura, mas como você pode ver no método send chat, declarei essa instância do gerenciador de banco de dados. Se eu escrever ponto db usando notação de ponto, poderei acessar essa propriedade de nome do servidor. E às vezes você pode não querer expor essas coisas. Então, o que você pode fazer é especificar um nível de acesso na frente dessa propriedade. Então, na frente do nome do servidor var, essa propriedade, posso colocar a palavra-chave privada, então agora se torna o nome do servidor var privado. E, ao fazer isso, ele mantém essa propriedade acessível somente dentro do escopo do gerenciador de banco de dados. Então, como você pode ver, ainda posso acessar nome do servidor dentro do método de dados salvos. Tudo bem, está no mesmo escopo, mas no método de bate-papo central da exibição de bate-papo aqui. Se eu usar a notação de ponto novamente, para minha instância, você poderá ver que não consigo acessar esse objetivo de propriedade ou não consigo vê-lo. E, além disso, você pode realmente fazer o mesmo com funções. Então eu posso colocar privado na frente da palavra-chave func. E agora você pode ver que o Xcode reclama. Não posso executar este método a partir do método de chat Sun da vista de chat. Agora é uma boa prática estar ciente de quais propriedades e métodos precisam ser acessíveis a outras instâncias e outras estruturas e marcar que tudo o resto é privado. Fazer isso é uma maneira proativa de evitar que comportamentos inesperados e bugs surjam. Tudo bem, e agora para a última parte da lição, quero relacionar tudo o que você aprendeu até agora a um aplicativo de interface de usuário rápido dentro do XCode. Então, vamos seguir em frente e fazer isso. Tudo bem, então agora vamos começar um novo projeto de aplicativo iOS. Vou apenas nomear este projeto de teste e garantir que interfaces Swift UI e ciclo de vida sejam rápidas linguagens de aplicativos de interface do usuário Swift, e estamos prontos para começar. Então, vou salvar isso na área de trabalho e vamos primeiro pular para o ponto de visualização de conteúdo rapidamente. Agora, vou mudar isso para o iPhone 12 e vou chegar ao currículo. Mas a parte importante é que a principal coisa que eu queria mostrar a você realmente é o código, certo? Dê uma olhada nessa estrutura. Você sabe que isso significa que a visualização de conteúdo é uma estrutura. Existem algumas palavras-chave e pedaços de código que vamos passar por enquanto, porque ainda não aprendemos isso e agora não é o momento certo para passar por cima disso. Então, vou brilhar sobre algumas coisas por realmente querer apontar os conceitos que você aprendeu até agora e mostrar onde eles se encaixam. Portanto, esta é uma declaração de estrutura. Deixe-me recolher esse código por um segundo. Lá vai você. Então você pode ver que isso é um struct. A exibição de conteúdo é o nome da estrutura seguido pela visualização de dois pontos. E vamos chegar a isso em apenas um segundo. E então você pode ver os colchetes encaracolados contendo todo o código dessa estrutura. Tudo bem, então vamos expandi-lo novamente. E vamos dar uma olhada no que mais conseguimos. Aqui embaixo. Temos a palavra-chave var. Então esse é o início de uma propriedade. O nome dessa propriedade é body. Ok, então depois disso temos dois pontos e depois temos alguma visão. E vamos chegar a isso de novo em apenas um segundo. Mas você pode ver que há um conjunto de colchetes encaracolados aqui. Isso diz que esta é uma propriedade computada. Então, deixe-me recolher o código novamente. E você pode ver que, de fato, isso se parece com um tipo de dados do corpo var da propriedade computada e, em seguida, um conjunto de colchetes dentro é o código que é calculado ou calculado para retornar o valor quando essa propriedade é acessada. Então você pode ver todos esses conceitos que aprendemos nas últimas quatro lições? Eles estão voltando? Agora eu quero falar sobre essa visão e alguma visão. Então, vamos falar sobre essa visão de dois pontos na declaração da estrutura primeiro. A julgar pela forma como você usou os dois pontos antes, você pode pensar que esse é o tipo de dados para a estrutura, mas não exatamente. Isso realmente não faz sentido, não é? Porque lembre-se, o nome da estrutura em si é o tipo de dados para instâncias dessa estrutura. Então, qual é essa visão de dois pontos após o nome da estrutura? Bem, quando você está declarando uma estrutura, os dois pontos após o nome da estrutura indicam que essa estrutura segue um protocolo. Nesse caso, ele segue o protocolo de exibição. Então, o que você acha quando ouve a palavra protocolo? Bem, para mim, penso nisso como um conjunto de regras ou um conjunto de ações. Por exemplo, como o protocolo de emergência de incêndio que um prédio pode ter para o que fazer quando ocorre um incêndio. Ou como o código de construção que um desenvolvedor precisa seguir para construir uma casa segura. Da mesma forma no Swift, um protocolo é uma especificação ou um conjunto de regras que a estrutura deve seguir. Essa parte de exibição de dois pontos indica que essa visualização de conteúdo segue o protocolo de exibição. Terminologia informal Swift. exibição de conteúdo está em conformidade com o protocolo de exibição. Agora, uma coisa importante a mencionar é que escrever dois pontos seguidos pelo protocolo é dizer e declarar que você está em conformidade com o protocolo. Mas você realmente, é como levantar a mão para declarar algo. Mas você realmente segue as regras desse protocolo? E, portanto, o código dentro dessa estrutura realmente tem que satisfazer as especificações desse protocolo. Nesse caso, para que o protocolo de exibição esteja em conformidade com ele, temos que ter uma propriedade body que retorne alguma visualização. Como você pode ver aqui, nossa estrutura de visualização de conteúdo realmente satisfaz essa regra. É por isso que ele está em conformidade com o protocolo de exibição. Então, agora que você entende quais protocolos são, você pode ver que o tipo de dados dessa propriedade body é na verdade, qualquer valor que esteja em conformidade com o protocolo de exibição. Sim, nesse caso, o tipo de dados dessa propriedade não é realmente um tipo de dados, mas na verdade é qualquer tipo de dados que esteja em conformidade com um determinado protocolo, nesse caso, o protocolo de exibição. Portanto, dentro desse código para essa propriedade computada, ela precisa retornar alguma instância que esteja em conformidade com o protocolo de exibição. Vamos abrir esse código e ver o que temos. Então, o que temos aqui, bem, temos uma única declaração de código. E lembre-se do que eu disse sobre propriedades computadas. Se for apenas uma única instrução de código, você pode omitir a palavra-chave return, mas vou especificá-la explicitamente para que fique claro para você. Então, o que está acontecendo aqui? Parece que estamos criando uma instância de uma estrutura de texto. Agora, uma maneira de descobrir isso é se você entrar no painel de utilitários ou no painel do inspetor e entrar na guia de ajuda rápida aqui. E você acabou de colocar o cursor sobre a coisa que você quer olhar. Então, vou clicar neste texto. Então, como você pode ver aqui, fato, o texto é uma estrutura. Portanto, estamos criando uma instância da estrutura de texto. No entanto, você notará que criar essa instância é diferente de como fizemos isso antes porque usamos um conjunto vazio de parênteses. Estou aqui quando estamos criando uma instância dessa estrutura de texto, estamos passando alguns dados de entrada. Então, sim, você pode realmente passar dados de entrada como um parâmetro para a criação de uma instância de uma estrutura. Esses são chamados de inicializadores. Agora ainda não falamos sobre isso e vamos nas próximas lições. Mas, por enquanto, apenas entenda que existe uma maneira de você passar dados de entrada para a criação de uma instância de uma estrutura. Então é exatamente isso que está acontecendo aqui. Agora você pode estar se perguntando, essa estrutura de texto está em conformidade com o protocolo de visualização? Bem, ele deve escrever porque acordo com essa propriedade do corpo, o que for retornado para essa propriedade computada tem que estar em conformidade com isso. Então, novamente, vamos mergulhar na ajuda rápida. Então, vou passar o mouse sobre os textos. Vou descer. E, de fato, vou abrir a documentação do desenvolvedor. Agora, se você estiver usando o Xcode 1.112, houve um bug que falhou quando você tenta abrir esta janela. Então você só precisa atualizar o Xcode dessas falhas para você. Ok, então esta é a documentação para textos. Você pode ver que é uma estrutura. E se você rolar todo o caminho para baixo, vou pular tudo isso porque quero apenas mostrar que ele está em conformidade com dois protocolos na verdade. Mas o que estamos interessados é que ele está em conformidade com o protocolo. Tudo bem, outra coisa que quero salientar é que isso, lembre-se disso desde cedo. Este é um modificador. E agora para você, deve parecer bem familiar, certo? Porque parece que estamos chamando um método. Isso é notação de pontos aqui. Estamos criando uma instância da estrutura de texto. E, em seguida, estamos chamando o método de preenchimento nessa instância. Veja se eu coloquei na mesma linha. Pode parecer um pouco mais familiar para você. Tudo bem, então espero que os pontos estejam começando a se conectar. Nenhum trocadilho pretendido. Ok, então para relacionar isso de volta à lição de estruturas anteriores onde eu mostrei a você como declarar uma estrutura. Tínhamos algumas seções diferentes, certo? Então, no topo aqui, declararíamos nossas propriedades. E, de fato, essa propriedade corporal é considerada um direito de propriedade. Mas também contém nosso código de visualização. Então, esse seria o lugar onde nosso código de visualização vai. E então aqui embaixo declararíamos os métodos para essa estrutura. Certo, acho que você entende que essa estrutura chamada exibição de conteúdo representa a visualização principal ou a tela principal deste aplicativo. Mas não dissemos que as estruturas por si só não fazem nada. Você precisa criar uma instância dela para que ele funcione. Bem, onde estamos criando uma instância de exibição de conteúdo? Para isso, precisamos fazer um drill-back up até o ponto de entrada do aplicativo, que é esse aqui. Assim, você pode ver isso por si só também é uma estrutura e o nome dessa estrutura é o nome do seu projeto e está em conformidade com um protocolo chamado app. Então, vamos dar uma olhada na ajuda rápida e ver o que se trata esse protocolo. Criando um aplicativo declarando uma estrutura que esteja em conformidade com o protocolo do aplicativo, implemente a propriedade computada do corpo necessária para definir o conteúdo do aplicativo. Agora temos outra propriedade computada pelo corpo. Vou pular um pouco dessa cena em coisas do grupo Window. Quero salientar que é aqui que estamos criando uma instância, essa estrutura de visualização de conteúdo. Então você vê como tudo se encaixa? Além disso, vamos voltar para a visualização de conteúdo e deixe-me mostrar outra coisa. Então, para isso, vou abrir a tela novamente. E vou retomar a pré-visualização. Olhe para essa estrutura aqui embaixo. Isso é o que está alimentando a visualização que você vê aqui. Essa estrutura não é realmente usada como parte do seu aplicativo. É apenas para visualizar no Canvas aqui. Portanto, ele está em conformidade com o protocolo do provedor de visualização. E tem uma propriedade chamada previews, palavra-chave estática ignorada. Por enquanto, explicaremos isso em uma lição futura. E aqui em baixo, você pode ver que uma instância da sua estrutura de visualização de conteúdo está sendo criada e isso é realmente o que está sendo mostrado aqui. Na verdade, posso aplicar modificadores a essa instância e isso mudará o que temos aqui. Tudo bem, então eu posso usar a notação de pontos para chamar modificadores, que agora, você sabe, são apenas métodos, certo? Dessa visão ou dessa instância. Na verdade. Em vez de fazer isso, por que não usamos a maneira visual e vemos como ele muda o código. Então, 10, eu visualizo essa alteração. Na verdade, vou mudar o esquema para o modo escuro. Assim, você pode ver que ele adiciona um modificador a essa instância. Vamos também mudar o dispositivo para iPod touch. Você pode ver que ele adiciona outro modificador chamado dispositivo de visualização. Agora, o que acontece se eu criar outra pré-visualização? Porque você pode clicar neste botão aqui e ele criará outra pré-visualização aqui. Você pode ver o que acontece com o código. Bem, ele criou outra instância de exibição de conteúdo e tem seus próprios modificadores. Agora, isso é agrupado por um contêiner, um contêiner chamado grupo, que ainda não abordamos, mas no futuro saberemos que ele agrupa visualizações. Portanto, essa instância de exibição de conteúdo é para esta aqui em cima, e essa instância é esta aqui em baixo. Veja, posso mudar esse esquema para luz. E você pode ver isso muda isso aqui. E posso mudar esse dispositivo para iPhone 12. E as mudanças desse modificador lá. Portanto, são instâncias independentes. Eu era muito para aceitar e é por isso que eu nunca recomendo que você memorize nada. Quanto mais prática você tiver, cedo ela se tornará uma segunda natureza para você. Vamos fazer uma rápida recapitulação, certo? Você aprendeu a criar instâncias de sua estrutura. Você aprendeu a usar a notação de pontos para acessar os métodos e as propriedades de suas instâncias. E você também aprendeu sobre os níveis de acesso. Assim, você pode controlar quais propriedades e quais métodos podem ser acessados com a notação de pontos. Finalmente, você viu como todos esses conceitos se relacionam com um aplicativo rápido de interface do usuário no Xcode. Agora, nas lições a seguir, vamos voltar ao nosso jogo de cartas de guerra e pegar todo esse novo conhecimento rápido e dar vida a esse jogo de cartas de guerra. Na próxima lição, mostrarei como usar o elemento botão para lidar com a interação do usuário. Tudo bem, te vejo lá. 11. 10: botões: SwiftUI: Olá e seja bem-vindo. Nas lições anteriores, você aprendeu o básico da programação Swift. E mostrei como esses conceitos se aplicavam ao seu projeto Xcode. Agora, vamos voltar à interface do usuário e às visualizações do Swift. Especificamente hoje eu quero falar sobre a visualização de botões. Vamos mergulhar diretamente. Tudo bem, então eu tenho um novo Swift que eu projecto aqui? Pensei em dar uma olhada na criação algumas instâncias de botão em um novo projeto juntos antes de voltarmos ao jogo de trabalho duro para usar a instância do botão lá. Então, vamos seguir em frente e excluir essa visualização de texto aqui. Na criação de algumas instâncias, um botão é uma estrutura como esse texto era. E precisamos criar uma instância de botão. Em outras palavras, precisamos instanciar um botão e é apenas outra maneira de dizer isso. Então, vamos em frente e digite o botão, seguido de abrir um suporte arredondado esquerdo. E isso vai abrir nosso menu de preenchimento automático. Existem alguns métodos de inicializador diferentes que podemos usar para criar uma instância de botão. E esses métodos de inicializador, lembre-se, são maneiras diferentes de criar uma instância ao transmitir alguns dados. Dois dos mais comuns que você vai usar é este aqui, onde você passa em uma string. E esse protocolo de string de tipo de dados significa apenas qualquer coisa que esteja conformidade com esse protocolo de string e um pedaço de texto faz. Este permitirá que você passe um pedaço de texto para usar como rótulo do botão. E também permitirá que você passe um bloco de código para ser executado quando esse botão for tocado. Então, vamos dar uma olhada nesses parâmetros com mais detalhes. Portanto, esse primeiro parâmetro para o rótulo do botão é bastante simples. Aqui você acabou de passar um pedaço de texto. Vou chamar esse botão, clique em mim. E se atualizarmos, nossa visualização fará qualquer coisa ainda antes de especificarmos o segundo parâmetro. O tipo de dados desse parâmetro de ação é algo que você ainda não viu. Mas parece uma assinatura de função sem o nome da função, certo? Isso é chamado de fechamento. E simplesmente, você pode pensar nisso como um bloco de código ou como uma função sem o nome da função, você passa um bloco de código como um parâmetro. Quando o botão estiver tocado, ele executará esse bloco de código. Novamente, isso é chamado de fechamento. Então, vamos dar uma olhada em como podemos especificar o fechamento como um parâmetro. Agora, uma das coisas mais fáceis que você pode fazer é destacar esse parâmetro e clicar em Enter. E o Xcode abrirá automaticamente um fechamento para você digitar seu bloco de código. Mas eu não vou fazer isso agora porque eu quero passar pelos passos e realmente dividi-lo para você e mostrar o que exatamente você está especificando. E então, no final, mostrarei o que acontece quando você clicar em Enter e deixar o Xcode abrir o fechamento para você. Vamos especificar esse fechamento manualmente por enquanto. Tudo bem, então o tipo de fechamento que isso espera é o tipo mais simples que você pode ver. Ele não aceita parâmetros. Esses dois suportes aqui, esses dois suportes arredondados. Essa é uma lista de parâmetros, assim como você teria quando declara uma função. Mas está vazio, então não há parâmetros. E, em seguida, você vê um traço seguido por um símbolo maior que. E você sabe que isso significa tipo de retorno, certo? E ele retorna vazio. Vazio não significa nada. Portanto, não retorna nada e não aceita nada. É muito simplesmente um bloco de código. Tudo bem, então agora que você conhece o tipo de função, então ela está esperando, vamos em frente e especificá-la. Então, vou excluir isso. E vou abrir um par de suportes encaracolados. E eu não preciso devolver nada. Não preciso especificar nenhum parâmetro. É muito simplesmente o bloco de código. Então você pode especificar isso com apenas um conjunto de colchetes encaracolados. E entre esses colchetes encaracolados, você coloca todas as instruções de código que quiser. Então, vou apenas imprimir o hello world. E esse é o botão completo. Vamos executar esse projeto e ver o que acontece. Ok, então nós estivemos no meio que diz clique em mim. Quando eu toco nele, ele executa o fechamento. Ele executa o código no fechamento. E você pode ver que, lá embaixo no console, ele imprime hello world toda vez que clico neste botão. Tudo bem, agora vamos voltar ao nosso projeto Xcode porque essa é apenas uma maneira de instanciar um botão. Vou adicionar um comentário aqui e chamar essa instância de botão com fechamento. Certo? E então eu também vou colocar isso dentro de uma pilha V. Na verdade, vou te mostrar uma forma abreviada e legal de fazer isso. Vou colocá-lo dentro da pilha porque queria mostrar algumas outras maneiras de criar botões. Então, vamos criar alguns botões juntos. Vá em frente e clique no comando neste botão e você pode simplesmente escolher incorporar e v stack. Faça isso. Ele coloca o elemento na pilha para você, embora não tenha conseguido mover meu comentário para lá. Então, vamos colocar isso ali. Tudo bem. Então, temos um botão e quero mostrar o mesmo botão, mas com uma mão curta, há algo chamado fechamento à direita. Deixe-me mostrar o que isso significa. Então, instância de botão com fechamento à direita, vou copiar e colar o botão que acabamos de declarar e criar outra cópia dele. Portanto, se na lista de parâmetros, o último parâmetro espera um fechamento, há uma abreviação. E como funciona é você tirar esse último parâmetro da lista de parâmetros e simplesmente colocar o fechamento após a chamada do método. Deixe-me mostrar o que quero dizer. Então, nesta lista de parâmetros, esse fechamento é o último parâmetro, certo? Portanto, este é um candidato principal para um atalho de fechamento à direita. Eu pego o fechamento em si. Então, vou cortar isso da lista de parâmetros. E eu simplesmente vou adicionar um espaço após o colchete arredondado final e, em seguida, basta colar o fechamento assim. E então eu posso ir em frente e remover o rótulo do perímetro ou o rótulo do argumento dessa lista de parâmetros assim. E essas declarações de dois botões são exatamente a mesma coisa. É só que eles são escritos de forma diferente. Um deles está especificando o fechamento dentro da lista de parâmetros e o outro está especificando-o usando um fechamento à direita. E é por isso que eu queria mostrar isso manualmente, em vez de apenas deixar o Xcode abrir um fechamento para você. Porque quando você deixar o Xcode fazer isso, ele reconhecerá que esses parâmetros de fechamento, o último, e o transformará em um fechamento final para você. Sou automaticamente, então deixe-me mostrar-lhe isso. Se eu declarar outro botão, vamos usar o mesmo. Clique em mim e, em seguida, toque nesse parâmetro de ação, clique duas vezes nele ou pressiono Enter e deixo Xcode abrir o fechamento. Ele o muda automaticamente em um fechamento à direita. Então eu pensei que isso seria muito confuso para você se você nunca tivesse visto isso antes. E pelo menos agora você sabe o que é um fechamento final e por que, você sabe, o Xcode faz isso por você. Ok, então isso é apenas criar um tipo de botão. Ambas as formas de criar botões onde você só tem um pedaço de texto como o rótulo. Mas e se você quisesse que seu botão fosse uma imagem ou um ícone ou algo assim, não apenas um simples pedaço de texto. Bem, há outro método inicializador para o botão que podemos usar para isso. Então, vamos dar uma olhada na instância do botão com visualização de rótulo. Então, vamos em frente e digite o botão, abra um suporte. E agora vamos dar uma olhada neste outro método inicializador com um parâmetro de ação e rótulo, cria um botão que exibe um rótulo personalizado. E você pode ver na lista de predadores que o primeiro me deixa, deixe-me voltar ao menu de preenchimento automático. Dando uma olhada nessa lista de parâmetros agora você pode ver que esse parâmetro de fechamento de ação é o primeiro parâmetro e, em seguida, o segundo parâmetro é um rótulo. Agora, para este parâmetro de rótulo, você pode retornar qualquer visualização que deseja representar seu botão. Então, vamos em frente e escolha esse método inicializador. Você pode ver o fechamento da ação aqui mesmo, se eu clicar duas vezes nele, ele não mudará para um fechamento à direita. E o motivo disso é porque ele não é o último parâmetro na lista de parâmetros. Portanto, isso não se qualifica para ser transformado em um fechamento final. Ok, então quando esse botão for tocado novamente, vou imprimir o Hello World no console. Mas, para o rótulo, você notará que tenho alguma liberdade para especificar que tipo de visualização eu quero retornar. Então, aqui está apenas retornando um TextView com um simples pedaço de texto aqui chamado botão. Mas eu posso retornar uma imagem B, por exemplo, eu poderia retornar uma pilha de visualizações diferentes. Você pode devolver o que quiser. Deixe-me retomar a pré-visualização aqui para que você possa ver os diferentes botões que declaramos. Certo? Então, o que vou retornar aqui talvez seja menos retorno em cada pilha. E vou retornar um texto que diz Editar. E também vou retornar uma imagem na frente disso. E para essa imagem, vou especificar, não adicionei nenhuma imagem à nossa biblioteca de ativos, mas vou usar algo chamado símbolo SF. Agora ainda não passamos por símbolos SF. Faremos isso em uma lição futura. No entanto, os símbolos SF são ótimos. Porque eles são basicamente um conjunto de ícones que vem com o Xcode que você pode usar apenas em seus aplicativos. E estes são recursos muito especiais desses símbolos SF que passaremos em uma lição futura neste curso, há um aplicativo mac gratuito chamado símbolos SF que você pode baixar onde você pode navegar por todos os diferentes símbolos que estão disponíveis para você gratuitamente. Por exemplo, vou usar este lápis. Cada um deles tem um nome que você pode simplesmente especificar e você poderá usá-lo. Portanto, para a imagem, o inicializador a usar, se você quiser usar S de símbolos, é chamado de nome do sistema. E então você especifica o nome que você viu embaixo do ícone. Lápis. Vou colocar lápis ali e você pode ver que o ícone aparece. Tudo bem, agora vamos executar este aplicativo no simulador e dar uma olhada no que acontece. Ok, então eu posso tocar neste aqui, diz Hello World Cup, aquela que diz Hello world. Ensinou este também diz helloworld. Esses são os fechamentos que eu especifiquei para todos os botões. Tudo bem, Agora você sabe como especificar um botão simples com apenas o texto para seu rótulo. Você sabe como especificar um botão que você pode usar qualquer visualização como o botão. Vamos voltar ao nosso jogo de cartas de guerra agora e transformar imagem do botão de negócio em um botão real. Tudo bem, então agora eu tenho o jogo de cartas de guerra em que estávamos trabalhando todo o caminho de volta, era menos de quatro ou cinco? Mas é aqui que chegamos. E se você se lembra, nós tínhamos usado uma imagem para esse botão de negócio. E esse é o código de visualização para isso. E você pode ver que é apenas uma imagem. Agora, você sabe como transformar isso em um botão. Então eu quero que você apenas pause o vídeo agora mesmo e experimente por conta própria, em seu próprio projeto, apenas como um pequeno exercício. Depois de ter experimentado por si mesmo. Ou se você acabou de ficar preso, continue reproduzindo este vídeo e faremos isso juntos. Certo, vamos experimentá-lo juntos. Então, vou criar um pouco de espaço aqui. E vamos declarar um botão. Usando o botão. Vamos abrir colchetes e vamos escolher esse método de inicializador de rótulo de ação. Agora, dentro da ação, vamos abrir esse bloco de código, mas ainda não vamos fazer nada. Faremos isso na próxima lição. Mas para o rótulo dentro de um botão de texto, rotule e exclua essa visualização. E vou simplesmente mover nossa imagem com o negócio entrando no rótulo do nosso botão. E assim, você não consegue ver nenhuma mudança visual. Mas, no entanto, se você executar isso no simulador, notará que você pode tocar nele. É um botão natural. Outra maneira, se você não quiser iniciar seu simulador é que você pode apertar este botão aqui para a visualização ao vivo e eu estou absolutamente começando. Sim. Então você pode ir em frente e eu tenho que acertar Currículo sobre isso. Certo. Você pode ver agora no Canvas, porque eu tenho a Visualização ao Vivo ativada, posso testar o botão. Essa foi sua primeira introdução ao lidar com a interação do usuário em um aplicativo rápido de interface do usuário. As peças estão realmente se unindo. Vamos fazer uma recapitulação rápida. Você aprendeu a instanciar botões, e essa é apenas uma maneira extravagante de dizer a criação de instâncias de botões. Você aprendeu sobre fechamentos e como eles são apenas blocos de funções como código sem um nome de função. E então você aprendeu sobre fechamentos à direita, que são apenas uma abreviação. E só para lembrá-lo, um fechamento final é quando você tem um fechamento como parâmetro em uma chamada de método. E, em seguida, ele é retirado dessa lista de parâmetros e, em vez disso, é colocado no final dessa chamada de método. Na próxima lição, mostrarei um conceito chave da interface do usuário do Swift que permitirá que você altere dados e faça com que a interface do usuário detecte automaticamente a alteração e atualize a IU sozinha. Tudo bem, te vejo na próxima lição. 12. 11: Propriedades do estado: Olá e bem-vindo. Na última lição, você aprendeu sobre o botão rápido da interface do usuário e como lidar com a interação do usuário. Bem, para alterar os dados e depois refletir essa mudança na interface do usuário, temos que aprender sobre as propriedades de estado e é disso que se trata essa lição. Vamos mergulhar diretamente. Tudo bem, então eu queria revisitar essa visualização, atualizar o diagrama do ciclo de vida por apenas um segundo. Você se lembra de quando mostramos um link dos dados para o código de visualização? Bem, vamos seguir em frente e fazer isso com nosso projeto de jogo de cartas de guerra. Então, que tipo de dados temos neste projeto? Bem, se você der uma olhada na interface do usuário aqui, você pode ver que precisamos acompanhar qual cartão o player tem, qual cartão a CPU possui e, em seguida, também as pontuações do player e da CPU. Então, são quatro dados. Vamos criar quatro propriedades em nossa estrutura de visualização de conteúdo para representar esses quatro dados. Então, logo abaixo do colchete de abertura da visualização de conteúdo, vou prosseguir e declarar var var CPU L2 player primeiro cartão de jogador igual. E vou imitar os carros que temos lá. Então, vamos ter cartão também. E, na verdade, vou me deixar apenas, vou mudá-lo. Podemos colocar outra coisa para iniciá-lo. E então a placa de CPU é igual, digamos que o cartão nove. E então vamos representar a pontuação do jogador. E isso vai ser um número inteiro. Vamos começar com 0 também. pontuação da CPU é igual a 0. Tudo bem, então agora temos essas quatro propriedades representando o estado do jogo. Essas quatro propriedades são nossa fonte de verdade porque representa a aparência da interface do usuário. Agora, como refletimos esses dados em nossa interface de usuário? Bem, precisamos fazer referência a essas propriedades dentro do nosso código de visualização. Lembre-se de que essas propriedades sendo declaradas no escopo dessa estrutura significam que ela está disponível para ser referenciada em qualquer um dos métodos na mesma estrutura, bem como neste bloco de código para nossa propriedade corporal computada. Então, se olharmos aqui para este primeiro cartão que está aqui, e nós codificamos uma string lá, dizendo cartão para. Em vez de codificar uma string lá, vamos colocar um valor dinâmico especificando nossa propriedade de cartão de jogador. Então, vamos atualizar nossa pré-visualização automática e apenas para garantir que isso seja executado e está tudo bem. E você pode ver que essa carta muda o cartão cinco porque é esse o valor da propriedade do cartão de jogador. Vamos fazer a mesma coisa para a placa de CPU em vez da placa de codificação rígida três aqui, Vamos colocar a propriedade da placa da CPU. Você vê essa mudança. E aqui embaixo, para a pontuação em vez de uma sequência de 0, vamos colocar nossa propriedade de pontuação de jogador. Agora você notará um erro aqui. Ele diz que não há correspondências exatas na chamada para inicializador. E isso porque, para inicializar uma instância de texto, precisamos passar um pedaço de dados de string. Mas a pontuação do jogador, lembre-se, Esta é uma propriedade int, por isso contém dados int. Mas como podemos contornar isso é que podemos transformar nosso int em uma string. Bem, pelo menos a representação de string de um número. Então, a maneira como fazemos isso é que podemos criar uma nova instância de string e simplesmente passar no, podemos passar no inteiro. Então este seria a pontuação do jogador. E vamos fazer a mesma coisa pela pontuação da CPU. Vamos criar uma nova string e vamos passar a pontuação da CPU. E, assim, temos nossos quatro dados sendo representados no código de visualização e, por sua vez, na interface do usuário. Agora tudo o que temos que fazer é quando o usuário toca no botão, podemos atualizar esses dados nas propriedades e fazer com que a interface do usuário mude automaticamente, certo? Bem, não tão rápido. Por que não vamos em frente e tentamos fazer isso e vamos dar uma olhada no que acontece. Então, na última lição, mudamos essa imagem de negócio em um botão real. Neste momento, esse fechamento de ação está vazio. Vamos colocar algum código dentro desse fechamento de ação para o nosso botão. Aqui vamos atualizar os cartões e também vamos atualizar a pontuação. Agora, se você tentar atualizar a propriedade como aqui, vamos tentar atualizar o cartão de jogador igual ao cartão 11. Você verá que não pode. Xcode reclamará e dirá, não é possível atribuir à propriedade self é imutável. Agora, auto se refere à instância de uma visualização de conteúdo e imutável significa que ela não pode ser alterada. Você vê que as instâncias são tipos de valor e , devido à maneira como elas são alocadas na memória, elas não podem ser alteradas. Agora, eu sei que isso não faz absolutamente nenhum sentido para você agora, mas eu prometo a você em uma lição futura, falaremos sobre isso e então fará todo o sentido por enquanto, apenas entenda que não podemos alterar o valor de nossa propriedade, a menos que usemos um invólucro de propriedade. Um invólucro de propriedade é uma palavra-chave na frente da nossa declaração de propriedade que altera seu comportamento. Agora, especificamente, estou falando sobre o invólucro de propriedade estadual. Então, vamos voltar para nossas declarações de propriedade e ver como ele usou esse invólucro de propriedade de estado para alterar os comportamentos dessas propriedades que possamos alterar os valores. Tudo o que temos fazer é na frente da palavra-chave var da nossa declaração de propriedade, vamos escrever no State. E adicionando essa palavra-chave no estado, isso indicará que a propriedade do cartão de jogador é na verdade uma propriedade de estado e nos permitirá atualizar o valor nela. Então, vamos em frente e colocar este invólucro de propriedade na frente de todas as nossas quatro propriedades para que sejam todas propriedades de estadia. As propriedades do estado têm duas características especiais. número um é que você pode alterar os dados neles. Já falamos sobre isso. Mas o número dois é que dentro do código de visualização, quaisquer referências às propriedades de estado, elas serão notificadas sobre as alterações de dados e seguida, sua interface do usuário será atualizada automaticamente com base nesses novos dados. Então, vamos em frente, vá até o fechamento de ação do nosso botão e tente atualizar algumas dessas propriedades de estado. E vamos assistir a mudança da interface do usuário. Certo, então aqui estamos nós. E, como você pode ver agora, o erro desapareceu. E eu posso colocar placa de CPU igual a cartão 12. E vamos avançar e atualizar a pontuação também. Poderia muito bem apenas para isso. Então, vou dizer que a pontuação do jogador mais é igual a uma. Isso significa incrementá-lo em um. pontuação da CPU mais também é igual a uma. E vamos salvar isso. Então. Vamos prosseguir e fazer uma prévia ao vivo, ver se poderíamos fazer isso. Tudo bem, então esta é uma pré-visualização ao vivo. Quando eu tocar neste botão, ele vai executar o fechamento aqui. Isso não foi legal? Então, quando eu tocei nesse botão, atualizamos os dados nas propriedades do estado. Certo? E como em nosso código de exibição, ele faz referência a essas propriedades de estado, elas foram notificadas e a interface do usuário foi renderizada novamente para mostrar os novos dados. Agora o problema é que toda vez que tocamos no botão, quero dizer, está incrementando a pontuação, o que é legal, mas as cartas do jogador não estão sendo randomizadas. Então, o que podemos fazer é usar o método aleatório do instrutor, gerar um número aleatório. E então vamos acrescentar esse número aleatório à parte de trás da string do cartão para gerar um novo cartão. Então, vamos dar uma olhada em como isso funcionaria. Gere um número aleatório entre dois e 13. Porque se você olhar para a biblioteca de ativos, temos cartão até o cartão 14 na verdade. Então eu provavelmente gostaria de gerar de dois a 14. Então eu vou dizer que jogador rand é igual a int dot aleatório. E esse método nos permite especificar um intervalo. Você pode especificar um intervalo com a extremidade inferior do intervalo, ponto, ponto, ponto e, em seguida, a extremidade superior. E deve ser inclusivo, se eu me lembro corretamente. E veremos em um segundo. E vamos declarar outro. Cpu rand é igual a int ponto-ponto-ponto aleatório em dois, ponto-ponto-ponto e 14. E então o que vamos fazer é, em vez de especificar o número dentro da string codificada, vou especificar cartão. E então vou adicionar o player Rand e adicionar o rand da CPU. Agora, talvez não consigamos fazer isso e, como esperado, não podemos. Porque, como você sabe anteriormente nesta lição, o que estamos tentando fazer aqui é que estamos tentando anexar um número inteiro a uma string. E o que temos que fazer é converter esse inteiro em uma string primeiro e obter a representação de string desse inteiro. E lá, isso deve ser dinâmico agora. Então, vamos dar uma olhada nisso e ver se é o que esperamos. Isso é perfeito. Os cartões são aleatórios. O que não é perfeito é a pontuação aqui em baixo. Ainda precisamos determinar qual lado ganha e, em seguida, incrementar a pontuação apropriada. Então, vou comentar esses dois pedaços de código porque não queremos apenas incrementá-lo em um a cada vez. Agora, antes de terminarmos esta lição, eu realmente quero apontar e enfatizar o quão poderosa essa estrutura é. O que estamos fazendo aqui é tocar em um botão. Ele está executando esse fechamento e estamos alterando o valor nessa propriedade state. E como a propriedade state está sendo referenciada dentro do nosso código de visualização aqui, está detectando essa alteração de dados e, em seguida, renderizando novamente o que vemos na interface do usuário. E isso acontece automaticamente. Tudo o que estamos fazendo é mudar os dados. No passado, com o kit de interface do usuário, esse sistema não existia. O que teríamos que fazer é atualizar os dados, assim como estamos fazendo aqui. Mas também teríamos que atualizar cada elemento de exibição manualmente e dizer o que exibir. Então, o que teríamos que fazer é obter uma referência a essa imagem e , em seguida, gerar uma imagem a partir desse nome de ativo da biblioteca de ativos e, em seguida, definir esse ativo de imagem para este ImageView. E nós teríamos que fazer isso por este também. Então, teríamos que fazer isso pelo texto aqui e pelos rótulos. Então, tudo o que tínhamos que fazer manualmente. Agora, tudo o que precisamos fazer é atualizar os dados em qualquer parte da interface do usuário vinculada a essas propriedades de estado detectará a alteração e a atualização automaticamente. Agora, por definição, uma propriedade state é um pedaço de dados dos quais essa visualização de conteúdo depende. Não é algo que outros pontos de vista se importam ou dependam. E assim, por essa natureza, podemos adicionar a palavra-chave privada e apenas controlar o nível de acesso a esses dados para que eles sejam acessíveis apenas dentro do contexto ou do escopo do esta estrutura de visualização de conteúdo. Como é somente essa visualização de conteúdo que depende dessas propriedades de estado. Tudo bem, estamos quase na linha de chegada. Só precisamos comparar os valores do cartão e, em seguida, atualizar as propriedades do estado da pontuação adequadamente. Ainda é uma recapitulação rápida. Agora, você aprende a fazer referência a propriedades em seu código de exibição. Aprendemos sobre o invólucro de propriedade estadual. Também aprendemos sobre algumas novas terminologias incluindo valores codificados, valores dinâmicos e imutáveis, o que significa que ela não pode ser alterada. Na próxima lição, vamos examinar condicionais e como comparar valores usando instruções if. Tudo bem, te vejo lá. 13. 12: se as declarações 12:: Olá e seja bem-vindo. Nesta lição, vamos falar sobre uma construção rápida que permitirá que você escreva código que diz se isso, então, agora isso é fácil de usar, mas uma sintaxe poderosa permitirá que você lógica expressa em um nível totalmente novo. Tudo bem, com isso dito, vamos mergulhar bem. Tudo bem, então eu tenho um novo playground aqui. Quero mostrar como se as declarações funcionarem antes aplicá-las ao nosso projeto de jogo de cartas de guerra. Tudo o que tenho aqui são algumas constantes, na verdade, mais do que um casal, tenho um monte de constantes com valores simples diferentes, alguns números inteiros, strings e valores booleanos. E eu quero usar essas constantes para demonstrar como as declarações IF funcionam. Agora, novamente, a instrução if é muito poderosa porque permite que você execute código com base em algumas condições. Então, vou usar essas constantes como minhas condições. Vamos primeiro dar uma olhada em uma declaração básica IF, declaração. Vou digitá-lo primeiro e depois explicarei cada uma das partes. Então você começa com a palavra-chave if e, em seguida, coloca algum tipo de valor ou condição que é avaliado para um resultado booleano. Então, vou colocar ie. E vou abrir um par de suportes encaracolados. E aqui dentro, vou imprimir o Hello World, certo? E isso por si só é a declaração if mais simples. Como você pode ver, começa com a palavra-chave if e, em seguida, seguido por um valor booleano ou algum tipo de instrução de código que seja avaliado como um resultado booleano, seguido por um conjunto de colchetes encaracolados. E dentro dos colchetes encaracolados, você coloca o código que deseja executar. Se a condição for verdadeira, neste caso, e é falsa, certo? Portanto, ele não vai executar esse código porque ele não é avaliado como verdadeiro. No entanto, se eu alterar esse E e eu estivesse testando F em vez disso, esse código seria executado porque ele é avaliado como verdadeiro. Agora pode ficar muito louco porque você pode encadear essas coisas juntas. Então, uma das maneiras pelas quais você pode encadeá-los é usar o end, e isso é um duplo e comercial. Então deixe-me apenas indicar isso lá. E como isso funciona é se você escrever f duplo e comercial, digamos g. Então, agora você está testando as duas condições e porque você está usando o final, ambas as condições devem ser verdadeiras para que esse código a ser executado. Então, neste caso, porque f e g são verdadeiros, verdadeiros e verdadeiros meios verdadeiros. Certo? E outro exemplo é que você pode usar ou. Então, esses são tubos duplos. A chave pipes, muitos iniciantes, eles não têm certeza de como pressioná-la. No meu teclado Mac, esta tecla está logo abaixo da tecla Delete e logo acima da tecla de retorno, e é o caractere na tecla de barra invertida. Então eu tenho que segurar o turno e tenho que bater na barra invertida para pegar esse cachimbo. Portanto, tubos duplos, pode ser diferente no seu teclado. Isso é OR quando você usa um OR em vez de um fim e você está se encadeando a condições como essa. Você está dizendo que se qualquer condição um for verdadeira ou a condição dois for verdadeira, então execute esse código. Então, por exemplo, f e g são ambos verdadeiros. Então isso definitivamente executará esse código. Se eu fizer f e e, isso é um falso. Lembre-se, esse código ainda será executado porque pelo menos uma das condições é verdadeira. Agora, novamente, isso pode ficar muito louco porque posso continuar mudando, posso continuar fazendo ors, ou posso até jogar um fim lá dentro. Então, vamos fazer isso. Mas esse tipo de confusão agora porque isso pode ser lido de algumas maneiras diferentes. É E e G? E então, ou F? Ou é F ou E e G? Estes veem o que estou dizendo. Então, para, se eu colocar colchetes em torno desses, isso pode fazer mais sentido. Se eu fizer isso. Isso diz que se f for verdadeiro ou E e G são verdadeiros, então execute o código. No entanto, eu também poderia colocar colchetes em torno dele assim. Se F ou E for verdadeiro e G for verdadeiro, execute o código. Assim, você pode usar colchetes, colchetes arredondados para ajudá-lo a diferenciar quais condições avaliar primeiro. Tudo bem, até agora estamos usando apenas os valores booleanos, mas ainda há mais. Quero mostrar a você com a sintaxe de uma instrução if antes de continuarmos a olhar para números inteiros e strings. Então, juntamente com a instrução if, você também pode estender essa instrução if para testar outra condição, porque isso é apenas testar uma condição, certo? Você pode seguir o colchete de fechamento do primeiro bloco de código, certo? Caso contrário, e então você escreve outra condição. Então, vamos dizer else-if. E, então coloque isso mais, se G, então faça isso. Então, o que vai acontecer aqui é que ele testará essa condição. Se isso for avaliado como falso, testará o próximo e ele vai cair em cascata. Se isso for falso, então ele vai para o próximo. A qualquer momento, enquanto está verificando essas condições. Se um deles for verdadeiro, então ele entrará nesse ramo. Ele vai executar esse bloco de código e vai pular o resto. Portanto, isso permite testar, neste caso, três ramos ou caminhos diferentes e apenas escolher um, sendo o primeiro verdadeiro. Mas tendo em mente que ele verifica esses ramos dessas condições, quero dizer, de cima para baixo. Então, o primeiro que atinge isso é verdade. Esse é o ramo que vai cair. E, finalmente, há também outra característica das declarações if. Pode haver uma espécie de pegar todos os ramos. Se nenhuma dessas condições acima for verdadeira, você poderá ter um bloco de código else. Portanto, esse bloco de código é executado no final. Se nenhuma das condições fosse verdadeira e não executasse nenhuma dessas ramificações. Então, isso é como se sua captura todos fossem à prova de falhas. E, novamente, todos são opcionais. Você pode ter um elsif, você não pode ter mais se. Você não pode ter mais nenhum e você pode simplesmente ter um outro. Então, se essa condição não for verdadeira, então ela virá aqui. Tudo bem, então essa afirmação se for realmente poderosa. A sintaxe é realmente simples de entender, mas oferece tanta flexibilidade em quais instruções de código serão executadas dependendo do que está acontecendo dentro do aplicativo. Ok, então eu vou desfazer isso que possamos ver uma declaração de pleno direito if aqui. E vou mostrar como talvez inteiros ou strings possam ser avaliados como condições. Agora, no exemplo até agora, acabei de fazer referência valores booleanos, e isso é simples. Mas trabalhando com outros tipos de dados como números inteiros e strings, você pode ter que usá-los em uma declaração real para avaliar para obter um resultado booleano, certo? Por exemplo, em vez de g, que é apenas um valor booleano verdadeiro, vamos usar a. Para avaliar um resultado booleano, tenho que usar um operador de comparação, certo? Então eu posso usar maior do que se a for maior que 0, certo? Isso pode ser avaliado como verdadeiro ou falso. E além de maior que, aqui estão alguns outros que você pode usar. Assim, maior que, menor que, maior ou igual a, e você tem menos ou igual a. E depois há igualdade. Com igualdade, você não usa um único sinal de igual porque isso é para atribuição. Como você pode ver aqui, estamos atribuindo esses valores a constantes. Para comparar a qualidade, você usa um sinal de igual duplo. Então eu posso dizer aqui embaixo, faz um igual a 0 e, claro, não acontece. Portanto, esta afirmação aqui será avaliada como falsa. E como este é um operador final, ambas as condições precisam ser verdadeiras. E como este já é falso, então ele não entrará nesse ramo. De qualquer forma. Podemos mudar isso também. Então, se b for menor que três ou quatro, quero dizer, e se c for igual a 10. Portanto, esses são alguns exemplos de operadores de comparação que avaliam como verdadeiro ou falso. Agora, para cordas, você também pode fazer isso. Você pode, você pode avaliar d, por exemplo, é uma string e você pode testar se ela é igual a hello. Então isso é uma coisa que você pode fazer com cordas. Você ainda pode usar maior ou igual a. Por exemplo, se tivéssemos deixado h igual a mundo. E podemos dizer se D é maior que h. Então podemos fazer isso. Nesse caso, ele vai comparar o H com o W. E porque h não é maior que w, porque vem antes de W, então isso vai ser falso. Mais uma coisa interessante que quero mostrar é o uso do ponto de exclamação. Então este, basicamente inverte o valor booleano. Então, se g fosse, G é verdade, certo? Se eu colocar o ponto de exclamação na frente dele, basicamente vai virar o valor booleano. Então g é verdade. Tenho o ponto de exclamação. Vai transformá-lo em falso. Então, ele não vai executar isso. Você poderia colocá-lo na frente disso, por exemplo. E uma dúzia, não é igual a 0 porque é um, como você pode ver lá em cima. Mas ter isso na frente dele vai virar isso para verdade. E agora que penso nisso, você pode testar a desigualdade também. Portanto, não é igual. Ok, então eu posso testar se a não é igual a 0, o que é verdade. Mas então, porque eu tenho esse ponto de exclamação na frente dele, ele vai virá-lo para falso. Então, muita flexibilidade aqui, e isso é apenas um exemplo, certo? Portanto, não precisa ser tão complicado. Agora eu quero voltar ao nosso jogo de cartas de guerra e usar a instrução if para determinar qual carta é maior e, em seguida, incrementar a pontuação do jogador ou a pontuação da CPU. Tudo bem, então aqui tenho o projeto de jogo de cartas de guerra. E se você der uma olhada nesta parte aqui onde estávamos atualizando a pontuação, estamos simplesmente incrementando a CPU e pontuação do jogador com cada um dado do botão. Agora que você aprendeu sobre instruções if no playground do Xcode, tenho certeza de que é muito trivial implementá-lo para que você esteja comparando o player ran versus CPU RAM e vendo qual número é maior para determinar qual pontuação atualizar. Agora, porque rotulamos nossos ativos corretamente para serem os mais baixos e o ACE sendo o mais alto, tendo um valor de 14. É muito trivial comparar. Você acabou de comparar esse número final, certo? E essencialmente esse é o número aleatório. Então, se você acha que pode fazer isso, pause o vídeo agora e experimente por si mesmo. Você aprenderá muito. Eu prometo, mesmo que você dê uma chance e você não entenda, a lição vai ficar muito mais. Então vá em frente e pause o vídeo, experimente e, em seguida, despause-o e me veja fazendo isso aqui. Tudo bem, então bem-vindo de volta. Vamos implementar essa declaração if para ver qual cartão é maior. Então, vou começar com se. E vou primeiro testar se o número do jogador é maior que o número de CPUs. Tudo bem, vou usar maior do que, se for esse o caso, então vou incrementar a pontuação do jogador. Caso contrário, vou apenas incrementar a pontuação da CPU. Agora. Não me importo com laços, e é por isso que não estou comparando a igualdade entre os dois números aleatórios. Mas você definitivamente poderia fazer isso em sua versão, se quiser. Na verdade, há um problema com a maneira como estou fazendo isso aqui. A CPU tem uma vantagem injusta porque, no caso de um empate, a CPU obtém a pontuação correta usando esta instrução else. Portanto, eu meio que tenho que testar o outro caso. Então, vou testar se o rand da CPU for maior do que o jogador ao redor, então a pontuação da CPU mais um. Caso contrário, se essas duas condições não forem verdadeiras, então é um empate e eu não quero fazer nada. Tudo bem, agora vamos experimentar isso. Então, vou tocar a pré-visualização ao vivo novamente, e faremos isso aqui mesmo no Canvas. Vou acertar o acordo. Então 14 é definitivamente maior que cinco. Então, o jogador recebe uma pontuação. Jack é definitivamente, bem, isso é um, que é um 11 é maior que 3, quatro é maior que três. Então, parece estar funcionando corretamente. Parabéns, o jogo de cartas de guerra está completo. Você aprendeu a criar interfaces de usuário, como codificar no Swift e concluiu seu primeiro aplicativo. Pense no primeiro dia desse desafio de 14 dias. Como você se sentiu naquela época? Você estava nervoso por achar que poderia fazer tudo isso? E agora olhe até onde você chegou. Como você se sente sobre o desenvolvimento de aplicativos agora? Agora eu tentei tornar isso o mais fácil possível de entender e espero que você seja capaz de ganhar novas habilidades. Agora sei que estou fazendo isso soar como o fim, mas na verdade é apenas o começo da sua jornada. Na próxima lição, direi quais são os próximos passos e para onde ir a partir daqui. 14. 13: desafio bônus: Olá e seja bem-vindo à Lição 13. Agora, nesta lição, será mais um desafio prático e prático. Quero que você tente criar este aplicativo por conta própria. Agora, você tem todas as habilidades necessárias com base nas lições de um a 12. E esse exercício será uma ótima maneira de reforçar o que você aprendeu e também identificar quaisquer lacunas em seu conhecimento neste momento para que possamos revisá-lo e também descobrir o que é que você precisa se atualizar antes de continuar. Ok, então deixe-me passar por este aplicativo. Você tem um título, você tem um número de créditos, você tem algumas imagens. E quando você aperta esse botão, ele simplesmente aleatoriamente as imagens. Se eles não corresponderem, você perderá créditos. Mas, no entanto, se você conseguir três correspondentes, o que não consigo fazer agora. Oh, lá vamos nós. Então você ganharia créditos. Então isso é muito parecido com o jogo de cartas de guerra, exceto que agora existem três coisas que você aleatoriamente em vez de duas. E os ativos de imagem estão na descrição em um link. Então você pode se certificar de agarrá-los. Então você terá tudo o que precisa. Se você acha que isso é muito fácil ou se é muito difícil, de qualquer forma, eu recomendo que você experimente porque é realmente a melhor maneira de aprender, mesmo se você ficar preso. Quando você olha para a solução e descobre como superar esse obstáculo em que você está preso. Vai ser muito significativo e realmente ajudará a comprometê-lo com a memória. E essa crença sobre o aprendizado prático se deve ao meu próprio fracasso no início, quando tentei aprender iOS. Então isso não é apenas algo que li ou algo que ouvi. Isso é da minha própria experiência pessoal que é, não há mais nada que possa substituir como a melhor maneira de aprender. 15. 14: o que está a ela?: Você fez isso. Onde você vai daqui? O que você aprende a seguir? Bem, ainda há uma tonelada de habilidades para dominar antes que você possa finalmente criar qualquer tipo de aplicativo que desejar. Mas espero que ao menos fazer o jogo de cartas de guerra e completar esse desafio, isso tenha ajudado você a romper algumas barreiras mentais sobre se você pode ou não fazer isso. Porque agora você deve saber que você pode fazer isso. E é só uma questão de tempo. Mais aprendizados, mais obstáculos superados e mais prática antes de você finalmente atingir seu objetivo, vou compartilhar com você as próximas cinco coisas que você pode fazer para progredir na jornada do aplicativo. Número um ou mais visualizações e contêineres ao fazer o jogo de cartas de guerra, você já aprendeu sobre alguns deles, como texto, botões de imagem, pilhas, mas há muito mais VMs e contêineres que você pode aprender, como alternâncias, seletores, status, formas de barras , grades, listas e a lista continua. Agora, aprender a usar mais visualizações e contêineres é como obter um caminhão carregado de peças de lego. Suas opções vão se expandir muito. Número dois, mais tipos de aplicativos. Por quê? Bem, pense nisso. Nada de novo nunca vem do zero. Você está sempre aproveitando suas experiências anteriores, o que você viu, o que você fez, o que você tentou. Então, se você quiser criar seu próprio aplicativo, a melhor coisa que você pode fazer neste momento da sua jornada é ficar exposto ao maior número possível de aplicativos diferentes . Com cada novo aplicativo, você aprenderá novas arquiteturas, novos padrões e novas formas de fazer as coisas. Por exemplo, como você navega de uma tela para a próxima? Como você baixa dados da Internet? Como você salva dados em um banco de dados? E como você permite que os usuários criem contas e façam login? Esses são todos os tipos diferentes de aplicativos aos quais você precisa ser exposto antes incorporar esses mesmos elementos em seu aplicativo. Número três, mais, Xcode e swift. Agora, neste desafio, abordamos levemente conceitos básicos do Swift e como navegar pelo próximo código, mas definitivamente há mais profundidade para ambos. Os Aplicativos do Azure ficam mais complexos em seus projetos, ficam maiores, você encontrará mais problemas e mais dinheiro para resolver. E você vai precisar de um comando mais profundo da linguagem de programação Swift. Então, como você aprende mais rápido e Xcode? Bem, ele volta a criar mais aplicativos. À medida que você cria cada aplicativo, você naturalmente aprenderá técnicas mais rápidas e Xcode. Número 4, MVVM. Agora este é muito importante na interface do usuário Swift. Este é o principal padrão de arquitetura e significa Model-View-ViewModel no jogo de cartas de guerra que você fez. Tínhamos a parte da visualização e tínhamos algumas propriedades de dados nela. Mas em um aplicativo Swift UI maior, você teria modelos representando seus dados também e visualizaria modelos que suportam suas visualizações. Esse padrão de arquitetura existe em qualquer aplicativo Swift UI maior. Portanto, é muito importante saber, fazer algumas pesquisas no Google ou YouTube no MVVM para entendê-lo em um nível conceitual. E, na próxima vez que você fizer um tutorial de interface do usuário rápido, tente identificar o padrão sozinho ou se você estiver criando seu próprio Swift aplicativos definitivamente tentam colocar o padrão em prática. Número cinco, mais estruturas da Apple. A Apple tem uma tonelada de estruturas que você pode acessar com seu aplicativo. Basta adicionar a estrutura ao seu projeto Xcode, ler a documentação e você adicionará novos recursos ao seu aplicativo, como aprendizado de máquina, realidade aumentada e assim por diante. Agora, isso vai levar um pouco mais de experiência porque você precisa ler e entender a documentação. Mas é uma boa habilidade começar a treinar porque todos os anos haverá novas ferramentas novas plataformas e novas estruturas para você aprender. Como desenvolvedor de aplicativos, o aprendizado nunca pára e sua capacidade de aprender rapidamente e experimentar as coisas realmente determinará seu sucesso a longo prazo. Essas são as cinco áreas que eu recomendo que você explorou progredir na jornada do aplicativo. Quero agradecer muito por enfrentar esse desafio e por aprender comigo. Espero que você tenha tido uma experiência incrível. E se você já teve, por favor, compartilhe com seus amigos e familiares. Por favor, me ajude a divulgar e contar a todos sobre código com Chris. Agradeço muito você e obrigado por me deixar fazer parte da jornada do seu aplicativo. Tudo bem, te vejo na próxima lição.