Descargue Su Copia Gratuita de
El Manual Que Falta
para un Desarrollo Rápido

La Guía Que Desearía Tener Cuando Empecé

Únete a más de 20.000 Desarrolladores Aprendiendo sobre Desarrollo Swift

Descarga Tu Copia Gratuita

Si estás viendo esto, supongo que estás familiarizado con las extensiones de Swift. Una extensión Swift le permite agregar funcionalidad a un tipo, una clase, una estructura, una enumeración o un protocolo. Pero las extensiones son más poderosas que eso. En este episodio, me gustaría mostrarles cuatro usos inteligentes de las extensiones Swift.

Conformidad del protocolo

El lenguaje de programación Swift menciona que las extensiones se pueden usar para ajustar un tipo existente a un protocolo. Si bien esto no es nuevo ni revolucionario, también puede ayudarlo a mantener su código organizado.

Tome los protocolos UITableViewDataSource y UITableViewDelegate como ejemplo. Este ejemplo puede parecer familiar. Esto está bien, pero resulta en una implementación de clase larga que puede ser difícil de navegar con el tiempo.

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

Puede mantener su código organizado creando una extensión para cada protocolo al que se ajuste el tipo.

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

Navegar por los archivos fuente también se vuelve más fácil si se acostumbra a usar la barra de salto en la parte superior del editor de fuentes de Xcode.

 Navegar por los archivos fuente también se vuelve más fácil si se acostumbra a usar la barra de salto en la parte superior del editor de fuentes de Xcode.

Preservando Inicializadores

Aprendí el siguiente truco de Chris Eidhof. Para este ejemplo, primero necesitamos definir una estructura, Person. La estructura define dos propiedades constantes de tipo String, first y last.

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

Swift crea generosamente un inicializador para nosotros, init(first:last:), que podemos usar para crear instancias de una instancia de la estructura Person. Esto no es nuevo.

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

Desafortunadamente, el inicializador ya no está disponible si definimos un inicializador personalizado en la definición de la estructura.

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

El inicializador ya no está disponible si definimos un inicializador personalizado en la definición de la estructura.

Afortunadamente, tenemos una solución fácil para resolver este problema. Creamos una extensión para la estructura Person en la que definimos el 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" }}

Una extensión resuelve el problema.

Separación de código

Podemos llevar el ejemplo anterior un paso más allá. Hace unos años, Natasha Murashev esbozó una técnica que utiliza extensiones para separar el estado del comportamiento. Si aplicamos esta técnica al ejemplo anterior, terminamos con algo como esto.

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 }}

La definición de tipo solo define las propiedades almacenadas. Se crea una extensión para el comportamiento del tipo, es decir, métodos y propiedades calculadas. El resultado es una clara separación de estado (propiedades almacenadas) y comportamiento (métodos y propiedades calculadas).

Podemos ir un paso más allá creando una segunda extensión privada para el comportamiento privado.

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

La separación y organización de código es muy fácil de hacer usando extensiones. Lo uso todo el tiempo. Si pierdes los archivos de encabezado de Objective-C, esta es una buena alternativa.

Tipos anidados

El lenguaje de programación Swift menciona que las extensiones también le permiten definir y usar tipos anidados. Pero siento que esta característica está infravalorada. Lo uso en todos los proyectos de Swift, por ejemplo, para definir constantes.

Hace unos meses, publiqué un tutorial sobre cómo crear un control personalizado usando una máscara de bits. En ese tutorial, almacenamos el valor sin procesar de la máscara de bits en la base de datos de valores predeterminados de usuario.

// 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)}

En lugar de usar un literal de cadena, usamos una constante. Creamos una extensión para la clase UserDefaults en la que definimos una enumeración sin casos, Keys. La enumeración define una propiedad constante estática de tipo String, schedule.

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

El resultado es bastante bueno si me preguntas. No solo podemos agrupar constantes, evitando literales que están dispersos por toda la base de código, sino que también ponemos espacio de nombres a las constantes. En otras palabras, las constantes son fáciles de recordar y tienen sentido.

UserDefaults.Keys.schedule

Con el lanzamiento de Swift 3, Apple adoptó una técnica similar en algunos de sus frameworks.

Notification.Name.UIApplicationWillTerminate

What’s Next

Las extensiones son bastante potentes en Swift y las técnicas que mostré en este tutorial son solo algunos ejemplos de lo que es posible.

Descargue Su Copia Gratuita de
El Manual Que Falta
para un Desarrollo Rápido

La Guía Que Desearía Tener Cuando Empecé

Únase A Más De 20.000 Desarrolladores Aprendiendo Sobre Swift Development

Descargue Su Copia Gratuita

Deja una respuesta

Tu dirección de correo electrónico no será publicada.