Advertisement
  1. Code
  2. Swift

iOS do princípio com Swift: Swift em poucas palavras

Scroll to top
Read Time: 15 min
This post is part of a series called iOS From Scratch With Swift.
iOS From Scratch With Swift: Creating Your First iOS Application
iOS From Scratch With Swift: More Swift in a Nutshell

() translation by (you can also view the original English article)

A Apple introduziu a linguagem Swift durante sua conferência anual de desenvolvedores em 2014, surpreendendo muito a comunidade de desenvolvedores. A empresa foi séria sobre a Swift, ela não é um experimento. O objetivo para o Swift é ser o poder da próxima geração de aplicações para as plataformas da Apple.

Pré-Requisitos

Programação

Não é possível cobrir o básico de programação e aprender Swift em um ou dois artigos. Eu estarei assumindo que você já tem alguma experiência em programação. Ruby, PHP ou Javascript são ótimos pontos de start para aprender Swift. Se você vem do desenvolvimento web, então você não terá problemas em aprender o básico do Swift lendo os próximos dois artigos.

Swift

Nos próximos dois artigos, eu mostrarei a você o poder do playground, uma ferramenta introduzida no Xcode 6. Também vamos cobrir o básico da linguagem Swift, como variáveis, constantes e tipos de dados, incluindo sets, array e dicionários.

Você também aprenderá o básico de classes e estruturas. No próximo artigo, vamos dar um checada em closures, funções, protocolos e controles de acesso. O que te dará um entendimento suficiente da linguagem para completar o restante desta série.

Objective-C

Estritamente falando, C e Objective-C não são necessários se você está interessado em desenvolver para a plataforma iOS. Mesmo que a maioria dos frameworks que vamos usar para desenvolver aplicativos de iOS seja escrita em C e Objective-C. Isto significa que ocasionalmente vou falar sobre C e Objective-C. Não se preocupe, eu vou garantir que você entenda o que é essencial para mantê-lo no caminho certo para alcançar seu objetivo, se tornar um desenvolvedor iOS.

Xcode e Swift

Durante esta serie, eu estarei usando o Xcode 7.1 e o Swift 2.1. Se você estiver usando uma versão anterior do Xcode, então tenha em mente que você não estará trabalhando com o Swift 2.1. O Swift continua a mudar rapidamente e a sintaxe evolui com cada iteração da linguagem. Eu recomendo portanto, usar o Xcode 7.1, que inclui o Swift 2.1. 

1. Playgrounds

Em 2014, a Apple apresentou o playground como parte do Xcode 6. Os playgrouds são uma grande ferramenta de aprendizado da linguagem Swift. Com o playground, você pode focar no código que você está escrevendo ao invés de mexer com configurações de projetos, arquivos e pastas.

Vamos criar um playground para começar a aprender o básico do Swift. Inicie o Xcode 7.1 e escolha New > Playground... no menu File do Xcode. O playground suporta o OS X, iOS e tvOS. Defina a Platform como iOS e chame o playground de Swift in a Nutshell.

Create a PlaygroundCreate a PlaygroundCreate a Playground

Diga ao Xcode onde você deseja salvar o playground e clique em Create. A primeira vista, um playground parecer ser um arquivos simples com uma extensão .playground, mas na verdade ele é uma pasta com uma grande quantidade de arquivos. Felizmente, isso não é algo com o que temos que nos preocupar. Um playground é mais fácil de lidar do que um projeto do Xcode com dezenas de arquivos e pastas.

Playground User InterfacePlayground User InterfacePlayground User Interface

A user interface de um playground é limpa e simples. Você pode ver o editor de código na esquerda e a saída na direita. O Xcode já cria o playground com três linhas de código. A primeira linha deve você deve conhecer se você leu os tutoriais anteriores.

1
//: Playground - noun: a place where people can play

A linha começa com duas barras invertidas, //, indicando que esta linha é um comentários e será ignorada pelo compilador. Comentários com múltiplas linhas começam com /* e terminam com */.

1
/*

2
    This is a longer

3
    comment spanning

4
    multiple lines.

5
*/

O Xcode também adicionou uma instrução de importação para o framework UIKit. O UIKit é o mais importantes framework para desenvolvimento iOS. Ele define os blocos de construção com que os aplicativos iOS são construídos. Em Swift, importar um framework é simples, precisa apenas usar a palavra chave import seguida pelo nome do framework, UIKit.

1
import UIKit

A ultima linha deve lembrar alguns de vocês o JavaScript. Usamos a palavra chave var para declarar uma variável, str, e definimos um valor à ela, "Hello, playground". Este exemplo mostra imediatamente a característica chave do Swift, inferência de tipo.

1
var str = "Hello, playground"

