Introdução ao Swift

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:

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.

Queremos saber sua opinião