Swift

Swift é uma linguagem de programação criada pela Apple e está cada vez mais sendo utilizada. Muitos desenvolvedores já estão criando ou modificando seus projetos e aprendendo as vantagens que essa linguagem traz. No texto de hoje iremos mostrar as melhorias que Swift apresenta para os programadores.

Swift é uma linguagem de programação criada pela Apple para desenvolvimento no sistema iOS, macOS, watchOS, tvOS, Windows e Linux. Ela foi desenvolvida para manter compatibilidade com a API Cocoa e com código existente em Objective-C. O compilador da Swift usa a infraestrutura do LLVM e é distribuído junto do Xcode.

Em 2014, Swift foi anunciada na WWDC, a conferência anual da Apple. A partir da versão 2.2 em dezembro de 2015, passou a ser distribuída sob a licença Apache 2.0, quando a Apple disponibilizou o código fonte do Swift como um projeto open source.

Com a abertura do código fonte foi possível a utilização da linguagem em outras esferas do desenvolvimento, principalmente para aplicações Web, e aí surgiram frameworks que auxiliam no desenvolvimento, tais como: Vapor, Perfect e Kitura, de propriedade da IBM.

Swift foi aceita rapidamente pelos desenvolvedores de iOS, e isso contribuiu muito para o rápido desenvolvimento da linguagem de programação, com novas versões sendo lançadas aproximadamente a cada cinco ou seis meses. Por isso Swift está entre as 20 linguagens mais populares do mercado

Swift foi inspirado em linguagens como Objetive-C, Rust, Haskell, Ruby, Python, C#, entre outras.  Ela é uma alternativa à linguagem Objective-C que emprega conceitos modernos da teoria de linguagem de programação e se empenha em oferecer uma sintaxe mais simples. Em sua apresentação, foi descrita como: “Objective-C sem a corpulência do C”.

Em Swift vemos conceitos chave do Objective-C tais como como protocolos, clausuras e categorias, no entanto a sintaxe é frequentemente substituída por versões mais limpas e permitindo a aplicação desses conceitos em outras estruturas da linguagem.

O que é o Swift?

Swift é uma linguagem de programação de tipagem forte, estática e inferida. Ou seja, os valores atribuídos a variáveis no Swift, precisam ser do mesmo tipo da variável declarada (tipagem forte), que o tipo de uma variável é checado e definido em tempo de compilação (tipagem estática), e que os tipos de variáveis podem ser inferidos pelo compilador através dos valores passados na inicialização (tipagem inferida).

Os tipos de variável na Swift podem ser opcionais, isso faz com que haja mais segurança ao desenvolver, reduzindo o risco de comportamentos incertos causados pela ausência de valores esperados em certas partes do programa.

Ainda sobre segurança, Swift checa se suas variáveis foram inicializadas antes do uso, força a inicialização de objetos pra que eles nunca sejam nulos, verifica a ocorrência de overflow em arrays e inteiros, e gerencia automaticamente a alocação de memória pra você.

E para concluir o quanto é seguro, ao definir constantes é super simples, com a keyword let, e definir variáveis mais ainda, com a keyword var.

Você ainda pode encontrar os seguintes itens em Swift:

  • Closures unificadas com ponteiros de função;
  • Tipos genéricos;
  • Tuplas;
  • Super structs, que suportam a definição de métodos, extensões e implementação de protocolos;
  • Controle de fluxo e ainda mais segurança com as keywords guard, defer e repeat.

A linguagem Swift também é multiparadigmas, suportando o desenvolvimento nos paradigmas orientado a objetos, imperativo, concorrente e funcional.

Swift x Objective-C

Com o surgimento do Swift, Objective-C não deixou de existir, hoje ela é considerada uma linguagem bastante madura e estável, e o Swift foi desde o princípio desenhado para ser compatível a ela. E ambos são compatíveis com a Cocoa API e o Cocoa Touch Framework, utilizados no desenvolvimento de aplicações para iDevices e Macs. 

Esse framework contém funções que permitem os desenvolvedores desenhar imagens e textos na tela, respondendo a interação do usuário. Dessa forma, quando você ouvir que precisa ainda aprender Objective-C para fazer aplicações para iOS, a maioria quer dizer que você precisa aprender como se usa o framework Cocoa Touch e com Swift você tem mais uma maneira de começar a usar esse framework.

Além disso, as duas linguagens são compatíveis com a arquitetura LLVM de compiladores, o que torna possível a reutilização de várias build tools de um para outro.