O exemplo acima é um pouco enganador. Você pode pensar que o Swift é uma linguagem fracamente tipada, mas não poderia estar mais longe da verdade. A variável str é do tipo String. O Swift é inteligente o suficiente para inferir o tipo da str olhando para o valor que definimos a ela.

O exemplo a seguir é equivalente. Neste exemplo, especificamos explicitamente o tipo para a variável str. Os dois pontos após o nome da variável pode ser lido como é do tipo.

1
var str: String = "Hello, playground"

2. Variáveis e constantes

O Swift também define a palavra chave let. Esta palavra chave é usada pra declarar constantes. O Swift encoraja o uso de constantes sempre que possível. Se o valor de uma variável não for mudar durante seu tempo de vida, então ela deve ser uma constante. Como o nome indica, uma vez que a constante recebe um valor, ele não pode ser alterado. Isto é ilustrado no exemplo a seguir.

The value of a constant cannot be changedThe value of a constant cannot be changedThe value of a constant cannot be changed

No exemplo acima, declaramos uma constante message e atribuímos a ela um valor. Algumas linhas abaixo, atribuimos um novo valor a constante message. Como tentamos alterar o valor da message, o compilador lançou um erro. Felizmente, o compilador faz uma sugestão para corrigir o erro, tornar a constante message em uma variável.

3. Tipos de dados

O Swift define um amplo range de tipos de dados, mas vamos dar uma olhada apenas nos tipos de dados mais comuns que você vai se deparar.

Booleanos

Vamos começar com um tipo simples, Bool. Os booleanos no Swift são tão simples e fáceis de usar, como eles são em outras linguagens. O exemplo a seguir é provavelmente tão simples quanto é possível em Swift.

1
let myBool = true
2
var notTrue = false
3
notTrue = true

Números

Os números são representados por Int, UInt, Float ou Double. Há outros tipos de dados para armazenar valores numéricos, mas estes são os mais comuns. Este tipos de dados são similares ao que você encontra em outras linhagens de programação.

Como o Swift é uma linguagem fortemente tipada, você precisa lidar com conversão de tipos de tempos em tempos. Por exemplo, não é possível multiplicar um Int e um Float. De uma olhada no exemplo a seguir para entender este problema.

Type ConversionType ConversionType Conversion

A princípio, isto pode parecer uma grande deficiência da linguagem Swift. A verdade é que este comportamento é inerente às linguagens mais fortemente tipadas. Felizmente, a solução é simples, como você pode ver a seguir.

Converting a NumberConverting a NumberConverting a Number

Mesmo que pareça como se estivessemos fazendo um casting do a para um Float, isto não é o que está acontecendo. Estamos criando ou inicializando um Float usando o valor armazenado em a.

Há duas formas de criar uma variável ou constante, sintaxe literal (literal syntax) ou sintaxe inicializador (initializer syntax). As constantes a e b foram criadas usando a sintaxe literal. A variável str que discutimos anteriormente é outro exemplo da sintaxe literal.

Para criar um Float com o valor armazenado em a, utilizamos a sintaxe inicializador. Criamos o Float usando o nome do tipo, Float, seguido por dois parênteses, passando a como um parâmetro.

Strings

Nós já encontramos algumas strings neste tutorial. Uma string é nada mais que uma sequência de caracteres. Na verdade, é possível acessar a coleção de caracteres como mostrado no exemplo abaixo.

1
let city = "Brussels"
2
let chars = city.characters

No exemplo acima, usamos uma string literal. O próximo exemplo demonstra como usar o inicializador do tipo String. A sintaxe é idêntica à que vimos em um dos exemplos anteriores sobre números e conversão de tipo.

1
let country = String("Belgium")

Coleções

A biblioteca padrão do Swift define três tipos comuns de coleções: Array, Dictionary e Set. Estes tipos de coleções requerem pouca explicação se você conhece Objective-C ou qualquer outra linguagem de programação. Em algumas linguagens, dicionários são conhecidos como hastes e array como listas. A idéia, entretanto, é a mesma.

1
let myArray = [1, 2, 3, 4, 5]
2
let myDictionary = ["One": 1, "Two": 2, "Three": 3]
3
let mySet = Set(["One", "Two", "Three", "Four", "Five"])

O array e o dicionário são inicializados usando a sintaxe literal. Como o tipo Set não tem uma sintaxe literal, usamos a sintaxe inicializador para criar a constante mySet.

Eu já mencionei que o Swift é uma linguagem fortemente tipada e isto trás consequências para tipos de coleção. O exemplo a seguir demonstra isto. Iniciamos criando uma variável arr1 do tipo [Int]. Isto significa que a arr1 pode conter apenas valores do tipo Int.

Collection TypesCollection TypesCollection Types

