Introdução: por que o Swift morde, mesmo que você o ame
\n\nVocê decidiu se tornar um desenvolvedor iOS. Instalou o Xcode, escreveu o primeiro "Hello, World!" — e se sentiu quase como Tim Cook. E então começou: o Xcode reclama de nil incompreensíveis, o código não compila e o aplicativo trava no primeiro toque de botão. Familiar?
Bem-vindo ao mundo do Swift — a linguagem que é amada pela segurança, mas odiada pela rigidez. Neste artigo, vamos analisar os erros ao aprender Swift que 90% dos iniciantes cometem. Você aprenderá como evitá-los, economizar nervos e parar de amaldiçoar a Apple. Vamos lá!
\n\nErro nº1: Ignorar Optionals e trabalhar com nil "na sorte"
\n\nSwift é a primeira linguagem onde nil não é apenas "vazio", mas uma filosofia inteira. Iniciantes frequentemente tentam trabalhar com optionals como em Python ou JavaScript: "bem, talvez tenha algo lá, talvez não". E recebem um crash.
Como fica no código
\n\n// ❌ Erro típico de iniciante\nvar userName: String? = nil\nprint("Olá, \\(userName.uppercased())!") // Fatal error: Unexpectedly found nil\n\n\nAqui userName é um optional (String?). Você esqueceu de verificar se há um valor e tentou chamar o método uppercased() em nil. O aplicativo trava.
Abordagem correta
\n\n// ✅ Extração segura\nif let safeName = userName {\n print("Olá, \\(safeName.uppercased())!")\n} else {\n print("Nome não definido")\n}\n\n// Ou com guard\nguard let unwrappedName = userName else {\n print("Erro: nome ausente")\n return\n}\nprint("Olá, \\(unwrappedName.uppercased())!")\n\n\nDica: Sempre pense: "Esta variável pode ser nil?". Se sim — use if let ou guard let. Este é um dos erros de iniciantes em Swift mais comuns, que consome horas de depuração.
Erro nº2: Medo de Closures e uso de @escaping
\n\nClosures em Swift são como funções anônimas. Iniciantes têm medo delas, escrevem métodos enormes em vez de closures compactas e depois se surpreendem que o código não é legível. E quando chega a assincronicidade — começa o inferno com @escaping.
Exemplo de medo de closures
\n\n// ❌ Código que pode ser reduzido em 3 vezes\nfunc fetchData(completion: (String) -> Void) {\n let result = "Dados carregados"\n completion(result)\n}\n\n// Chamada\nfetchData { data in\n print(data)\n}\n\n\nTudo bonito? Sim. Mas iniciantes escrevem assim:
\n\n// ❌ Estilo horrível\nfunc fetchData() {\n let result = "Dados carregados"\n handleResult(result: result)\n}\n\nfunc handleResult(result: String) {\n print(result)\n}\n\n\nE quando precisam fazer uma requisição assíncrona, esquecem o @escaping:
// ❌ Erro: closure não escaping\nfunc loadUser(id: Int, completion: (User) -> Void) {\n DispatchQueue.global().async {\n let user = User(id: id)\n completion(user) // Erro de compilação!\n }\n}\n\n\nO Xcode dirá: "A closure deve ser @escaping". Corrigimos:
// ✅ Correto\nfunc loadUser(id: Int, completion: @escaping (User) -> Void) {\n DispatchQueue.global().async {\n let user = User(id: id)\n completion(user)\n }\n}\n\n\nConclusão: Não tenha medo de closures. Elas são suas amigas. E @escaping é apenas uma flag que diz: "Esta closure será chamada depois, salve-a". Lembre-se disso — e metade dos erros Swift para iniciantes desaparecerá.
Erro nº3: Confusão entre classes e structs
\n\nEm Swift existem classes (tipo por referência) e structs (tipo por valor). Iniciantes frequentemente usam classes em todo lugar porque "estão acostumados de outra