Entrada

Swift 5.9 ¡Ya está Disponible! 🎉

Esta importante nueva versión agrega un sistema de macros expresivo al lenguaje e introduce soporte para integrar Swift en bases de código de C++ a través de interoperabilidad bidireccional.

También introduce paquetes de parámetros, un mejor evaluador de expresiones durante la depuración, mejoras en el manejo de crashes, mejoras en la plataforma Windows y más.

Lenguaje y Biblioteca Estándar

El objetivo fundamental de Swift es fomentar un código claro y conciso mientras se mantiene seguro y eficiente.

Macros

Las macros ayudan a los desarrolladores a reducir la repetición de código boilerplate y crear bibliotecas más expresivas que se pueden distribuir como un paquete Swift.

Usar una macro es fácil y natural. Las macros se pueden expandir de manera similar a una función con una sintaxis de #nombreMacro independiente:

1
let _: Font = #fontLiteral(name: "SF Mono", size: 14, weight: .regular)

o adjuntarse a declaraciones con un atributo @nombreMacro:

1
2
3
4
5
6
7
// Mueve el almacenamiento de las propiedades almacenadas a un diccionario,
// convirtiendo las propiedades almacenadas en propiedades calculadas.
@DictionaryStorage
struct Point {
  var x: Int = 1
  var y: Int = 2
}

Paquetes de Parámetros

Los paquetes de parámetros te permiten escribir tipos y funciones genéricas que funcionan con un número arbitrario de tipos.

Por ejemplo, sin paquetes de parámetros, si quisieras escribir una función llamada “all” para verificar si cualquier cantidad de valores opcionales son nulos, necesitarías escribir una sobrecarga separada para cada longitud de argumento que quisieras admitir, creando un límite arbitrario:

1
2
3
func all<W1>(_ optional: W1?) -> W1?
func all<W1, W2>(_ optional1: W1?, optional2: W2?) -> (W1, W2)?
func all<W1, W2, W3>(_ optional1: W1?, optional2: W2?, optional3: W3?) -> (W1, W2, W2)?

Con paquetes de parámetros, puedes expresar esta API como una única función que no tiene límite superior, lo que te permite pasar cualquier número de argumentos:

1
func all<each Wrapped>(_ optional: repeat (each Wrapped)?) -> (repeat each Wrapped)?

Llamar a una API que utiliza paquetes de parámetros es intuitivo y no requiere trabajo adicional:

1
2
3
4
5
6
let (int, double, string, bool) = all(optionalInt, optionalDouble, optionalString, optionalBool) {
  print(int, double, string, bool)
}
else {
  print("recibido un nulo")
}

Características Adicionales

Swift 5.9 también incluye cambios más pequeños que mejoran la calidad de vida en el lenguaje, como la capacidad de usar “if” y “switch” como expresiones para asignación de variables y valores de retorno:

1
2
3
statusBar.text = if !tieneConexión { "Desconectado" }
                 else if let error = últimoError { error.localizedDescription }
                 else { "Listo" }

Experiencia del Desarrollador

Manejo de Crashes

El tiempo de ejecución de Swift ahora atrapará los crashes del programa y los errores de tiempo de ejecución de Swift, mostrando una traza en la salida del programa. El rastreador está fuera del proceso e incluye soporte para funciones asíncronas.

Esta característica también está disponible en macOS, pero está desactivada por defecto. Para habilitarla, establece SWIFT_BACKTRACE=enable=yes y firma tu programa con el “entitlement” com.apple.security.get-task-allow.

Ecosistema

Interoperabilidad con C++

Swift 5.9 admite interoperabilidad bidireccional con C++ y Objective-C++ para ciertos tipos de API.

Por ejemplo, si tienes una función C++ como esta:

1
2
3
4
// Módulo Clang 'PromptResponder'
#pragma once
#include <vector>
std::vector<std::string> generatePromptResponse(std::string prompt);

Puedes llamarla directamente desde tu código Swift:

1
2
3
4
5
6
7
import PromptResponder
let codeLines = generatePromptResponse("Escribe código Swift que imprima hola mundo")
  .map(String.init)
  .filter { !$0.isEmpty }
for line in codeLines {
  print(line)
}

La interoperabilidad con C++ está evolucionando activamente, y algunos aspectos pueden cambiar en futuras versiones a medida que la comunidad recopila comentarios de la adopción del mundo real en bases de código mixtas de Swift y C++.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.