Introdução à Programação Funcional em Swift
Swift é uma linguagem de programação multiparadigma, desenvolvida pela Apple para criar aplicativos para iOS, macOS, watchOS e tvOS. Além das abordagens orientada a objetos e orientada a protocolos, Swift suporta ativamente a programação funcional. Este estilo é baseado no uso de funções puras, imutabilidade de dados e na eliminação de efeitos colaterais.
A programação funcional torna o código mais previsível, testável e seguro para paralelismo. Neste artigo, vamos explorar os conceitos-chave da abordagem funcional em Swift: imutabilidade, funções de ordem superior, closures e encadeamento de métodos. Você verá como usar map, filter e reduce para escrever código conciso e expressivo.
Fundamentos da Abordagem Funcional em Swift
Imutabilidade
Na programação funcional, os dados não são alterados após a criação. Em vez de modificar um objeto existente, cria-se um novo. Swift incentiva essa abordagem com a palavra-chave let para declarar constantes.
// Valor imutávellet numbers = [1, 2, 3, 4, 5]// numbers.append(6) // Erro de compilação — numbers é imutável
// Criando um novo arraylet newNumbers = numbers + [6]print(newNumbers) // [1, 2, 3, 4, 5, 6]Usar let em vez de var ajuda a evitar alterações acidentais de estado e simplifica a depuração.
Funções como Cidadãos de Primeira Classe
Em Swift, funções são cidadãos de primeira classe. Elas podem ser atribuídas a variáveis, passadas como argumentos e retornadas de outras funções.
// Função atribuída a uma variávellet multiply: (Int, Int) -> Int = { $0 * $1 }print(multiply(3, 4)) // 12
// Função que recebe outra funçãofunc applyOperation(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int { return operation(a, b)}
let result = applyOperation(10, 5, operation: multiply)print(result) // 50Closures em Swift
Closures são blocos de funcionalidade autossuficientes que podem capturar e armazenar referências a variáveis do contexto circundante. Em Swift, closures são amplamente usadas para callbacks e transformações funcionais.
// Closure simpleslet greeting = { (name: String) -> String in return "Olá, \\(name)!"}print(greeting("Mundo")) // Olá, Mundo!
// Forma abreviada com parâmetroslet numbers = [3, 1, 4, 1, 5, 9]let sorted = numbers.sorted { $0 < $1 }print(sorted) // [1, 1, 3, 4, 5, 9]Closures tornam o código compacto e expressivo, especialmente ao trabalhar com coleções.
Funções de Ordem Superior: map, filter, reduce
Estes são os três pilares da programação funcional em Swift. Eles permitem processar arrays, dicionários e outras coleções sem loops explícitos.
map — Transformando cada elemento
O método map aplica um closure a cada elemento da coleção e retorna um novo array com os resultados.
let prices = [100, 200, 300, 400]let discounted = prices.map { $0 * 0.9 }print(discounted) // [90.0, 180.0, 270.0, 360.0]
// Trabalhando com stringslet names = ["Ana", "Boris", "Vitor"]let uppercased = names.map { $0.uppercased() }print(uppercased) // ["ANA", "BORIS", "VITOR"]filter — Selecionando por condição
filter retorna um novo array contendo apenas os elementos que satisfazem uma condição dada.
let scores = [45, 78, 92, 33, 88, 61]let passingScores = scores.filter { $0 >= 60 }print(passingScores) // [78, 92, 88, 61]
// Filtrando stringslet words = ["Swift", "iOS", "macOS", "função"]let shortWords = words.filter { $0.count <= 4 }print(shortWords) // ["iOS", "macOS"]