A segunda e terceira instruções confirmam isso. Acrescentar um inteiro funciona bem, mas acrescentar uma string resulta em um erro de compilação. O compilador tenta converter o "Two" para um Int, mas é incapaz de fase-lo. O resultado é um erro.

O exemplo a seguir vai tornar as coisas um pouco mais confusas. Por que o compilador não está reclamando sobre o array que contém valores de tipos diferentes? A razão vai surpreender você. A constante arr2 é do tipo [AnyObject].

1
let arr2 = [1, 2, 3, "Four", "Five"]

Any e AnyObject

A biblioteca padrão do Swift define dois tipos especiais, Any e AnyObject. O tipo Any pode representar qualquer tipo enquanto o tipo AnyObject pode representar qualquer classe ou estrutura. Se você está confuso, saiba que isso é perfeitamente normal. O Swift foi projetado para ser fortemente tipada e parece como se o Any e o AnyObject comprometam a segurança de tipo do Swift.

A razão para a introdução do Any e AnyObject é principalmente por razões de compatibilidade. Eu já havia mencionado que a maioria dos frameworks usados para o desenvolvimento Cocoa são escritos em C e Objective-C. O Objective-C define o tipo id, que representa qualquer objeto. Para se certificar que o Swift e os frameworks Cocoa possam trabalhar juntos, a biblioteca padrão do Swift introduziu os tipos Any e AnyObject. Iremos aprender mais sobre isto quando começarmos a trabalhar com os frameworks Cocoa.

4. Classes e Estruturas

Classes

Se você tem conhecimento em programação orientada a objetos, então você já conhece classes. Classes são bastante comuns em Swift. De uma olhada no exemplo a seguir, de como definimos uma classe, Boat, com duas propriedades, speed e lifeboats, e um método, deployLifeboats().

1
class Boat {
2
3
    var speed: Float = 0
4
    var lifeboats: Int = 2
5
    
6
    func deployLifeboats() {
7
        // ...

8
    }
9
10
}

Inicializar e modificar uma instância da classe Boat é simples como você pode ver a seguir. Chamar um método em uma instância não é uma mágica também. O básico das classes em Swift é fácil de entender. Certo?

1
var boat = Boat()
2
3
boat.speed = 10.5
4
boat.lifeboats++
5
6
boat.deployLifeboats()

Estruturas

Vamos criar uma estrutura que parece surpreendentemente similar com a classe Boat e descobrir a diferença entre classes e estruturas no Swift.

1
struct Ship {
2
3
    var speed: Float = 0
4
    var lifeboats: Int = 2
5
    
6
    func deployLifeboats() {
7
        // ...

8
    }
9
10
}

O exemplo a seguir revela a mais importantes diferença entre as classes e estruturas no Swift.

Difference Between Classes and Structures in SwiftDifference Between Classes and Structures in SwiftDifference Between Classes and Structures in Swift

O exemplo demonstra que classes são passadas como referência enquanto estruturas são passadas como valor. O que isso significa? Inicializamos uma instância Boat, atribuímos ela a boat1 e definimos sua propriedades speed com 11.0. Atribuimos a boat1 ao boat2. Isso significa que boat2 tem uma referência de boat1. Ambos, boat1 e boat2, apontam para a mesma instância Boat. O resultado é que definir a propriedade speed da boat2 também modifica a propriedade speed da boat1

Isso não funciona para estruturas. Repetimos os mesmos passos usando a estrutura Ship. O resultado final é diferente entretanto. Atribuindo ship1 à ship2, o valor do ship1 é copiado e armazenado em ship2. Isso significa que ship1 e ship2 apontam para objetos diferentes, instâncias diferentes do estrutura Ship. Este é um conceito muito importante para se compreender, certifique-se de entender isso antes de continuar.

Consequências

Você já foi introduzido para os tipos de dados mais comuns definidos pela biblioteca padrão do Swift. O que eu não mencionei nessa discussão é que cada tipo de dados do Swift que discutimos até agora é uma estrutura.

Todo tipo de coleção em Swift, por exemplo, é uma estrutura. Todo tipo numérico é uma estrutura. Isto é importante saber e entender, especialmente se você vem de uma linguagem que passam esses tipos como referências, como Ruby e Objective-C.

Mais diferenças

Há inúmeras outras diferenças que define separadamente classes e estruturas em Swift. Classes suportam herança, enquanto estruturas não. No exemplo a seguir, definimos uma classe Speedboat que herda da classe Boat. A classe Boat é a classe pai ou superclasse da Speedboat.

1
class Speedboat: Boat {
2
    
3
}
4
5
var speedboat = Speedboat()
6
7
speedboat.speed = 100.0
8
speedboat.lifeboats = 0
9
speedboat.deployLifeboats()

