Por que eu devo ler este artigo:Neste artigo desenvolveremos um aplicativo que faz uso dos recursos de mapas e pontos de interesse baseado em coordenadas GPS. Para isso, utilizaremos alguns recursos da linguagem necessários para aprofundamento nas especificidades da plataforma de desenvolvimento, bem como a integração entre Swift e o Objective-C. Por se tratar de uma linguagem nova, analisaremos ela com mais cuidado de forma a transmitir as principais novidades que ela traz para os desenvolvedores.

Após sua saída compulsória da Apple, Steve Jobs fundou em 1985 a NeXT, que desenvolveu e fabricou computadores visando o mercado acadêmico e comercial. A produção e venda dos equipamentos foi relativamente limitada, mas o sistema operacional dos computadores NeXT, – o NeXTstep – era completamente inovador, tanto em termos gráficos, quanto em sua arquitetura interna, casando com o design externo arrojado do computador.

Embutido, o ambiente de desenvolvimento OpenStep orientado a objetos foi a base para muitas tecnologias que ainda estariam por vir. Naturalmente, a companhia abandonou o mercado de hardware para focar suas energias na implementação do OpenStep, e tecnologias de software, como o WebObjects, um dos primeiros frameworks de aplicações web. Em 1996, a Apple adquiriu a NeXT e como parte do acordo, Steve Jobs retornou à Apple, cuja companhia ele fundou em 1976, e pretendia combinar o software produzido pela NeXT com a plataforma de hardware da Apple.

Com isso, foi formada a Foundation Kit, uma framework Objective-C na especificação OpenStep, a qual usa o prefixo NS (NeXTstep) em toda arquitetura interna (em nomes de classes, bibliotecas, tipos, etc.) deste ambiente de desenvolvimento, o qual deu origem à linguagem de programação Objective-C, o predecessor do Swift, que também herdou a mesma arquitetura.

O Swift foi projetado por Chris Lattner, que contou com apoio dos demais desenvolvedores da Apple, para desenvolver uma linguagem de programação baseada nos melhores conceitos de linguagens como Objective-C e C, porém também adotando abordagens de linguagens como Rust, Haskell, Ruby, Python, C#, CLU, entre muitas outras.

Assim, temos um ambiente de desenvolvimento composto de múltiplos paradigmas, projetado para trabalhar com os frameworks Cocoa e CocoaTouch e a vasta imensidão de códigos Objective-C dos produtos da Apple. Utilizando o Xcode 6 e seu compilador LLVM, podemos usar códigos Objective-C, C++ e Swift em um único programa, que pode ser projetado tanto para iOS quanto para o OSX.

A linguagem não possui garbage collector e seu gerenciamento de memória é feito em tempo de compilação (ARC). Ela não trabalha com ponteiros. As classes em Swift são definidas em arquivos com extensão .swift e, opcionalmente, possuem uma interface gráfica ".xib". A classe principal em um aplicativo escrito em Swift é a AppDelegate, a qual possuirá um atributo @UIApplicationMain previamente à declaração da classe, similar às Annotations do Java. Esta classe é responsável por todo o ciclo de vida do aplicativo bem como por prover a janela (objeto Window) aonde os objetos serão renderizados.

Particularidades de destaque

Swift possui uma sintaxe muito similar a C e Objective-C no que diz respeito ao controle de fluxo, formato de declarações, chamadas, operadores e etc. Por outro lado, ela também possui suas particularidades como, por exemplo, a linguagem não exige que uma linha termine com “;” apesar de poder ser utilizado caso desejado. O uso do “;” pode separar duas ou mais declarações em uma mesma linha.

Os objetos em Swift, assim como em demais linguagens de programação, são instâncias de classes declaradas. Quando um objeto ainda não está instanciado, ele é nulo (nil, no caso do Swift). Objetos estáticos são instanciados com o comando let, enquanto objetos variáveis são instanciados com o comando var. Ao instanciar uma classe usando o construtor padrão, usamos (), ou um valor default. Na Listagem 1 encontram-se as formas mais comuns de criação de objetos e inicialização de variáveis.

Listagem 1. Usos comuns de declaração de variáveis e objetos.

var annotation:POIAnnotation = POIAnnotation()
  var nome:String = “”
  let nomeFixo:String = “Ola Sr.”
  var arr:Array = []
  var arr2:Array = ["item1", "item2", "item3"]
  var dic1:Dictionary = [”chave” : ”valor"]
  var dic2:Dictionary = Dictionary<String, String>()

As variáveis e propriedades de classes podem ter seu escopo definido como private, public e internal. Quando uma variável é pública, ela pode ser acessada por qualquer método de outras classes no mesmo projeto, ao contrário do private, que limita sua acessibilidade somente à classe de sua definição. Já internal limita seu uso a todos os lugares onde há um “target” definido.

Uma novidade que a linguagem nos traz são as variáveis opcionais. Segundo a Apple, cerca de 70% dos erros mais comuns em desenvolvimento de software são causados por null pointer. Para evitar erros desse tipo, ela oferece no Swift as variáveis opcionais, que quando declaradas como tal, podem armazenar valores nulos (nil). Variáveis opcionais são declaradas usando o símbolo “?” conforme o código a seguir:

private var opcionalStr:[String]? = nil

Quando trabalhamos com variáveis opcionais, devemos abri-las para checar seu conteúdo. Quando sabemos que a mesma possui um valor, usamos o símbolo “!” para acessá-la, caso contrário, devemos utilizar o caractere “?” para validar se é nula (nil) e continuar sua execução com conteúdo variável. Na Listagem 2 é apresentado como o acesso é feito.

Listagem 2. Usando variáveis opcionais.

self.opcionalStr = ["item 1", "item 2"]
  println(self.opcionalStr!.count)
  // Ou
  println(self.opcionalStr?.count)

As propriedades podem possuir níveis de acesso (leitura e escrita) que declaramos de forma muito similar como fazemos com os getters e setters em C#, ou seja, em blocos (closures) de definição os métodos get e set para cada propriedade, na qual podemos manipular como os atributos são setados ou retornados. Observe o exemplo da Listagem 3.

Listagem 3. Getters e Setters.

public var somenteLeitura:String {
     get {
         return "valor"
     }
  }
   
  public var leituraEscrita:String {
     get {
         return "valor"
     }
     set (valor) {
     // Implementação...
     }
  }

Podemos indicar também a forma de relacionamento da variável com o objeto instanciado através dos identificadores weak/unowed/strong, conforme o trecho de código a seguir:

private strong var calcOp:CalcOperation = CalcOperation()
  @IBOutlet weak var resultLabel: UILabel

Por padrão, o Swift trabalha com Strong caso não seja explicitamente especificado.

Em Swift, temos particularidades também no que diz respeito à declaração, chamadas e retornos de métodos. Iremos demonstrar na Listagem 4 como declarar e chamar um método de uma classe. Repare que nomeamos os argumentos do método e separamos o tipo do mesmo com dois pontos “:” e declaramos seu retorno como Int através do operador “->”.

É importante lembrar que ao chamar métodos em Swift, para o primeiro método (ou quando é único) não é necessário informar seu nome, mas é ...

Quer ler esse conteúdo completo? Tenha acesso completo