Arrays e Sets em Swift: qual usar no seu App iOS?
Rocketseat

Rocketseat

5 min de leitura
swift
No universo do desenvolvimento, especialmente quando falamos de iOS com Swift, saber como organizar e manipular dados é como ter um superpoder. É a base para construir aplicativos eficientes, rápidos e escaláveis. Duas das ferramentas mais fundamentais e poderosas que o Swift nos oferece para essa missão são os Arrays e os Sets.
Você pode pensar nelas como diferentes tipos de "caixas" para guardar suas informações. Mas qual caixa usar? Quando uma é melhor que a outra? Se essas perguntas já passaram pela sua cabeça, você está no lugar certo!
Neste artigo, vamos desmistificar os Arrays e Sets em Swift. Vamos explorar o que são, como funcionam, suas operações principais e, o mais importante, quando escolher cada um deles para otimizar seu código. Dominar essas coleções é um passo crucial na jornada para construir apps iOS que realmente impactam.

Arrays em Swift: a sequência ordenada (Array<Element>)

Vamos começar com o Array, provavelmente a coleção mais familiar para quem está começando.

O que é um Array?

Pense em um Array como uma lista ordenada de itens, onde todos os itens são do mesmo tipo. A ordem em que você adiciona os elementos é mantida, e os elementos podem ser acessados pela sua posição (índice). Ah, e Arrays permitem elementos duplicados sem problemas!

Declaração e inicialização:

Existem várias formas de criar um Array em Swift:
// Criando um Array vazio de Strings var nomesDevs: [String] = [] // Ou usando a sintaxe de inicializador var equipeBackend = [String]() // Criando um Array já com valores (tipo inferido como [String]) let equipeRocketseat = ["Diego", "Mayk", "Rodrigo", "Mayk"] // Note que "Mayk" aparece duas vezes! // Criando um Array de Inteiros var versoesSwift: [Int] = [1, 2, 3, 4, 5] // Criando um Array com um valor padrão repetido var tarefasStatus = Array(repeating: false, count: 5) // [false, false, false, false, false]

Acessando elementos:

O acesso é feito pelo índice, lembrando que o primeiro elemento está no índice 0:
let primeiroDev = equipeRocketseat[0] // "Diego" let terceiroDev = equipeRocketseat[2] // "Rodrigo" // Cuidado! Acessar um índice que não existe causa um erro (crash). // Exemplo: let quintoDev = equipeRocketseat[4] // Isso causaria um erro! // Para acessar o primeiro ou último de forma segura (retorna Optional) if let ultimoDev = equipeRocketseat.last { print("O último dev da lista é: \(ultimoDev)") // Imprime "Mayk" } if let primeiroDevSeguro = equipeRocketseat.first { print("O primeiro dev é: \(primeiroDevSeguro)") // Imprime "Diego" }

Adicionando elementos:

Manter sua lista atualizada é fácil:
var alunos: [String] = ["Laís"] // Adiciona no final alunos.append("Fernanda") // ["Laís", "Fernanda"] // Insere em uma posição específica alunos.insert("Isabela", at: 1) // ["Laís", "Isabela", "Fernanda"] // Adiciona múltiplos elementos de outra sequência let novosAlunos = ["Mayk", "Rodrigo"] alunos += novosAlunos // ["Laís", "Isabela", "Fernanda", "Mayk", "Rodrigo"]

Removendo elementos:

Precisa tirar alguém da lista? Isso é simples de fazer!
// Remove pelo índice (e retorna o elemento removido) let alunaRemovida = alunos.remove(at: 2) // Remove "Fernanda" print("Aluna removida: \(alunaRemovida)") print(alunos) // ["Laís", "Isabela", "Mayk", "Rodrigo"] // Remove o último elemento let ultimoAlunoRemovido = alunos.removeLast() // Remove "Rodrigo" print(alunos) // ["Laís", "Isabela", "Mayk"] // Remove todos os elementos // alunos.removeAll() // print(alunos) // []

Modificando elementos:

Você pode substituir um elemento existente usando seu índice:
var frameworks = ["React", "Vue", "Node.js"] frameworks[1] = "Angular" // Substitui "Vue" por "Angular" print(frameworks) // ["React", "Angular", "Node.js"]

Operações comuns:

Arrays vêm com um arsenal de métodos úteis:
// Quantidade de elementos print("Total de alunos: \(alunos.count)") // 3 // Verificar se está vazio if alunos.isEmpty { print("Nenhum aluno na lista.") } else { print("Temos alunos cadastrados!") } // Iterar sobre os elementos print("\nAlunos presentes:") for aluno in alunos { print("- \(aluno)") } print("\nAlunos com forEach:") alunos.forEach { aluno in print("* \(aluno)") } // Transformar elementos (map) let nomesAlunosMaiusculos = alunos.map { $0.uppercased() } print(nomesAlunosMaiusculos) // ["LAÍS", "ISABELA", "MAYK"] // Filtrar elementos (filter) let nomesComA = alunos.filter { $0.lowercased().contains("a") } print(nomesComA) // ["Laís", "Isabela", "Mayk"] (Considerando 'a' minúsculo)
⚠️
Adicionar ou remover elementos no final do Array geralmente é muito rápido (O(1)). Essa performance depende de a alocação de memória já comportar os novos elementos. Em alguns casos, pode haver realocação e o tempo de execução aumenta.