Como o Boat é a classe pai da Speedboat, Speedboat herda as propriedades e métodos definidos na classe Boat. O exemplo demonstra isso. Mesmo que a implementação da classe Speedboat esteja vazia, a instância Speedboat, myBoat, tem as propriedades speed e lifeboats, até mesmo o método deployLifeboats().

Um diferença mais sutil que diferencia as classes e estruturas é a verificação do tipo em tempo de execução. Você pode verificar o tipo da instância de uma classe em tempo de execução, enquanto que isso não é possível para uma instância de estrutura.

5. Opcionais

Os opcionais são uma parte integral da linguagem Swift. Vamos descobrir o que são os opcionais e porque eles são tão importantes. Uma variável precisa ser inicializada antes de poder ser usada. De uma olhada no exemplo a seguir para entender o que isso significa.

1
var str: String
2
3
str.isEmpty

Se você já trabalhou com strings em outras linguagens, então você deve ter ficado surpreso que o compilador lançou um erro. Vamos ver o que este erro nos diz.

Variable Not InitializedVariable Not InitializedVariable Not Initialized

Em muitas linguagens, as variáveis tem uma valor padrão inicial. Em Objective-C, por exemplo, a string no trecho de código a seguir é igual à nil.

1
NSString *newString;

O que é um opcional?

O Swift usa opcionais para encapsular um conceito importante, uma variável ou constante tem um valor ou ela não tem. É simples assim em Swift. Para declara uma variável ou constante como opcional, adicionamos um ponto de interrogação no tipo da variável ou constante.

1
var str: String?

A variável str não é mais do tipo String. Agora ela é do tipo opcional String. Isso é importante entender. A consequência é que não podemos interagir diretamente com o valor da str. O valor está armazenado com segurança no opcional e precisamos perguntar ao opcional pelo valor que ele encapsulo.

Forçando o desencapsulamento (Forced Unwrapping)

Uma forma de acessar o valor de um opcional é forçando o desencapsulamento do opcional. Podemos acessar o valor da str adicionando um ! no nome da variável.

1
var str: String?
2
3
str = "Test"
4
5
println(str!)

É importante que você tenha certeza que o opcional contenha um valor quando você forçar o desempacotamento. Se você forçar o desempacotamento de um opcional que não tenha valor, o Swift lançará um erro e sua aplicação ira quebrar.

Forced Unwrapping an Optional Without a ValueForced Unwrapping an Optional Without a ValueForced Unwrapping an Optional Without a Value

Opcional Binding

Há uma maneira mais segura de acessar o valor de um opcional. O exemplo a seguir mostra como podemos acessar seguramente o valor armazenado na str, que é do tipo String?.

1
var str: String?
2
3
if str != nil {
4
    println(str!)
5
} else {
6
    println("str has no value")
7
}

A primeira coisa a fazer e verificar se o str é igual a nil, depois imprimimos seu valor. Neste exemplo, str não tem um valor. Isso significa que não forçaremos o desempacotamento por acidente.

Há ainda um caminho mais elegante, conhecido como opcional binding. No exemplo a seguir, atribuímos o valor armazenado no opcional a uma constante temporária. O valor do opcional str é passado para a constante strConst e disponibilizado na clausura if da instrução if. Este caminho também funciona para instruções while.

1
var str: String?
2
3
str = "Test"
4
5
if let strConst = str {
6
    println(strConst)
7
} else {
8
    println("str has no value")
9
}

O que é nil?

Se você vem de uma linguagem como Objective-C, então você certamente sabe o que é o nil. Em Objective-C, o nil é um ponteiro para um objeto que não existe. O Swift tem uma definição um pouco diferente para o nil e é importante que você entenda a diferença.

Em Swift, o nil significa a ausência de valor, nenhum valor. Enquanto que o nil é aplicado apenas para objetos em Objective-C, em Swift o nil pode ser usado para qualquer tipo.

Você sentiu falta do ponto e virgula?

Reparou que não usamos nenhum ponto e vírgula nos exemplos deste tutorial? Em Swift, não é necessário o uso do ponto e vírgula, porque o compilador é inteligente o suficiente para entender quando uma instrução termina e outra começa. Se você realmente quer usar o ponto e vírgula, você pode usa-lo sem problemas. Mas tenha em mente, entretanto, que o guia da linguagem recomendar omitir o ponto e vírgula.

Conclusão

Embora que nós apenas entramos na superfície neste tutorial, você tem o básico agora para entender a linguagem de programação Swift. No próximo tutorial, vamos explorar outro componente chave da linguagem, closures e funções. Iremos discutir também protocolos e controle de acesso.

Se você tem alguma pergunta ou comentário, você pode deixa-los no comentários abaixo ou me procurar no Twitter.

Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
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.