Ao compararmos Objective-C, que é uma linguagem com mais de 20 anos, Swift traz facilidades tais como Generics e uma sintaxes mais simples onde com poucas linhas de código o programador consegue fazer mais coisas do que faria com Objective-C. O Swift lembra muito linguagens de script como Ruby e Python, no entanto, ela mantém as chamadas dos métodos principais parecidas com Objective-C facilitando assim a migração de novos e antigos desenvolvedores.

Objective-C traduz as chamadas dos métodos para uma chamada objc_msgSend. Ela é responsável por selecionar o que se quer enviar e o seu objeto, procurando pela parte do código que deveria supostamente tratar os eventos desse método por meio da tabela de métodos da classe. Isto é extremamente rápido, porém as vezes faz muito mais do que o necessário. Quando se declara um objeto MyObject*, ele pode ser MyObject ou uma subclasse, pode ser uma instância de um tipo estático e até uma instância de uma classe completamente diferente. Dessa forma, pode-se “mentir” para o compilador sobre o tipo do objeto que se está enviando e mesmo assim seu código vai funcionar.

Diferentemente do Objective-C, em Swift não se pode “mentir” para o compilador, o objeto precisa ser mais específico, se instanciarmos um objeto da classe MinhaClass ele pode ser tanto uma instância de MinhaClass como de MinhaSubclass, nada além disso. Em vez de usar objc_msgSend, o compilador do Swift emite um código que faz uma chamada em uma vtable, um array de funções e ponteiros que é acessado por um index:

chamadaMetodo = object->class.vtable[indexOfMetodo1]
chamadaMetodo()
class MinhaClass {
func metodo1() { print("chamando metodo1") }
@final func metodo2() { print("chamando metodo2") }
}

class MinhaSubClass: MinhaClass {
override func metodo1() { print("chamando metodo1 subclass") }
}

func TestarClass(obj: MinhaClass) {
obj.metodo1()
obj.metodo2()
}

Swift: Vantagens e Desvantagens

Swift veio resolver a maior reclamação dos programadores em relação ao Objetive-C: a sintaxe complicada e difícil de debugar, uma vez que Swift é mais fácil concisa e mais expressiva.

Um bom exemplo disso você encontra no exercício inicial “hello world” nas duas linguagens, na tabela abaixo:

Apesar de ser mais fácil a Apple deixa bem claro que essa simplicidade não diminui o poder dessa linguagem.

É uma linguagem rápida, como o nome sugere, segura, escalável, com gerenciamento automático de memória e por ser muito fácil de ser lida, facilita também que novos desenvolvedores entrem no time com o projeto em andamento.

Abaixo veremos algumas das características principais do Swift.

Controle de Acesso

O Swift suporta seis níveis de controle de acesso com os símbolos: open, public, internal, fileprivate e private. Ao contrário de outras linguagens orientadas a objetos, esses controles de acesso ignoram hierarquias de herança: private indica que um símbolo só é acessível no escopo imediato, fileprivate indica que só é acessível internamente ao arquivo, internal indica que é acessível no escopo do módulo que o contém, public indica que é acessível de qualquer módulo, e open, apenas para classes e seus métodos, indica que a classe pode ser “subclassificada” de fora do módulo.

Tipagem de Valores

Em muitas linguagens orientadas a objetos, os objetos são representados internamente em duas partes. O objeto é armazenado como um bloco de dados posicionado no heap, enquanto o handle o objeto é representado por um ponteiro.

Os objetos são passados entre métodos por meio da cópia do valor do ponteiro, permitindo o acesso aos dados contidos no heap por qualquer um que possua cópia. Por sua vez, tipos básicos como valores de inteiros e pontos flutuantes são representados diretamente. O handles contém os dados, não um ponteiro, e esses dados são passados diretamente aos métodos por cópia. Esses estilos de acesso são denominados passagem por referência no caso dos objetos, e passagem por valor para tipos básicos.

Similar ao C# (se quer saber mais sobre essa linguagem, temos um texto no blog: C# – Variáveis e Constantes), o Swift oferece suporte nativo a objetos usando ambas as semânticas de passagem por referência e passagem por valor. Sendo que a primeira é usada para declaração class e a segunda para struct.

E por falar em Structs, no Swift ele tem quase todas as mesmas características das classes: métodos, protocolos de implementação e uso de mecanismos de extensão. Por esse motivo, a Apple nomeou genericamente todos os dados como instâncias, ao invés de objetos ou valores. Contudo, structs não permitem herança.

// Definição de struct
struct Resolution {
var width = 0
var height = 0
}

// Criação de instância
let hd = Resolution(width: 1920, height: 1080)

// Sendo "Resolution" um struct, uma cópia da instância é criada
var cinema = hd

Enumerações e Casamento de Padrões

