faça o Download da Sua Cópia de
A Falta de Manual
para Swift Desenvolvimento

O Guia eu Desejo que eu Tinha Quando eu Comecei

Associação De 20.000+ Desenvolvedores de Aprendizagem Sobre o rápido Desenvolvimento

Baixar Sua Cópia Gratuita

Se você está assistindo isso, então eu suponho que você está familiarizado com o Swift extensões. Uma extensão Swift permite adicionar funcionalidade a um tipo, uma classe, uma estrutura, um enum ou um protocolo. Mas as extensões são mais poderosas do que isso. Neste episódio, gostaria de mostrar quatro usos inteligentes das extensões Swift.

conformidade do Protocolo

A Linguagem de programação Swift menciona que as extensões podem ser usadas para conformar um tipo existente a um protocolo. Embora isso não seja novo ou revolucionário, também pode ajudá-lo a manter seu código organizado.

tome os protocolos UITableViewDataSource e UITableViewDelegate como exemplo. Este exemplo pode parecer familiar. Isso é bom, mas resulta em uma implementação de classe longa que pode se tornar difícil de navegar ao longo do tempo.

import UIKitclass ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { ...}

você pode manter seu código organizado criando uma extensão para cada protocolo ao qual o tipo está em conformidade.

import UIKitclass ViewController: UIViewController { ...}extension ViewController: UITableViewDataSource { ...}extension ViewController: UITableViewDelegate { ...}

navegar pelos arquivos de origem também se torna mais fácil se você criar o hábito de usar a barra de salto na parte superior do editor de origem do Xcode.

navegar pelos arquivos de origem também se torna mais fácil se você criar o hábito de usar a barra de salto na parte superior do editor de origem do Xcode.

preservando inicializadores

aprendi o próximo truque de Chris Eidhof. Para este exemplo, primeiro precisamos definir uma estrutura, Person. A estrutura define duas propriedades constantes do tipo String, firste last.

struct Person { // MARK: - Properties let first: String let last: String}

Swift generosamente cria um inicializador para nós, init(first:last:), que podemos usar para instanciar uma instância da estrutura Person. Isto não é novo.

let john = Person(first: "John", last: "Doe")

Infelizmente, o inicializador não está mais disponível se definirmos um inicializador personalizado na definição da estrutura.

struct Person { // MARK: - Properties let first: String let last: String // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" }}

o inicializador não está mais disponível se definirmos um inicializador personalizado na definição de estrutura.

Felizmente, temos uma solução fácil para resolver esse problema. Criamos uma extensão para a estrutura Person na qual definimos o inicializador personalizado.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" }}

uma extensão resolve o problema.

separação de código

podemos dar o exemplo anterior um passo adiante. Alguns anos atrás, Natasha Murashev delineou uma técnica que usa extensões para separar o estado do comportamento. Se aplicarmos essa técnica ao exemplo anterior, acabamos com algo assim.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { // MARK: - Initialization init(dictionary: ) { self.first = dictionary ?? "John" self.last = dictionary ?? "Doe" } // MARK: - Public API var asDictionary: { return }}

A definição de tipo define apenas as propriedades armazenadas. Uma extensão é criada para o comportamento do tipo, ou seja, métodos e propriedades computadas. O resultado é uma clara separação de Estado (propriedades armazenadas) e comportamento (métodos e propriedades computadas).

podemos dar um passo adiante criando uma segunda extensão privada para comportamento privado.

struct Person { // MARK: - Properties let first: String let last: String}extension Person { ...}private extension Person { ...}

a separação e Organização de código é muito fácil de fazer usando extensões. Eu uso o tempo todo. Se você perder os arquivos de cabeçalho do Objective-C, esta é uma boa alternativa.

tipos aninhados

A Linguagem de programação Swift menciona que as extensões também permitem definir e usar tipos aninhados. Mas sinto que esse recurso está subvalorizado. Eu o uso em todos os projetos Swift, por exemplo, para definir constantes.

há alguns meses, publiquei um tutorial sobre a construção de um controle personalizado usando um bitmask. Nesse tutorial, armazenamos o valor bruto da máscara de bits no banco de dados de padrões do Usuário.

// MARK: - [email protected] func scheduleDidChange(_ sender: SchedulePicker) { // Helpers let userDefaults = UserDefaults.standard // Store Value let scheduleRawValue = sender.schedule.rawValue userDefaults.set(scheduleRawValue, forKey: UserDefaults.Keys.schedule)}

em vez de usar um literal de string, usamos uma constante. Criamos uma extensão para a classe UserDefaults na qual definimos um enum sem casos, Keys. O enum define uma propriedade constante estática do tipo String, schedule.

extension UserDefaults { enum Keys { static let schedule = "schedule" }}

o resultado é muito bom se você me perguntar. Não só podemos agrupar constantes, evitando literais que estão espalhados por toda a base de código, mas também namespace as constantes. Em outras palavras, as constantes são fáceis de lembrar e fazem sentido.

UserDefaults.Keys.schedule

com o lançamento do Swift 3, a Apple adotou uma técnica semelhante em algumas de suas estruturas.

Notification.Name.UIApplicationWillTerminate

o que vem a seguir

as extensões são bastante poderosas no Swift e as técnicas que mostrei neste tutorial são apenas alguns exemplos do que é possível.

baixe sua cópia gratuita do
o Manual ausente
para desenvolvimento rápido

o guia que eu gostaria de ter quando comecei

Junte-se a mais de 20.000 desenvolvedores aprendendo sobre o desenvolvimento Swift

baixe sua cópia gratuita

Deixe uma resposta

O seu endereço de email não será publicado.