Quaddro + MacMagazine: Swift na prática #6 — Funções

por Leandro Cissoto

Publicidade

Após uma semana de hiato devido ao MM Tour, trazemos hoje mais um artigo sobre Swift na parceria Quaddro + MacMagazine! Hoje vamos falar sobre as famosas funções, muito utilizadas para nos ajudar a reutilizar o código e componentizá-lo para uma manutenção mais organizada e eficiente.

Ícone da Swift

Lembrando que, para testar os conceitos aqui apresentados, recomendamos o uso do Xcode 6 ou superior. Se você não possui um Mac ou não quer instalar o Xcode, é possível utilizar uma ferramenta online que permite escrever em Swift diretamente pelo navegador.

Publicidade

Ícone do app Xcode

Xcode

de Apple

Compatível com Macs
Versão 11.6 (8.1 GB)
Requer o macOS 10.15.2 ou superior

A teoria

Durante o desenvolvimento de uma aplicação, muitas vezes temos que executar uma mesma funcionalidade diversas vezes, e isso pode ser feito de diversas formas. Você pode gostar de digitar, por exemplo, e escrever todas as vezes o mesmo bloco de código sempre que quiser executar a tal funcionalidade, mas certamente conforme sua aplicação for crescendo, você vai começar a se questionar se você está fazendo isso certo. Não que no mundo do desenvolvimento possamos acusar entre o certo e o errado, mas felizmente, meu caro amigo programador, existe uma solução na Swift e na maioria das linguagens de programação para isso. E o nome dessa solução são as nossas queridas funções.

Funções são rotinas que executam uma determinada funcionalidade, e podem ser chamadas diversas vezes no código. Isso faz com que nosso código fique mais organizado e tenha uma melhor reutilização. Na Swift, utilizamos o nome reservado func para declararmos uma nova função, como podemos ver no exemplo abaixo.

func imprimirNaTela() {
    println("Quaddro + MacMagazine ensinando Swift")
}

Vamos analisar a função acima: começamos com a palavra reservada func que é utilizada para declararmos a função. Em seguida declaramos o nome da nossa função, que usaremos quando quisermos chamá-la, seguido dos parênteses. Por último, o escopo da nossa função entre as chaves.

Publicidade

Toda vez que quisermos utilizar nossa função, a chamamos pelo nome, seguido dos parênteses, como o exemplo abaixo:

imprimirNaTela()

Resultado:

Quaddro + MacMagazine ensinando Swift

FUNÇÕES COM PARÂMETROS

Publicidade

Funções também podem receber parâmetros e retornar valores. Podemos dizer que parâmetros são valores que passamos para dentro de nossa função para serem processados, e retorno é o valor que nossa função retorna de dentro dela para a aplicação principal.

A estrutura fica assim:

func nome da função( [parametro: tipo de retorno ,...] ) [-> tipo de retorno]{
	return Dado
}

Uma função com retorno deve ter a palavra reservada return e devolver um elemento com o mesmo tipo de dado declarado em sua criação.

No exemplo abaixo, vamos declarar uma função que receberá um valor do tipo String, irá concatenar — lembram? — este valor com outra String, e retornará um valor do mesmo tipo:

func retornaTexto(texto: String)-> String {
    let textoRetorno = texto + "Fim"    
    return textoRetorno    
}

retornaTexto("Ola mundo. Estou aprendendo Swift.")

Resultado:

Ola mundo. Estou aprendendo Swift.Fim

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

OUTRAS FORMAS DE DECLARARMOS PARÂMETROS

Podemos escrever uma pequena expressão para facilitar o entendimento do funcionamento da função e conduzir o programador:

func minhaFuncao(queUsa parametro: String){
    println(parametro)
}

minhaFuncao(queUsa: "Ola mundo")

Isso torna a leitura da função bem mais prazerosa, pois a expressão pode conduzir o programador sobre como a função funciona.

FUNÇÕES DE SISTEMA

A Swift possui em sua estrutura dezenas funções internas chamadas de “built-in”, que podem ser utilizadas para resolver uma grande quantidade de situações frequentes, facilitando ainda mais a vida do desenvolvedor.

Vamos algumas funções que podem ser úteis no dia-a-dia do desenvolvimento com Swift:

min()
Função utilizada para retornar o menor valor em uma sequência de números.

Exemplo:

var menor = min(1000,7,3171,3080)
println("Menor Valor: \(menor)")

max()
Função utilizada para retornar o maior valor em uma sequência de números.

Exemplo:

var maior = max(1000,7,3171,3080)
println("Maior Valor: \(maior)")

sort()
Utilizamos esta função para ordenar coleções.

Exemplo:

var numeros = [10,5,7,2,3,9,1]
sort(&numeros)
println(numeros)

Nota: algumas funções, como a sort(), usam ponteiros — muito conhecidos para quem programa em C. Não entraremos em detalhes sobre ponteiros aqui, mas recomendo este artigo sobre o assunto.

abs()
Função utilizada para retornar o valor absoluto de um número.

Exemplo:

