Swift, el lenguaje de programación de Apple, continúa evolucionando a pasos agigantados. La versión 5.4 nos trae una serie de características y mejoras que harán nuestro día a día como desarrolladores aún más eficiente y agradable.
¿Qué nos trae de nuevo Swift 5.4?
1. Sintaxis de miembro implícito mejorada: SE-0287
Esta mejora permite que se puedan concatenar varios miembros implícitos en llamadas a funciones. Muy útil en el contexto de SwiftUI.
Un ejemplo:
//Antes...
struct ContentView2: View {
var body: some View {
Text("Ejemplo")
.foregroundColor(Color.red.opacity(0.5))
}
}
//Ahora con la nueva mejora:
struct ContentView3: View {
var body: some View {
Text("Ejemplo")
.foregroundColor(.red.opacity(0.5))
}
}
2. Múltiples parámetros variádicos: SE-0284
Con esta nueva versión ahora es posible establecer múltiples parámetros variádicos en funciones, subíndices e inicializadores. La condición es que tiene que existir una etiqueta para los parámetros variádicos después del primero.
Ejemplo:
func resumirTareas(tareas: String..., detalles: String...) {
let tareasUnidas = ListFormatter.localizedString(byJoining: tareas)
let detallesUnidos = ListFormatter.localizedString(byJoining: detalles)
print("\(tareas.count) tareas completadas: \(tareasUnidas), detalles: \(detallesUnidos)")
}
//ejemplo de uso:
resumirTareas(tareas: "Terminar reporte", "Responder correos", "Asistir a reunión", "Hacer ejercicio",
detalles: "Para el cliente X", "Inbox limpio", "Con el equipo de desarrollo", "30 minutos de cardio")
3.Las funciones locales ahora pueden ser sobrecargadas: SR-10069
La sobreacrga de funciones anidadas o locales es posible con este nueva versión. Esto permite a Swift escoger cual será la función a llamar según el tipo de argumentos:
struct Harina {}
struct Azucar {}
func hacerGalletas() {
func agregar(ingrediente: Harina) {
print("Agregando harina...")
}
func agregar(ingrediente: Azucar) {
print("Agregando azúcar...")
}
agregar(ingrediente: Harina())
agregar(ingrediente: Azucar())
print("¡Las galletas están listas!")
}
4. Variables con un nombre igual a de un método o función
Anteriormente a Swift 5.4 no era posible hacer referencia a una variable y a un metodo con el mismo nombre dentro del mismo contexto. Esto provocaba una referencia circular puesto que Swift no sabia distinguir entre la variable local y el método.
Con la nueva versión esto se ha corregido y es posible tener una variable global y un metodo con el mismo nombre. Además este cambio también permite hacer copias locales de propiedades y variables globales.
Veamos un ejemplo:
struct MyMat{
var suma : Int = 0
func suma(a : Int = 0)->Int{
return a + 1
}
mutating func resul(){
suma = suma(a: 10) //podemos hacer referencia a la variable y al metodo de igual nombre
}
}
5. Result Builders (Generador de resultados)
Los generadores de resultados (resultBuilder) son una carcaterística poderosa propuesta desde Swift 5.1 pero que no han visto la luz hasta Swift 5.4. Permiten convertir un tipo o función en un generador de resultados utilizando el atributo @resultBuilder.
Los generadores de resultados permiten crear un nuevo valor al pasar una secuencia de datos. En el contexto de SwiftUI son una parte importante en el sistema de generación de vistas.
@resultBuilder
struct StringBuilder{
static func buildBlock(_ components : String...) -> String{
components.joined(separator: " ")
}
}
let result = StringBuilder.buildBlock(
"Hola",
"espero estes dominando el",
"desarrollo en Swift"
)
print(result) //Hola espero estes dominando el desarrollo en Swift
//_____________________
//También, debido a que la estructura ha sido marcada con @resultBuilder podemos aplicarla a funciones:
@StringBuilder func makeString()->String{
"esto es solo"
"un ejemplo"
}
print(makeString())//esto es solo un ejemplo
Si desea saber más sobre resultBuilder puede consultar estas fuentes:
6. Contenedores de propiedades (Property Wrapper) para variables locales
Ahora podemos crear contenedores de propiedades para variables locales.
7. Los paquetes ahora pueden declarar objetivos (targets) ejecutables
Esta novedad añade la opción de especificar el destino en las aplicaciones que utilizaban el administrador de paquetes de Swift (SPM). Resulta especialmente útil en programas que utilizaban el atributo @main para marcar el punto de entrada y que además utilizan del Administrador de paquetes de Swift. Anteriormente, el SPM siempre buscaba un archivo main.swift.
Si te ha parecido útil el contenido puedes dejármelo en los comentarios. Gracias por leer, feliz codificación!