Introdução: Por que até mesmo o append pode quebrar o código?
\n\nParece simples, não é? Adicionar um elemento a um array em Swift. Escrevemos array.append(newElement) e pronto. No entanto, a julgar pelos milhares de visualizações no Stack Overflow, é justamente esta operação, aparentemente trivial, que confunde tanto iniciantes quanto desenvolvedores experientes.
Neste artigo, não vamos apenas mostrar como adicionar um elemento a um array em Swift. Vamos analisar os 5 erros mais comuns e traiçoeiros que transformam um simples append em uma dor de cabeça. Você descobrirá por que o compilador pode reclamar de um código aparentemente correto, como não ultrapassar os limites do array e qual a diferença entre append e insert. Vamos lá!
Erro nº 1: Esquecer a tipagem estrita
\n\nSwift é uma linguagem de tipagem estrita. Isso significa que um array declarado como [Int] não aceitará uma string, mesmo que ela se pareça muito com um número. Esta é uma armadilha comum para quem vem do Python ou JavaScript.
Problema: Incompatibilidade de tipos
\n\nvar numbers: [Int] = [1, 2, 3]\n// Erro de compilação: Cannot convert value of type 'String' to expected argument type 'Int'\nnumbers.append("4")\n\n\nSolução: Conversão de tipos
\n\nSempre converta explicitamente os dados para o tipo do array. Use inicializadores ou conversão explícita:
\n\nvar numbers: [Int] = [1, 2, 3]\nif let intValue = Int("4") {\n numbers.append(intValue) // ✅ Funciona: numbers = [1, 2, 3, 4]\n}\n\n// Ou para um array de strings:\nvar strings: [String] = ["a", "b"]\nstrings.append(String(42)) // ✅ "42" adicionado como string\n\n\nDica: Se você estiver adicionando elementos de uma fonte externa (API, entrada do usuário), sempre verifique o tipo com as? ou use compactMap para filtrar nil.
Erro nº 2: Index out of range ao usar insert
\n\nO método insert(_:at:) permite inserir um elemento em uma posição arbitrária. Mas se você especificar um índice maior que o número de elementos no array, o aplicativo irá travar com Fatal error: Index out of range.
Problema: Inserção fora dos limites do array
\n\nvar fruits = ["Maçã", "Banana"]\n// Array de 2 elementos: índices 0 e 1\n// Erro! O índice 5 não existe\nfruits.insert("Laranja", at: 5)\n\n\nSolução: Verificação de limites e extensão segura
\n\nExistem duas maneiras de evitar esse erro:
\n- \n
- Verificação do índice: Certifique-se de que o índice está no intervalo de 0 a
array.count(inclusive parainsert). - Complemento automático: Se você quiser inserir um elemento no final quando estiver fora dos limites, use a lógica com
append.
var fruits = ["Maçã", "Banana"]\n\n// Opção segura 1: verificação\nlet index = 5\nif index >= 0 && index <= fruits.count {\n fruits.insert("Laranja", at: index)\n} else {\n // Se o índice for maior que count, simplesmente adiciona ao final\n fruits.append("Laranja")\n}\nprint(fruits) // ["Maçã", "Banana", "Laranja"]\n\n// Opção segura 2: extensão (extension)\nextension Array {\n mutating func safeInsert(_ element: Element, at index: Int) {\n if index >= 0 && index <= self.count {\n self.insert(element, at: index)\n } else {\n self.append(element)\n }\n }\n}\n\nfruits.safeInsert("Kiwi", at: 100) // ✅ Adicionará ao final\n\n\nErro nº 3: Confusão entre append e +=
\n\nO operador += também pode adicionar elementos, mas seu comportamento difere do append. A principal diferença: += funciona com coleções, não com elementos individuais.
Problema: Criação implícita de array
\n\nvar list = [1, 2, 3]\nlis