A Apple abandonou a tradição de mais de 20 anos de Objective-C e apresentou sua nova linguagem de programação: Swift. Após anos de desenvolvimento à portas fechadas, ela foi apresentada ao mundo prometendo mais velocidade e um longo e promissor futuro nas plataformas móveis da empresa e no OSX.
Mas, afinal, quais são as vantagens desta nova linguagem? Para que mexer em time que estava ganhando? São muitas novidades e Apple resume nos seguintes tópicos: Estabilidade, Modernidade, Poder, Interatividade, Rapidez.
Por estabilidade, isso significa que a linguagem combina segurança dos tipos com inferência, restringe acesso aos ponteiros e gerencia a memória automaticamente. Por modernidade, isso quer dizer que Swift incorpora várias funcionalidades de linguagens mais atuais, como opcionais, genéricos, tuples e mais; isso também significa que o código gerado é mais natural e fácil de ler e escrever. Quando a Apple afirma que Swift é mais poderosa que o Objective-C é por que ela consegue com códigos mais simples resultados mais expressivos; ela formata strings naturalmente e utiliza o poder de frameworks como Foundation e UIKit diretamente.
Mas um dos elementos mais interessantes do Swift é o conceito de “playgrounds”, áreas na IDE onde é possível “brincar” com o código sem a necessidade de compilação. Com esta interatividade, você pode experimentar novas tecnologias, analisar problemas e prototipar elementos visualizando os resultados como se fosse uma linguagem de script. Satisfeito com o resultado? Exporte o código do “playground” para o resto do código.
Na hora de compilar, a rapidez aparece: seu compilador aplica uma avançada análise do código e faz um ajuste fino pra você em favor da performance. Supostamente, você se preocupa em criar grandes aplicativos e o Swift dá conta da otimização sozinho.
Hello World
A sintaxe do Swift não é nenhum bicho de sete cabeças. Se você já aprendeu qualquer linguagem de programação, pular para o Swift é bastante tranquilo. Veja abaixo como fica o tradicional “Hello World”:
println("Hello, world")
Fácil, não?
A linha acima já é um programa completo. Você não precisa importar uma biblioteca separada para ela funcionar. Código escrito no escopo global é utilizado como ponto de entrada para o programa, então você não precisa de uma função main. Perceba também que você não precisa fechar a linha com um ponto e vírgula ou qualquer outra coisa.
Variáveis e Constantes
Constante, como o próprio nome já diz, é um valor que não irá mudar durante a execução do programa. Variáveis, obviamente, variam. Esse conceito não é novo, é claro. Mas no Swift você os declara usando let para criar uma constante e var para criar uma variável.
var minhaVariavel = 42 minhaVariavel = 50 let minhaConstante= 42
Perceba que alteramos o valor de minhaVariavel na segunda linha. O mesmo não pode ser feito com o valor da constante minhaConstante.
Você pode usar quase qualquer caractere que desejar para os nomes de suas constantes ou variáveis, incluindo caracteres Unicode:
Estão proibidos para nomes de constantes e variáveis somente:
- Símbolos matemáticos
- Setas
- Pontos de código Unicode privados ou inválidos
- Caracteres de desenho, como linhas e caixas.
Nomes de variáveis e constantes também não podem iniciar com números, embora números possam ser acrescentados em qualquer outro lugar dentro do nome.
Não é necessário declarar o tipo da constante ou variável, uma vez que ele é automaticamente inferido pelo compilador a partir do seu primeiro valor. Entretanto, se for necessário especificar o tipo ou não houver um valor inicial, é possível declarar o tipo logo após o nome da variável ou constante, usando a sintaxe abaixo:
let explicitDouble: Double = 70
Uma vez declarado ou inferido o tipo de uma variável ou constante, ele não pode mais ser alterado ou declarado novamente. Da mesma forma, não é possível transformar uma variável em constante ou vice-versa.
A função println imprime o valor da variável ou da constante na tela. Para inserir o valor dentro de uma string, escreva o nome da variável ou constante em parênteses, com uma “\” (contra-barra) antes.
let laranjas= 3 let bananas= 5 let listaLaranjas= "Eu tenho \(laranjas) laranjas." let listaFrutas= "Eu tenho \(laranjas + bananas) frutas."
Loops e Fluxo
Swift traz todo o arsenal tradicional de controles de fluxo das linguagens derivadas de C e similares. Se você conhece C, C++, ASP, PHP e até mesmo Javascript, então já está familiarizado com o uso de for e while para realizar loops que executam uma determinada ação múltiplas vezes e o uso de if e switch para executar diferentes caminhos de código de acordo com determinadas condições, assim como o uso de break e continue para interromper o fluxo ou transferir para outro ponto do código.
for var i= 0; i<3; ++i{ println("o número é \(i)") } //o número é 0 //o número é 1 //o número é 2
Outro exemplo, com condicionais:
let valoresnoArray= [75, 43, 103, 87, 12] var pontos = 0 for i in valoresnoArray { if i > 50 { pontos += 3 } else { pontos += 1 } }
Como vimos no segundo exemplo, além da tradicional combinação de for-condição-incremento, Swift adiciona o for-in, um loop que facilita o processo de iterar arrays, dicionários, limites, strings e outras sequências.
Em Swift também o sistema de switch é mais poderoso que o Objective-C anterior. Os casos de fluxo que usam esse construto não passam direto para o próximo caso em Swift, evitando assim erros comuns de C provocados pelo esquecimento de uma declaração de break. Casos podem combinar diferentes tipos de padrão, incluindo tuples e tipos especificos. Valores que casam em um caso de switch podem ser atados a constantes temporárias ou variáveis para uso dentro do corpo do fluxo a condições de ativação complexas podem ser expressas com um cláusula where para cada caso.
let vegetal= pimenta malagueta" switch vegetal { case "batata": let textodoVegetal = "Perfeita para um purê." case "alface", "tomate": let textodoVegetal = "Ingrediente de sanduíche." case let x where x.hasSuffix("malagueta"): let textodoVegetal = "Esta é a picante \(x)!" default: let textodoVegetal = "Opção saudável de refeição." } println("A mensagem é: \(textodoVegetal)") // A mensagem é: Esta é a picante pimenta malagueta
Após a execução do código dentro do caso do switch que casa com sucesso, o programa sai do fluxo: a execução não continua para o próximo caso. Logo, não há a necessidade de explicitamente inserir um break no final de cada caso.