Swift: Tutorial de Arrays do Swift
Um array é como uma lista de compras — cada item a fazer listado em ordem. Esta lição aborda o conjunto completo de operações de array do Swift, da criação ao CRUD, tudo em um só lugar.
1. O Que Você Vai Aprender
- Criar arrays de várias maneiras e especificar tipos de elementos
- Adicionar e remover elementos usando append, insert e remove
- Acessar e modificar elementos do array com subscritos
- Percorrer arrays com for-in e enumerated
- Usar propriedades práticas como isEmpty, count e contains
2. Uma História Real de um Desenvolvedor de E-Commerce
(1) Problema: Gerenciamento da lista do carrinho de compras em caos, dados dessincronizados
Alice está construindo o recurso de carrinho de compras para um app de e-commerce. O usuário — Charlie — adiciona 5 itens, depois remove 2 e altera quantidades 3 vezes. No checkout, ela descobre: o total do carrinho não corresponde aos preços individuais dos itens!
// Alice's original "manual" approach
var cartItem1 = "Laptop"
var cartItem2 = "Mouse"
var cartItemPrice1 = 999.0
var cartItemPrice2 = 25.0
// By the time items piled up, she was lost...
Alice estava gerenciando 6 itens com 12 variáveis separadas. Quando adicionou o 7º item, já não sabia mais como nomear a variável. Dados do carrinho espalhados por mais de 20 variáveis — mude uma e esqueça a outra.
(2) A Solução com Array
var cartItems = ["Laptop", "Mouse", "Keyboard"]
var cartPrices = [999.0, 25.0, 89.0]
cartItems.append("Monitor")
cartPrices.append(349.0)
cartItems.remove(at: 1)
cartPrices.remove(at: 1)
print("Cart: \(cartItems)")
print("Total: $\(cartPrices.reduce(0, +))")
(3) Resultado: Dados estruturados, 90% menos bugs
| Métrica | Variáveis Espalhadas | Gerenciamento com Array |
|---|---|---|
| Quantidade de variáveis | 18 | 2 |
| Adicionar um item | Criar 3 novas variáveis | 1 linha de append |
| Consistência dos dados | Frequentemente dessincronizado | Sincronia garantida |
| Bugs por semana | 3-5 | 0-1 |
3. Criando Arrays e Propriedades Básicas
Um array é uma coleção ordenada de elementos — todos devem ser do mesmo tipo.
graph TB
A[Array] --> B[Índice 0]
A --> C[Índice 1]
A --> D[Índice 2]
A --> E[Índice ...]
B --> F[Elemento]
C --> F
D --> F
E --> F
| Método de Criação | Exemplo | Observações |
|---|---|---|
| Literal | [1, 2, 3] | Mais comum |
| Anotação de tipo | Int | Array vazio |
| Valor repetido | Array(repeating: 0, count: 5) | Todos zeros |
| A partir de intervalo | Array(1...5) | A partir de um intervalo |
(1) Criando Arrays
// Method 1: literal
let numbers = [1, 2, 3, 4, 5]
// Method 2: empty array
var emptyArray: [String] = []
// Method 3: repeated value
let zeros = Array(repeating: 0, count: 3)
print(zeros)
// Method 4: from range
let rangeArray = Array(10...15)
print(rangeArray)
(2) Propriedades Comuns
let items = ["Apple", "Banana", "Orange"]
print("Count: \(items.count)")
print("Is empty: \(items.isEmpty)")
print("First: \(items.first ?? "None")")
print("Last: \(items.last ?? "None")")
print("Contains Apple: \(items.contains("Apple"))")
▶ Exemplo: Verificação de Estoque do Depósito
// ============================================
// Managing warehouse inventory with arrays
// ============================================
var inventory: [String] = []
if inventory.isEmpty {
print("Warehouse is empty, adding stock...")
}
inventory.append("Laptop")
inventory.append("Mouse")
inventory.append("Keyboard")
inventory.append("Monitor")
print("Inventory has \(inventory.count) items")
print("Products: \(inventory.joined(separator: ", "))")
print("First item: \(inventory[0])")
print("Last item: \(inventory[inventory.count - 1])")
Saída:
TEXT 📖 Somente leituraWarehouse is empty, adding stock... Inventory has 4 items Products: Laptop, Mouse, Keyboard, Monitor First item: Laptop Last item: Monitor
4. Operações CRUD com Arrays
Arrays são coleções mutáveis — você pode adicionar e remover elementos em qualquer posição.
| Operação | Método | Exemplo |
|---|---|---|
| Adicionar ao final | append(_:) |
array.append(4) |
| Inserir na posição | insert(_:at:) |
array.insert(0, at: 0) |
| Remover na posição | remove(at:) |
array.remove(at: 2) |
| Remover último | removeLast() |
array.removeLast() |
| Remover todos | removeAll() |
array.removeAll() |
| Modificar elemento | Atribuição por subscrito | array[1] = 100 |
(1) Adicionando e Inserindo Elementos
var tasks = ["Buy groceries", "Pay bills"]
// Append to end
tasks.append("Call doctor")
// Insert at specific position
tasks.insert("Check email", at: 0)
print(tasks)
(2) Removendo e Modificando Elementos
var scores = [88, 92, 75, 60, 95]
// Modify
scores[1] = 98
// Remove
let removed = scores.remove(at: 3)
print("Removed: \(removed)")
scores.removeLast()
scores.sort()
print(scores)
▶ Exemplo: Gerenciador de Lista de Tarefas
// ============================================
// Simple to-do list with arrays
// ============================================
var todoList = ["Buy milk", "Walk dog", "Write report"]
// Add
todoList.append("Read book")
todoList.insert("Morning exercise", at: 0)
// Modify
todoList[2] = "Write weekly report"
// Remove
let completed = todoList.remove(at: 1)
print("Completed: \(completed)")
// Traverse
print("\n=== Today's Todo ===")
for (i, task) in todoList.enumerated() {
print("\(i + 1). \(task)")
}
print("\nRemaining tasks: \(todoList.count)")
Saída:
TEXT 📖 Somente leituraConcluída: Passear com o cachorro === Tarefas de Hoje === 1. Exercício matinal 2. Comprar leite 3. Escrever relatório semanal 4. Ler livro Tarefas restantes: 4
5. Percorrimento de Array e Operações em Lote
O Swift fornece várias maneiras de percorrer arrays e métodos práticos de operação em lote.
| Método de Percorrimento | Sintaxe | Caso de Uso |
|---|---|---|
| Básico | for item in array |
Só se importa com os elementos |
| Indexado | for (i, item) in array.enumerated() |
Precisa dos números dos índices |
| Filtrado | for item in array where condicao |
Apenas elementos correspondentes |
| Ordem superior | array.map { } |
Transformar cada elemento |
| Filtro | array.filter { } |
Manter elementos que correspondem |
(1) Percorrimento Básico e Filtrado
let numbers = [3, 7, 2, 8, 5, 1, 9, 4, 6]
// Basic for-in
for num in numbers {
print(num, terminator: " ")
}
print()
// where filter
for num in numbers where num > 5 {
print("\(num) is greater than 5")
}
(2) Funções de Ordem Superior: map e filter
let prices = [12.99, 24.50, 8.75, 35.00]
// map: add tax to each price
let withTax = prices.map { $0 * 1.08 }
print("With tax: \(withTax)")
// filter: items over 20
let expensive = prices.filter { $0 > 20 }
print("Expensive: \(expensive)")
▶ Exemplo: Análise de Dados de Pedidos
// ============================================
// Analyzing order data with array operations
// ============================================
let orderAmounts = [45.0, 120.0, 33.5, 299.0, 55.0, 180.0, 22.0]
// 1. Total sales
let total = orderAmounts.reduce(0, +)
print("Total sales: $\(total)")
// 2. High-value orders (>= 100)
let highValue = orderAmounts.filter { $0 >= 100 }
print("High-value orders: \(highValue.count)")
// 3. Add 10% service fee to all orders
let withServiceFee = orderAmounts.map { $0 * 1.1 }
print("First 3 with fee: \(Array(withServiceFee.prefix(3)))")
// 4. Sort
let sorted = orderAmounts.sorted(by: >)
print("Top 3: \(Array(sorted.prefix(3)))")
Saída:
TEXT 📖 Somente leituraTotal sales: $754.5 High-value orders: 3 First 3 with fee: [49.5, 132.0, 36.85] Top 3: [299.0, 180.0, 120.0]
6. Exemplo Completo: Sistema de Gerenciamento de Carrinho de Compras
// ============================================
// Shopping cart management system
// Combining array CRUD, traversal, and higher-order functions
// ============================================
import Foundation
var cartItems: [String] = []
var cartPrices: [Double] = []
func addItem(name: String, price: Double) {
cartItems.append(name)
cartPrices.append(price)
print("Added: \(name) - $\(price)")
}
func removeItem(at index: Int) {
guard index >= 0 && index < cartItems.count else {
print("Invalid index")
return
}
let removed = cartItems.remove(at: index)
cartPrices.remove(at: index)
print("Removed: \(removed)")
}
func updateQuantity(name: String, newPrice: Double) {
if let index = cartItems.firstIndex(of: name) {
cartPrices[index] = newPrice
print("Updated: \(name) -> $\(newPrice)")
}
}
func checkout() {
guard !cartItems.isEmpty else {
print("Cart is empty")
return
}
print("\n=== Shopping Cart ===")
var total = 0.0
for (i, item) in cartItems.enumerated() {
let price = cartPrices[i]
total += price
print("\(i + 1). \(item) - $\(String(format: "%.2f", price))")
}
let tax = total * 0.08
let grandTotal = total + tax
print("---")
print("Subtotal: $\(String(format: "%.2f", total))")
print("Tax (8%): $\(String(format: "%.2f", tax))")
print("Total: $\(String(format: "%.2f", grandTotal))")
let expensiveItems = cartPrices.enumerated().filter { $0.element > 100 }
if !expensiveItems.isEmpty {
print("\nHigh-value items:")
for (i, _) in expensiveItems {
print(" - \(cartItems[i])")
}
}
}
addItem(name: "Laptop", price: 999.0)
addItem(name: "Mouse", price: 25.0)
addItem(name: "Keyboard", price: 89.0)
addItem(name: "Monitor", price: 349.0)
addItem(name: "USB Hub", price: 35.0)
removeItem(at: 4)
updateQuantity(name: "Mouse", newPrice: 22.5)
checkout()
Saída:
TEXT 📖 Somente leituraAdicionado: Notebook - R$999.0 Adicionado: Mouse - R$25.0 Adicionado: Teclado - R$89.0 Adicionado: Monitor - R$349.0 Adicionado: Hub USB - R$35.0 Removido: Hub USB Atualizado: Mouse -> R$22.5 === Carrinho de Compras === 1. Notebook - R$999.00 2. Mouse - R$22.50 3. Teclado - R$89.00 4. Monitor - R$349.00 --- Subtotal: R$1459.50 Imposto (8%): R$116.76 Total: R$1576.26 Itens de alto valor: - Notebook - Monitor
❓ Perguntas Frequentes
P: O que acontece com um acesso ao array fora dos limites? R: O programa trava (erro em tempo de execução). Sempre garanta que índice < array.count antes do acesso por subscrito, ou verifique com indices.contains(indice). P: Qual é a diferença de desempenho entre append e insert? R: append é O(1) (adiciona ao final). insert é O(n) (precisa deslocar os elementos subsequentes). Para inserções frequentes no início, considere outras estruturas de dados (ex.: listas ligadas). P: Array é um tipo por valor ou tipo por referência? R: Array é um tipo por valor (struct). Atribuir a uma nova variável cria uma cópia; modificar a cópia não afeta o array original. P: Como mesclar dois arrays? R: Use o operador +:
let combinado = array1 + array2. Ou useappend(contentsOf:)para adicionar todos os elementos de outro array. P: removeAll libera memória? R:removeAll()limpa os elementos, mas mantém a capacidade. Para também liberar memória, useremoveAll(keepingCapacity: false).
📖 Resumo
- Arrays são representados como
[Tipo], podendo ser criados via literal, valor repetido ou intervalo - Operações comuns: append, insert, remove, modificação por subscrito
- Arrays são tipos por valor — a atribuição cria uma cópia
- Opções de percorrimento incluem for-in básico, enumerated indexado e filtragem com where
- reduce, map e filter tornam as operações em lote mais concisas e funcionais
- Sempre verifique os limites do índice antes de acessar elementos do array para evitar falhas
📝 Exercícios
- Iniciante: Crie um array com 5 nomes de cidades. Use for-in para imprimir "Eu amo [nome da cidade]" para cada uma, uma linha cada.
- Intermediário: Escreva um sistema de gerenciamento de notas de alunos: inicialize um array de notas [78, 92, 55, 88, 73], implemente a adição de novas notas, remoção de notas baixas (<60), cálculo da média e localização da nota mais alta.
- Desafio: Implemente um recurso simples de "recomendação de carrinho". Dado um array de carrinho ["Notebook", "Mouse", "Teclado"] e uma tabela de regras de recomendação (Notebook → Mochila para Notebook, Mouse → Mousepad, Teclado → Apoio de Pulso), gere automaticamente itens recomendados e adicione-os ao carrinho. Não adicione itens já presentes.