abs(-1)
abs(-2014) == 2014

dump()
Exibe o conteúdo de um array de forma detalhada e em formato de árvore.

Exemplo:

let linguagens = ["Objective-C", "Swift", "C", "PHP", "Python"]
dump(linguagens)

join()
Função utilizada para adicionar um elemento/separador/caractere entres os elementos de uma coleção.

Exemplo:

let operacoes = ["soma", "divisão", "multiplicação", "divisão", "resto"]
var operacoesJuntas = join("-", operacoes)
println("Operações juntas \(operacoesJuntas)")

Nota: fiquem atentos às novas funções e funcionalidades da Swift 2, que até a data de publicação deste artigo ainda não saiu oficialmente. Muitas funções podem deixar de existir com a nova versão.

Exercício guiado

O básico para começarmos a brincar com funções no nosso playground, vamos ver como utilizá-las em um exercício guiado.

  1. Crie um novo playground e limpe o seu conteúdo.

Aprendendo Swift com a Quaddro

  1. Vamos começar criando uma função chamada “soma”. Esta receberá dois números inteiros como parâmetros, retornando também um inteiro. Já vamos aproveitar e testar nossa função com alguns valores. Percebam que utilizei uma expressão entre os parâmetros para ficar ainda mais fácil de ler.
func somar(num: Int, com num2:Int)->Int{
    return num + num2
}

somar(2, com: 5)
somar(4, com: 1)
somar(1231, com: 49852)

No playground, fica assim:

Aprendendo Swift com a Quaddro

  1. Vamos aproveitar e criar outras funções. Vamos acrescentar subtração, divisão e multiplicação.
//Função de soma
func somar(num: Int, com num2:Int)->Int{
    return num + num2
}

//Função de subtração
func subtrair(num: Int, com num2:Int)->Int{
    return num - num2
}

//Função de multiplicação
func multiplicar(num: Int, com num2:Int)->Int{
    return num * num2
}

//Função de divisão
func dividir(num: Int, com num2:Int)->Int{
    return num / num2
}

//Testando tudo
somar(10, com: 5)
subtrair(20, com: 2)
multiplicar(10, com: 10)
dividir(40, com: 2)

No playground, fica assim:

Aprendendo Swift com a Quaddro

  1. Ok, temos algumas funções que podem realizar operações matemáticas. Mas não seria sensacional se pudermos controlar de maneira inteligente a forma como essas funções são chamadas?
    Que tal criarmos uma função chamada “calculadora”, que irá receber dois valores inteiros e um char contendo um operador para facilitar a nossa vida?! Vamos lá, então.
//Função calculadora, que reúne todas as outras
func calculadora(num1:Int, com num2:Int, usandoOperador operador:Character)->Int{
    
//Crio uma variável para receber o resultado
var result: Int = Int()
    
//Analiso o operador para executar a operação correta
switch(operador){
    case "+": result = somar(num1, com: num2)
    case "-": result = subtrair(num1, com: num2)
    case "*": result = multiplicar(num1, com: num2)
    case "/": result = dividir(num1, com: num2)
    default: result = 0
}
    
//Retorno o resultado
return result
}

//Testando nossa calculadora
calculadora(10, com: 5, usandoOperador: "-")
calculadora(20, com: 20, usandoOperador: "+")
calculadora(40, com: 6, usandoOperador: "*")
calculadora(30, com: 3, usandoOperador: "/")
calculadora(350, com: 100, usandoOperador: "u")

Perceba que utilizamos o condicional switch para verificarmos o operador para chamar a função adequada, o valor default do switch retorna 0 caso o usuário entre com um char que não consta na nossa lista de operadores.

O código ficou assim:

Aprendendo Swift com a Quaddro

  1. Vamos criar uma função que transforma uma String em um array de Characters.
//Função
func stringEmArray(texto:String)->Array<Character>{
    
//Criamos um array
var array = Array<Character>()

//Adicionamos o char extraido do texto no array
for char in texto{
    array.append(char)
}
    
//Retornamos o array
return array
}

var meusChars = stringEmArray("Gervásio")

//Pegamos a primeira posição do array
meusChars[0]

//Pegamos a última posição
meusChars[meusChars.count-1]

Nosso código está assim:

Aprendendo Swift com a Quaddro

Chega de moleza! Vamos para o nosso desafio.

Desafio String reversa

Objetivo: criar uma função que recebe uma String como parâmetro e retorna esta mesma String invertida.

Dicas:

  • Utilize for in para percorrer a String, como no exercício guiado.
  • Utilize a função join() para ajudar a concatenar os itens.

·   ·   ·

Lembramos que todos os desafios podem ser enviados para mm@quaddro.com.br. Todos os desafios enviados serão respondidos pela equipe da Quaddro. Os códigos-fonte, tanto do exercício guiado quanto dos desafios, podem ser encontrados no nosso GitHub.

Na semana que vem vamos nos aprofundar ainda mais em funções, com as closures. Não vai perder, né?! Até.

Posts relacionados

Comentários

Carregando os comentários…