Advertisement
  1. Code
  2. Swift
Code

Introdução à Swift: Parte 1

by
Difficulty:BeginnerLength:LongLanguages:

Portuguese (Português) translation by Erick Patrick (you can also view the original English article)

Na WWDC 2014, a Apple apresentou uma das maiores atualizações do iOs desde 2008, se tratando de desenvolvedor. Eles introduziram o HomeKit, HealthKit, CloudKit e Extensions, só para citar alguns. Mas a grande surpresa de lá foi a apresentação de uma nova linguagem de programação, Swift.

Swift é uma linguagem de programação maravilhosa, criada do zero para ser eficiente e segura. Ela usa as mesmas APIs que o Objective-C. Ou seja, é possível no Objective-C, também é na Swift. Ela tambpem introduz novos conceitos que programadores de longa data apreciarão e alguns outros que cobriremos nessa apresentação.

Nessa série, assumiremos a familiaridade com Objective-C. No primeiro artigo da série, falaremos sobre a filosofia da Swift, sua estrutura de arquivos e sintaxe. No segundo, mostraremos aspectos mais avançandos da sintaxe, como opcionais e administração de memória. Segure-se na cadeira, será algo único.

1. Filosifia

Para entender melhor a Swift, Apple tem condicionado-nos com aprimoramentos estruturas na Objective-C pelos anos. Aprimoramentos como blocos de código, vetores literais e definições de dicionários, e ARC (Contagem Automática de Referência) são algumas das coisas que Apple adicionou ao Objective-C que facilita a transição para Swift.

Um pilar da filosifia da Swift é sua inicialização de código. Todos os objetos e variáveis, quando definidos na Swift devem ser inicializados no código. Um objeto ou variável não inicializada resultará em erro de compilação na Swift. Isso garante que sempre terão um valor. Há um caso especial em que não se dá para definir valor inicial. Nesse caso, nossa variável é chamada de opcional. Cobriremos opcionais na segunda parte da série.

Outro pilar importante é completude de decisão. Todos os condicionais, sejam if ou switch/case, devem cobrir todas condições. Assim, nenhum código passa implicitamente sem cobertura. Perder uma condição gerará um erro de compilação.

Um último elemento da filosofia da Swift é sua preferência por constantes sobre variáveis. Swift define variáveis e constantes dessa forma:

No exemplo acima, let é usado para definir uma constante enquanto var para uma variável. Ao tornar a definição de constantes tão fácil, a Apple encoraja seu uso sempre que possível. Isso leva a código mais seguro em ambiente multitarefa e melhores otimizações de código já que o compilador saberá que o valor de uma constante não mudará.

Porém, há muito mais que apenas aprimoramentos de sintaxe e formatação na Swift. Ela foi criada do zero para solucionar problemas comuns da C/C++ e inerentemente da Objective-C. Problemas como:

  • índices além dos limites em vetores
  • dados não inicializados
  • tipos de retornos não verificados
  • acesso a ponteiro não checado
  • passagem implicita
  • erros com goto

Por programar para iOS e Android, sabemos que é muito mais legal programar para iOS usando Cocoa e UIKit. Essa série mostrar como é mais legal ainda programar adicionando Swift à mistura.

2. Estrutura de Arquivos

Em Objective-C, temos arquivos de cabeçalho (.h) e implementação (.m) Isso é algo que Objective-C herdou da C.

Em Swift, uma classe é definida em um único arquivo (.swift) que inclui todas as definições e implementações dela. Isso é reminiscente de linguagens como Java e C#.

Foi-se o tempo de criar arquivo de cabeçalho e adicionar #IFNDEF no começo deles.

3. Sintaxe

A primeira coisa que notamos da Swift é o sumiço do ponto-e-vírgula ao final das declarações. Nela, cada linha é considerada uma declaração e não temos de adicioná-los ao final de cada linha.

Enfatizamos o ter, porque nada impede de adicionarmo-nos ao final das declarações. Continuaremos adicionando ponto-e-virgulas ao final de cada declaração já que eles aumentam a legibilidade. Também é difícil deixar de adicioná-los uma vez que desenvolvedores Cocoa temos feito isso há anos.

Outra mudança importante na Swift é que chaves são obrigatórias para declarações if. Nada mais de bugs como o Heartbleed.

Sintaxe é um assunto complexo de escrever. Swift tem várias sutilezas que pode levar muito tempo para se falarmos, e esse não é o objetivo do artigo. Por brevidade, concentraremos nas mudanças que um programador de Objective-C notaria.

4. Similaridades com Objective-C

Começaremos mostrando três trechos de código para ilustrar algumas semelhantes com Objective-C. Isso ajudará a entender a linguagem.

Programadores de Objective-C acharão que Swift tem as mesmas declarações de decisão e iteração, como if/else e switch, laços for e for..in.

Swift inclui dois operadores de alcance ..< e ... para especificar um série de valores. No laço for acima, usamos o operador de alcance semi-fechado ..< para especificar uma série de valores que incluem o 1, 2, 3 e 4, mas exclui o 5. O outro operador de alcance é o operador de série fechada, .... Ele especifica uma série de valores que inclui os valores de ambos os lados do operador de alcance fechado. Por exemplo, 1...5 especifica série de valores de 1 a 5, incluindo.

5. Definindo Variáveis e Constantes

Revisitemos o exemplo de mais cedo.

Na Swift, definimos constantes usando let e variável usando var. O dois-pontos, :, é um marcador que define tipos. No exemplo acima, criamos uma constante e uma variável do tipo String.

Também as inicializamos com uma cadeia de caracteres. Em Swift, cadeias de caracteres são definidas da mesma forma que em C, sem o símbolo @ precedindo-as.

