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