
Comecei a programar em Swift sem saber Swift (e funcionou!)
Sempre fui do tipo que aprende melhor fazendo. Em vez de assistir tutoriais eternamente ou ler a documentação de ponta a ponta, prefiro abrir o editor, começar a montar algo real e aprender no caminho, com erros, dúvidas e descobertas.
Foi assim que comecei a aprender Swift.
Meu background
Hoje eu trabalho principalmente com JavaScript/TypeScript, mais especificamente com React Native, desenvolvendo apps mobile no dia a dia. Já tive experiência com Java no backend e até brinquei com Objective-C no passado. Então o ecossistema da Apple não era completamente novo para mim, mas Swift era um território inexplorado.
Eu já entendia boa parte dos conceitos de programação mobile, mas queria aprender a linguagem Swift em si. E não só a linguagem, mas também as boas práticas modernas, a estrutura de um app bem organizado e os recursos nativos do iOS.
Criando primeiro, entendendo depois
Decidi começar com um projeto simples, mas que me forçasse a aprender várias coisas de uma vez só. Assim nasceu o SwiftWeather, um app que busca dados da API da OpenWeather para mostrar o clima de uma cidade.
Parece básico, mas pra isso eu precisei entender:
Como funciona o URLSession para chamar uma API
Como usar async/await e tratamento de erro com try/catch
Como transformar o JSON da API em modelos com Codable
Como montar uma estrutura de código minimamente decente
Como lidar com estados de loading, erro e dados carregados
E tudo isso escrevendo código real, sem seguir passo a passo de tutorial.
Além da prática, fui notando algumas particularidades do Swift que me chamaram atenção. A linguagem é fortemente type-safe, o que no começo parece chato, mas logo mostra seu valor ao evitar erros bobos antes mesmo de rodar o app. O uso intenso de structs em vez de classes foi outra surpresa — elas são mais leves, imutáveis por padrão e incentivam um estilo de programação mais funcional.
Mas o que mais me marcou foi o conceito de optionals. Vindo do mundo JavaScript/TypeScript, estou acostumado com undefined e null aparecendo de surpresa e quebrando coisas silenciosamente. O TypeScript até ajuda a evitar isso com strictNullChecks, mas nem sempre é levado a sério ou bem aplicado. No Swift, por outro lado, os optionals são parte central da linguagem. Você é forçado a declarar quando algo pode ser nulo e obrigado a lidar com isso de forma explícita usando if let, guard let ou ?. É uma abordagem mais restrita, mas que acaba te protegendo de muitos bugs escondidos. Parece que o Swift quer garantir que você pense em todos os cenários antes de seguir em frente.

Refinando a partir da prática
Depois de montar essa base, criei outro repositório chamado macstories. Aqui meu objetivo era começar a aplicar boas práticas, testar organização de pastas, brincar com SwiftUI e criar componentes reutilizáveis.
Foi nesse projeto que comecei a pensar mais na arquitetura do app, na separação de responsabilidades e em como escalar um projeto com múltiplas telas e comportamentos. Uso esse repositório como um espaço de experimentação e melhoria contínua.
Por que aprender fazendo funciona pra mim
Aprender dessa forma te obriga a pensar. Às vezes o caminho é mais lento, mas você realmente entende o que está acontecendo. Quando dá erro, você precisa investigar, ler a documentação, perguntar pro ChatGPT, procurar no Stack Overflow e testar até funcionar. E quando finalmente funciona, aquele conhecimento fica.
A prática fixa melhor do que qualquer tutorial.
Minha dica pra quem quer aprender Swift (ou qualquer outra linguagem)
Não espere saber tudo antes de começar. Escolha uma ideia simples, algo que você usaria, e comece. Pode ser um app de clima, um bloco de notas ou uma lista de tarefas. O importante é começar.
Criar um projeto real vai te mostrar os desafios do dia a dia e te dar motivação pra continuar aprendendo. Mesmo que o código fique feio no início, você sempre pode refatorar depois.
Se quiser ver o que estou construindo ou trocar ideia sobre Swift, estão aqui meus repositórios: