Swift
Tendencia

Novedades en Swift 5.4 (I), sintaxis extendida en el encadenamiento de miembros implícitos

Swift 5.4 ya está entre nosotros, como parte de la beta de Xcode 12.5 que ya se puede descargar desde el portal de desarrolladores de Apple. Y nos trae importantes novedades. La principal de todas (aceptada pero aún no implementada a fecha de publicación de este artículo) es una nueva capa de programación asíncrona con las instrucciones async y await, unido a una nueva forma de definir funciones asíncronas en una forma similar a como funcionan otros lenguajes como C#.

De aquí a su publicación para, probablemente, finales del mes de marzo de 2021, vamos a hacer una serie de artículos explicando las novedades que nos trae esta nueva versión menor de Swift que sigue puliendo y mejorando el lenguaje.

La primera novedad de la que vamos a hablar es algo que suena complejo pero es una novedad pequeña pero muy interesante para facilitar que nuestro código sea más limpio: sintaxis extendida en el encadenamiento de miembros implícitos.

Funcionamiento actual

Cuando en Swift uso un constructor de un tipo de dato (como el propio init o incluso una función de estática o de tipo), puedo eliminar de forma implícita el nombre del tipo si este ya está indicado en el constructor.

Vamos a suponer que tengo un struct llamado Algo que contiene una propiedad no inicializada, un método y además una función o método estático (que pertenece a la estructura, no a la instancia) que nos permite generar una instancia de Algo con un valor para esa propiedad por defecto.

struct Algo {
    static func creando() -> Algo {
        Algo(propiedad: 3)
    }
    var propiedad:Int
    func metodo() {
        
    }
}

Cuando inicializo ese Algo en dos instancias, algo1 y algo2, puedo hacerlo de cualquiera de estas dos formas:

var algo1 = Algo(propiedad: 4)
var algo2 = Algo.creando()

O bien uso el inicializador sintetizado del struct, que me pide la propiedad no inicializada como parámetro, o uso la función o método estático creando(), para obtener una inicialización que de un valor por defecto a ese parámetro no inicializado.

El uso de inicializadores o miembros implícitos supone que cuando el tipo está definido en su declaración, puedo (al igual que haría con una enumeración) acudir a los métodos o inicializadores de los tipos, sin necesidad de volver a indicar el nombre del mismo.

var algo3:Algo = .creando()
var algo4:Algo = .init(propiedad: 4)

La gran ventaja de usar los miembros implícitos, es que si tenemos un tipo de dato que ya está declarado porque es la propiedad de una estructura instanciada, podemos acceder a sus método o inicializadores sin necesidad de indicar el tipo de dato.

view.backgroundColor = .systemBackground

La forma más fácil de verlo es cómo podemos usar el inicializador .systemBackground (por ejemplo) para definir un tipo UIColor dentro del uso de UIKit. Igual que podemos indicar un color predefinido como .black.

El problema implícito

Sin duda esta funcionalidad es genial, pero tiene un problema: no podemos usar estos constructores implícitos de forma encadenada a las interfaces fluidas porque entonces nos obliga a indicar el tipo original.

Veamos el caso cuando usamos un color en SwiftUI, por ejemplo. Usamos el constructor implícito del color para indicar que este es .black o .white, por ejemplo. Pero sobre el color, luego podemos modificar su opacidad con una función unida al tipo Color. El problema es que hemos de indicar el tipo Color de forma explícita para que funcione.

Text("Ola k ase")")
    .foregroundColor(.blue.opacity(0.5))

Esta unión entre el constructor .blue implícito y el modificador .opacity, en Swift 5.3 o versiones anteriores daría un error. Tendríamos que indicar el tipo de forma explícita: Color.blue.opacity(0.5). Sin embargo, ahora no es necesario y el sistema lo entenderá.

Esto es sumamente útil para el trabajo con SwiftUI, como en los colores, animaciones y muchas más modificadores que podemos usar y nos ayuda a usar los constructores implícitos de forma más cómoda.

Para probar esto, solo tenéis que bajaros de Apple Xcode 12.5 y empezar a usarlo, pero eso sí, recordad que la versión de primavera de Xcode obliga al uso de la última versión de macOS, por lo que esta versión 12.5 solo funcionará en macOS Big Sur (macOS 11). No dejéis de compartir este artículo con vuestros amigos en redes sociales y mencionarnos como @apple_coding en Twitter. Un saludo y Good Apple Coding.

Julio César Fernández

Analista, consultor y periodista tecnológico, desarrollador, empresario, productor audiovisual, actor de doblaje e ingeniero de vídeo y audio.

Artículos relacionados

Botón volver arriba