Objective-C é uma linguagem fortemente tipada, significando que o tipo de uma variável ou parâmetro deve ser especificado. Swift também é fortemente tipada, mas é um pouco mais esperta já que o compilador deduzirá o tipo da variável. Ele também garantirá que não haverá conversão errada de variáveis sem nosso conhecimento e intervenção.

Se reescrevermos o exemplo acima deixando a dedução de tipo agir, o código parecerá com isso:

Muito melhor e o código muito mais limpo. O compilador é esperto o suficiente para entender que someInt é um Int e someFloat um Double.

6. Cadeias de Caracteres

Uma forma de saber o potencial de uma linguagem é explorando sua manipulação de cadeia de caracteres. Objective-C tem muitas funções e recursos que lidam com isso, melhor que muitas linguagens, mas tendem a ser bem verbosas e confusas de vez em quando.

Comecemos mostrando Objective-C. Para concatenar duas cadeias de caracteres em Objective-C, fazemos o seguinte:

Em Swift, anexamos uma cadeia a outra usando o operador +. Simples assim.

Em Swift, cadeias de caracteres são Unicode, ou seja, permitem:

Podemos iterar caracteres de uma cadeia de caracteres usando for...in como nos exemplos. Podemos usar o laço for...in para iterar cadeias Unicodes também. Não é legal?!

Uma última coisa sobre cadeias de caracteres antes de continuar é a interpolação. Na Objective-C, se quisermos retornar uma cadeia com variáveis, invocamos [NSString stringWithFormt:]. Na Swift, variáveis são embutíveis. Vejamos o exemplo a seguir.

Para usar interpolação, envolvemos a variável ou chamada de função em parênteses e colocamos barra invertida no começo, \(expressão).

7. Vetores & Dicionários

Array & Dictionary

Como programadores de Objective-C, já somos familiares a vetores e dicionários. Swift também possui classes de coleções e adiciona alguns recursos extras a elas.

Como usamos coleções na Swift? Lá, elas são chamadas de Array e Dictionary. Declarar um vetor em Swift é semelhante a declarar um vetor literal em Objective-C, usando colchetes, [], mas sem o símbolo @ antes deles.

O mesmo vale para dicionários. Contudo, ao invés de usar chaves, usamos colchetes.

Mutabilidade

Se um objeto Array é equivalente ao objeto NSArray e o Dictionary é equivalente ao NSDictionary, então, como criamos vetores e dicionários mutáveis em Swift?

A resposta é simples, delcaramos o objeto como variável. Em outras palavras, o exemplo anterior de someArray equivale a instância de NSArray e someOtherArray a uma instância de NSMutableArray. Isso se aplica a dicionários também. No exemplo anterior, someDictionary equivale a NSDictionary e someOtherDictionary a NSMutableDictionary. Não é legal?!

Enquanto vetores e dicionários da Objective-C só podem conter objetos, na Swift, coleções podem conter objetos e tipos de dados primitivos, como inteiros e pontos flutuantes. Outra diferença em relação a Objective-C é que coleção em Swift são tipadas, explicitamente ou pela dedução em tempo de compilação. Ao especificar o tipo dos objetos da coleção, Swift adiciona mais segurança a elas.

Embora possamos omitir o tipo da variável ao declará-la, não altera o fato que o compilador atribuirá tipos aos objetos da coleção. Usar înferência de tipo ajuda a manter o código legível e leve.

Podemos redeclarar uma Array e Dictionary como declarado antes, assim:

O compilador inspecionará as coleções durante as inicializações e deduzirá o tipo correto. Em outras palavras, ele entende que someArray e someOtherArray são coleções de String e someDictionary e someOtherDictionary são dicionários com chave String e valores Int.

Manipulação de Coleção

Adicionar um objeto ou outro vetor a um vetor é bem similar a concatenação de cadeias de caracteres, usando o operador +.

Manipulação de dicionários é tão simples quanto.

Coleções Tipadas

Mais cedo, mencionamos que coleção em Swift são tipadas. Mas o que isso significa? Se definirmos uma coleção que contém String, podemos adicionar apenas String à coleção. Falhando nisso resultará em um erro.

Vejamos um exemplo para esclarecer. Definimos uma coleção de Car. O código abaixo mostra a definição da classe Car e um vetor mutável cars, contendo três instâncias de Car.

Pos trás dos panos, o compilador deduzirá o tipo do vetor. Se quisermos adicionar um novo Car à coleção, podemos apenas usar o operador + como visto abaixo.

Contudo, adicionar um objeto de outro tipo resultará em um erro.

Isso trás a vantagem de segurança de tipos ao buscar objetos de coleções. Também elimina a necessidade da conversão de coleções antes de usá-las.

Em nosso exemplo, um objeto Car tem um método accelerate. Como a coleção é tipada, podemos pegar um item do vetor e imediatamente invocar o método do objeto, em uma linha de código. Não precisamos nos preocupar com o tipo do elemento já que a coleção apenas contém objetos Car.

Para conseguir o mesmo em Objective-C, com o mesmo nível de segurança, precisaríamos do seguinte:

Por fim, para iterar um vetor, usamos o laöo for...in:

Para iterarar sobre um dicionário, também usamos o for...in:

Como podemos ver, coleções tipadas são um poderoso recurso da Swift.

Conclusão

Já aprendemos bastante sobre Swift, então é bom tirar um tempo para digerir tudo. Recomendamos baixar o Xcode 6 o mais rápido possível e começar a aplicar o que foir aprendido nesse artigo no novo recurso do Xcode, Playground. Playground permite brincarmos com Swift em tempo real.

E é isso por hoje. Nos próximos artigos da série, veremos tuplas, funções closures, classes e por último, mas não menos importante, optionals. Também aprendemos como administração de memória funciona na Swift. Fique ligado!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.