Sets em Swift: a coleção de elementos únicos (Set<Element>)

Agora, vamos conhecer o Set, uma coleção poderosa, mas talvez menos intuitiva no início.

O que é um Set?

Um Set é uma coleção de itens únicos do mesmo tipo, mas sem uma ordem definida. Pense nele como um saco onde você joga coisas dentro: você pode verificar rapidamente se algo está lá, mas não há garantia da ordem em que os itens sairão. A principal característica é: não permite elementos duplicados.
Para um tipo poder ser armazenado em um Set, ele precisa ser Hashable. Isso significa que o Swift precisa de uma forma de calcular um valor "hash" (um identificador numérico) para cada elemento, o que permite verificar a unicidade e buscar elementos muito rapidamente. Tipos básicos como String, Int, Double, Bool já são Hashable por padrão.

Declaração e inicialização:

// Criando um Set vazio de Strings var emails: Set<String> = [] // Ou usando a sintaxe de inicializador var tags = Set<String>() // Criando um Set com valores (tipo inferido como Set<String>) // Note que "Swift" é adicionado duas vezes, mas só aparecerá uma vez no Set! var tecnologias: Set = ["Swift", "React Native", "Node.js", "Swift", "Kotlin"] print(tecnologias) // A ordem pode variar! Ex: ["React Native", "Node.js", "Swift", "Kotlin"]

Adicionando elementos:

Usamos o método insert():
let resultadoInsert = tecnologias.insert("TypeScript") print("TypeScript foi inserido? \(resultadoInsert.inserted)") // true print("Elemento após inserir: \(resultadoInsert.memberAfterInsert)") // "TypeScript" print(tecnologias) // Agora inclui "TypeScript" // Tentando inserir um elemento que já existe let resultadoRepetido = tecnologias.insert("Swift") print("Swift (repetido) foi inserido? \(resultadoRepetido.inserted)") // false print(tecnologias) // O Set não mudou

Removendo elementos:

// Remove um elemento específico (retorna o elemento se ele existia, ou nil) if let tecnologiaRemovida = tecnologias.remove("Node.js") { print("\(tecnologiaRemovida) foi removida do Set.") } else { print("Node.js não estava no Set.") } print(tecnologias) // Remove todos os elementos // tecnologias.removeAll()

Verificando pertinência (membership):

Esta é uma das grandes vantagens do Set: verificar se um elemento existe é extremamente rápido, não importa o tamanho do Set!
if tecnologias.contains("Swift") { print("Sim, dominamos Swift aqui na Rocketseat! 🚀") } if !tecnologias.contains("Ruby") { print("Ruby não está no nosso Set... ainda!") }
👉
Sets oferecem busca extremamente rápida (média O(1)), mesmo em coleções grandes. Em raros casos de colisão de hash — geralmente com tipos personalizados — essa performance pode se aproximar de O(n). Com String, Int e outros tipos nativos, o desempenho é quase sempre ideal.

Operações de conjuntos:

Aqui é onde os Sets brilham! Eles permitem realizar operações matemáticas de conjuntos de forma muito eficiente. Imagine dois devs, Diego e Mayk, e seus conjuntos de skills:
let stackDiego: Set = ["Node.js", "React", "React Native", "PostgreSQL"] let stackMayk: Set = ["Node.js", "Elixir", "Phoenix", "PostgreSQL"] // União: Todos os elementos de ambos os Sets, sem duplicatas let skillsCombinadas = stackDiego.union(stackMayk) print("Skills combinadas: \(skillsCombinadas)") // Ex: ["React", "Node.js", "Elixir", "React Native", "Phoenix", "PostgreSQL"] // Interseção: Elementos que existem EM AMBOS os Sets let skillsEmComum = stackDiego.intersection(stackMayk) print("Skills em comum: \(skillsEmComum)") // Ex: ["Node.js", "PostgreSQL"] // Subtração: Elementos que estão no primeiro Set, MAS NÃO no segundo let skillsSoDoDiego = stackDiego.subtracting(stackMayk) print("Skills que só o Diego tem (nesta comparação): \(skillsSoDoDiego)") // Ex: ["React", "React Native"] // Diferença Simétrica: Elementos que estão em um OU no outro, MAS NÃO EM AMBOS let skillsExclusivas = stackDiego.symmetricDifference(stackMayk) print("Skills exclusivas de cada um: \(skillsExclusivas)") // Ex: ["React", "Elixir", "React Native", "Phoenix"]

Iteração:

