Funções

Funções são sub-rotinas que resolvem – ou deveriam resolver 😂 – um problema específico e podem ser reutilizadas sem a necessidade de reescrever sua lógica ou duplicar o código nela contido.

Para criar uma função, basta utilizar a palavra reservada func, seguida de uma declaração chave que será utilizada na sua chamada, parênteses para receber os parâmetros – caso possua – e um bloco de código entre chaves.

func nomeDaFunção([parametro: tipo do parâmetro, ... ]) [-> tipo de retorno] {
    [return dado]
}

Exemplo

// Declaração da função
func digaBomDia() {
    print("Bom dia!")
}

// Utilização da função
digaBomDia()
// => Bom dia!

Parâmetros e Retornos

Funções também podem receber parâmetros e retornar valores. Parâmetros são valores que passamos para serem processados dentro da função e que podem ser pré-definidos em sua criação. Retorno é o valor que nossa função retorna para fora do contexto da função depois de executar o processamento.

// Criação de uma função com parâmetro do tipo String e retorno do tipo String
func bomDia(nome: String) -> String {
    let textoRetorno =  "Bom dia, \(nome)"
    return textoRetorno
}

bomDia(nome: "Roberto")
// => Bom dia, Roberto



// Função que recebe um parâmetro, ou usa o valor pré-definido (default)
func adeus(nome: String = "Joaquina") {
    print("Adeus, \(nome) 😭")
}

adeus() // => Adeus, Joaquina 😭
// ou
adeus(nome: "Josefina") // => Adeus, Josefina 😭

Podemos adicionar um rótulo ao parâmetro para facilitar a utilização e entendimento de uma função, permitindo uma leitura mais fluída e humana no momento da sua utilização. Também podemos omitir o rótulo utilizando _.

// Explicitando um rótulo
func totalDeLetras(daPalavra palavra: String) -> Int {
    return palavra.count
}
// Note que por padrão o rótulo é sempre o mesmo que o parâmetro, somente é
// necessário explicitá-lo caso queira que seja diferente.

totalDeLetras(daPalavra: "Lhama")
// => 5


// Omitindo o rótulo
func multiplicarDoisInteiros(_ a: Int, _ b: Int){
    print("Resultado: \(a * b)")
}

multiplicarDoisInteiros(10, 20)
// => Resultado: 200

Escopo de uma função

Variáveis e constantes declaradas dentro do escopo da função não podem ser acessadas fora dele. Elas se limitam ao contexto da função e são criadas e acessadas apenas dentro dele.

O mesmo ocorre com variáveis que estão fora desse escopo: Por padrão, seus valores não são alterados se forem utilizados como parâmetro de entrada, porém é possível alterar valores de variáveis externas ao escopo de função recebidas como parâmetro através da palavra reservada inout antes da declaração do tipo do parâmetro.

// Trocando os valores dos nomes passados como parâmetro fora do escopo da função
func trocaDeNomes(nome: inout String, outroNome: inout String){
    let tempNome = nome
    nome = outroNome
    outroNome = tempNome
}

var meuNome = "Leandro"
var seuNome = "Marcos"
trocaDeNomes(nome: &meuNome, outroNome: &seuNome)

meuNome // => Marcos
seuNome // => Leandro

Nota: use o inout com extrema cautela e somente em último caso, existem inúmeras opções melhores para resolver seu problema.

Tem mais ?

Sempre! Funções é um assunto amplo e está cada vez mais presente no dia a dia do desenvolvedor e nos fóruns por conta da programação funcional. É exatamente por isso que sempre recomendamos você dar uma olhada na documentação oficial para aprender ainda mais detalhes deste recurso essencial.

Até a próxima >}

DropsLeandro Cissotofunções, func