Back-End

24 out, 2014

Falando sobre Swift – Funções

100 visualizações
Publicidade

Nesta nova série, vamos estudar a nova linguagem de programação da Apple, a Swift. Não é necessária nenhuma experiência anterior em tecnologias Apple, mas é preciso ter o mais recente Mac OSX e Xcode 6.0.1 ou superior instalados para conseguir acompanhar.

Confira o artigo anterior neste link.

Definindo funções

Swift é uma linguagem orientada a objetos construída com base em Objective-C e C++, mas também mistura técnicas de funções e programação funcional. É um pouco como Scala, mas Swift vai ser um sucesso real.

Na Swift, as funções podem ser criadas e atribuídas a variáveis, da mesma forma que acontece com JavaScript. Porém, diferentemente de JS, Swift usa a palavra-chave func para introduzir uma função.

$ swift
Welcome to Swift!  Type :help for assistance.
  1> func helloWorld() {
  2.     println("Hello World")
  3. }
  4> helloWorld()
Hello World

Assim como em outras linguagens, as variáveis definidas dentro de um bloco de uma função terão o mesmo tempo de vida da função daquela função:

  5> func helloWorld() {
  6.     let name = "World"
  7.     println("Hello \(name)")
  8. }
  9> helloWorld()
Hello World
 10> name
error: use of unresolved identifier 'name'

Swift tem argumentos posicionais (positional), nomeados (named) e padrão (default). Eles são especificados entre parênteses e com vírgulas para separar. Diferentemente das variáveis (que usam inferência de tipo para determinar qual é o tipo correto), argumentos de função devem ser tipados.

 11> func hello(name:String) {
 12.     println("Hello, \(name)")
 13. }
 14> hello("World")
Hello, World

Argumentos padrão (default) podem ser declarados ao se colocar um valor padrão depois:

 15> func greet(name:String, greeting:String = "Hello") {
 16.     println("\(greeting), \(name)")
 17. }
 18> greet("World")
Hello, World
 19> greet("World", "Hi")
error: missing argument label 'greeting:' in call

Esse erro ocorre porque argumentos padrão são, implicitamente, argumentos nomeados. Um argumento nomeado é aquele que deve ser chamado por um nome em vez de por sua posição. Nomes são especificados com o mesmo rótulo da função nome:

 20> greet("World", greeting:"Hi")
Hi, World

No entanto, argumentos nomeados não precisam ter um valor padrão. Eles podem ser declarados como argumentos nomeados ao se colocar o rótulo na frente do argumento. Argumentos nomeados geralmente possuem um “nome externo”, que é o nome que os callers devem usar para suprir a função, e um “nome interno” que é usado na implementação do corpo em si. Isso permite que as funções sejam refatoradas sem afetar a API:

 21> func greet(name:String, greeting salutation:String = "Hi") {
 22.     println("\(salutation), \(name)")
 23. }
 24> greet("World", greeting:"Yello")
Yello, World

Como um atalho especial, é possível declarar que um argumento pode ser nomeado com o mesmo nome que um argumento nomeado, usando o símbolo #.

 25> func greet(#name:String, #greeting:String) {
 26.     println("\(greeting), \(name)")
 27. }
 28> greet(name:"World", greeting:"Hello")

Observe que, apesar de os argumentos serem nomeados, eles têm uma ordem implícita. Não é possível descartar os argumentos ou reordená-los, como se faz em outra linguagem com argumentos nomeados:

 29> greet(greeting:"Hello", name:"World")
error: argument 'name' must precede argument 'greeting'
greet(greeting:"Hello", name:"World")
      ~~~~~~~~~~~~~~~~  ^    ~~~~~~~

Nota: O report de erros no Swift é realmente muito bom. Os gráficos ASCII no final destacam expressões errôneas (o pedaço em parênteses) e o caractere (^) mostra onde o erro foi encontrado. Isso é especialmente útil no REPL, onde não há um código-fonte definido ou linhas numeradas.

Argumentos nomeados são um retorno a Objective-C, e permitem que a Swift interopere com classes Objective-C (veremos sobre isso em artigos futuros). Em alguns poucos casos, eles podem fazer uma API mais clara, mas em muitos casos adicionam ruído extra onde não é necessário.

Por fim, tipos e valores de retorno. Assim como em outras linguagens, a palavra-chave return é usada para retornar de uma função e passar de volta um valor. Assim como acontece com argumentos, o tipo de retorno da função deve ser especificado (o padrão é não ter tipo de retorno se não houver a especificação), exceto se em vez de usar o :syntax, ele inventar um news -> syntax. Esse é um dos muitos contratempos da linguagem, onde não há consistência porque ainda não foi escrito código suficiente para esses casos específicos.

 29> func add(i:Int, j:Int) -> Int {
 30.     return i+j
 31. }
 32> add(1,2)
$R0: Int = 3

No próximo artigo, veremos como criar classes na Swift. Até lá.

***

Artigo traduzido pela Redação iMasters com autorização do autor. Publicado originalmente em http://alblue.bandlem.com/2014/09/swift-functions-overview.html