Você pode iterar sobre um Set, mas lembre-se: a ordem não é garantida.
print("\nTecnologias no Set (ordem indefinida):") for tech in tecnologias { print("- \(tech)") } // Para iterar em ordem, use sorted() print("\nTecnologias no Set (ordenadas):") for tech in tecnologias.sorted() { print("- \(tech)") }
⚠️
Sets são otimizados para adição (insert), remoção (remove) e verificação de pertinência (contains). Essas operações têm, em média, tempo de execução constante (O(1)), o que é incrivelmente rápido.

Array vs. Set

Ok, agora que conhecemos os dois, a pergunta de ouro: quando usar um Array e quando usar um Set? A escolha depende do que você precisa fazer!
Característica
Array (Array<Element>)
Set (Set<Element>)
Ordem
Mantida (ordenada)
Não garantida (não ordenada)
Elementos duplicados
Permitidos
Não permitidos (únicos)
Acesso
Por Índice (rápido: O(1))
Por valor (contains) (muito rápido: O(1))
Busca por valor
Lenta (linear: O(n))
Muito Rápida (constante: O(1))
Inserção/remoção
Rápido no final, lento no meio/início
Rápida (constante: O(1) em média)
Tipo do elemento
Qualquer tipo
Deve ser Hashable
Operações de conjunto
Não nativas
Nativas e eficientes

Use um Array quando:

  • A ordem dos elementos importa: como os passos de um tutorial, a sequência de telas visitadas ou uma lista de tarefas a fazer.
  • Você precisa acessar elementos pela posição (índice) frequentemente.
  • Elementos duplicados são permitidos e fazem sentido: como uma lista de todas as notas de um aluno ou todos os logins de um usuário.

Use um Set quando:

  • A unicidade dos elementos é a chave: como garantir que um usuário não possa curtir o mesmo post duas vezes, ou armazenar uma lista de tags únicas para um artigo.
  • A ordem dos elementos não é relevante.
  • Você precisa verificar rapidamente se um item existe na coleção: como checar se um usuário tem uma determinada permissão ou se uma palavra já foi adicionada a um dicionário.
  • Você precisa realizar operações de conjunto (união, interseção, etc.).

Indo além: coleções e a sua jornada no iOS com Swift

Dominar Arrays e Sets é como ter as ferramentas certas na sua caixa: fundamental para construir qualquer coisa sólida e funcional. No desenvolvimento iOS, você usará essas coleções o tempo todo! Seja para popular os dados de uma UITableView ou UICollectionView (Arrays são ótimos aqui pela ordem!), para gerenciar um conjunto de permissões de usuário (Sets são perfeitos pela unicidade e busca rápida!) ou para processar dados que chegam de uma API, garantindo que não haja duplicatas indesejadas.
Entender a fundo essas estruturas de dados é apenas o começo da jornada para se tornar um(a) desenvolvedor(a) iOS completo e requisitado. A teoria é essencial, mas a mágica acontece quando você aplica esses conceitos na prática, construindo aplicativos reais, do zero, enfrentando desafios e aprendendo a arquitetar soluções eficientes.
Se você quer ir além, mergulhar de cabeça no ecossistema Apple, dominar não só Swift, mas também Xcode, Interface Builder, arquiteturas como MVVM, consumo de APIs, persistência de dados e até o processo de publicação na App Store...
Quando você percebe que dominar Arrays e Sets é só o começo da jornada iOS.
Quando você percebe que dominar Arrays e Sets é só o começo da jornada iOS.
...a Formação iOS com Swift da Rocketseat é o seu próximo nível! Lá, pegamos esses fundamentos essenciais, como Arrays e Sets, e os aplicamos em projetos práticos que simulam o dia a dia do mercado, preparando você para decolar na sua carreira iOS.

Conclusão:

Ufa! Exploramos bastante sobre Arrays e Sets em Swift, não é mesmo? Agora você tem o conhecimento para diferenciá-los claramente:
  • Arrays: para quando a ordem importa e duplicatas são aceitáveis. Acesso rápido por índice, vale reforçar que isso vale quando o índice é conhecido. Em buscas por valor, o custo é O(n).
  • Sets: para quando a unicidade é crucial, a ordem não importa, e você precisa de velocidade na verificação de existência ou em operações de conjunto.
Lembre-se: escolher a coleção certa não é apenas um detalhe técnico; é um passo fundamental para escrever código mais limpo, mais eficiente e mais fácil de manter. É pensar na performance e na lógica da sua aplicação desde a base.
💜
Continue explorando, praticando com seus próprios exemplos e construindo projetos incríveis. O universo Swift é vasto e cheio de possibilidades esperando por você. Nunca pare de aprender!
Artigos_

Explore conteúdos relacionados

Descubra mais artigos que complementam seu aprendizado e expandem seu conhecimento.

Aprenda programação do zero e DE GRAÇA

No Discover você vai descomplicar a programação, aprender a criar seu primeiro site com a mão na massa e iniciar sua transição de carreira.

COMECE A ESTUDAR AGORA