No Swift as enumerações de tipagem forte, e suas variantes carregam valores diversos.

Aqui vão alguns exemplos de declaração de enumerações e o casamento de padrões:

enum Browser {
case chrome
case firefox
case safari
case edge
case ie(UInt8)
}

let browser = Browser.ie(11)
switch browser {
case .chrome:
fallthrough // .chrome ou .edge
case .edge:
print("Chromium")
case let .ie(version):
print("Internet Explorer (version)")
default:
print("Outro navegador")
}

Opcionais

Uma importante característica no Swift são tipos opcionais, que permitem que valores ou referências operem de forma semelhante ao padrão comum do C, em que um ponteiro pode prover referência a um valor ou ser nulo.

let website: String? = "https://www.wikipedia.org"
if website != nil {
    print("Website: (website!)") // `!` desembrulha o valor forçadamente
}

// Forma alternativa (padrão)
if let addr = website {
    print("Website: (addr)")
}

// Forma alternativa (guarda)
func unwrap(_ website: String?) -> String {
    guard let addr = website else {
        return "" // Retorna prematuramente
    }
    return addr
}

Tratamento de Erros

Swift possui exceções semelhante a Objective-C. Como por exemplo:

enum ValueError: Error {
case tooSmall
case tooLarge
}

// Função que pode falhar
func verify(n: Int) throws -> Int {
guard n >= 4 else {
throw ValueError.tooSmall
}

guard n <= 20 else {
throw ValueError.tooLarge
}

return n
}

Genéricos

Exemplo de uma árvore binária em Swift:

// Tipos recursivos precisam ser declarados como `indirect`
indirect enum Tree {
case empty
case node(T, Tree, Tree)
}

let tree = Tree.node(5.96, .empty, .node(1.0, .empty, .empty))

// O primeiro membro é extraído como consante; ignora demais membros
if case let .node(value, _, _) = tree {
print("(value)")
}

// Os membros são extraídos se a condição for satisfeita
if case let .node(value, left, right) = tree, value < 6.0 {
print("-> (left)")
print("-> (right)")
}

Iteradores e Clausuras

Um iterador, em Swift é representando pelo protocolo IteratorProtocol; o protocolo Sequence fornece métodos adaptadores para criar novos iteradores. Também possui um literal para representar intervalos (um tipo de iterador).

No exemplo a seguir o programa lista os números primos entre 4 e 20:

var numbers: [Int] = [];
// `4...20` é um iterador inclusivo (inclui 20)
for i in 4...20 {
// `2..

Conclusão

Com o Swift, a Apple aprimorou sua ferramenta de desenvolvimento o Xcode adicionando uma parte Playground no qual o programador pode facilmente testar seu código sem precisar fazer o build ou compilar. Além de mostrar o resultado imediatamente, mostra também os gráficos sobre a performance do código

Se você está pensando como aprender a programar em Swift se nem tenho um Mac, vem a melhor parte: você não precisa de um Mac pra aprender a programar ou desenvolver soluções usando Swift.

A grande maioria dos editores de código agnósticos (por exemplo, Atom, VSCode, Sublime etc) já tem suporte ao Swift. Além disso, você pode compilar o código escrito em Swift no seu Linux, graças à disponibilização da linguagem como open source! E se você usa Windows, também pode, graças à compatibilidade do Swift com a linguagem C, e à extensa coleção de bibliotecas C já presentes no sistema que o Swift também suporta.

Concluindo, Swift é uma linguagem muito segura, de sintaxe limpa, muito acessível e fácil de aprender, quer você esteja começando aprender a programar, quer você seja um veterano com anos de experiência em outras linguagens.

Com ela você terá acesso ao mundo do desenvolvimento iOS, através do Xcode e do Cocoa Touch Framework, então se esse é o seu objetivo, aprender Swift é um ótimo começo!

Nós da beecrowd oferecemos Swift em nossa plataforma, vem praticar com a gente! ?

Gostou do nosso conteúdo? Então siga-nos nas redes sociais para ficar por dentro de mais informações e acompanhe o nosso blog.

Conteúdo

Nossos artigos mais recentes
Leia sobre as últimas tendências na área de tecnologia
blog skills
A beecrowd atualizou a tela de habilidades dos perfis, tornando mais fácil...
UXblogfix
UX é fundamental no desenvolvimento de software, pois influencia diretamente a satisfação,...
Blog 12-09
A programação funcional está se tornando uma tendência no desenvolvimento de software,...

Extra, extra!

Assine nossa newsletter

Fique sempre atualizado com as novidades em tecnologia, transformação digital, mercado de trabalho e oportunidades de carreira

Gostaria de falar com um Representante de Vendas?

Interessado em: