El concepto de "routing" en el desarrollo de aplicaciones iOS, especialmente con Swift y SwiftUI, se refiere al sistema que gestiona la navegación entre diferentes pantallas o vistas dentro de una aplicación. Un enrutamiento bien diseñado es fundamental para crear experiencias de usuario fluidas y predecibles. En el contexto de SwiftUI, el routing se integra de manera nativa a través de mecanismos como NavigationStack y el modificador navigationDestination, permitiendo un control granular sobre el flujo de la aplicación.

Entendiendo la Enumeración de Rutas (Route Enumeration)
La enumeración Route representa un sistema integral de mapeo de navegación en aplicaciones SwiftUI. Esta implementación define una forma segura en cuanto a tipos (type-safe) para manejar diferentes destinos de navegación dentro de una aplicación. Al conformarse al protocolo Hashable, permite que el sistema de navegación de SwiftUI identifique y gestione de manera eficiente las diferentes rutas de forma única.
Esta enumeración sirve como una definición central de todos los posibles destinos de navegación en la aplicación. Cada caso representa una pantalla o vista única a la que los usuarios pueden navegar. La implementación combina rutas simples (como home y settings) y rutas parametrizadas (como detail y profile) para manejar diversos escenarios de navegación.
enum Route: Hashable { case home case detail(id: Int) case profile(username: String) case settings case categories(categoryId: Int) case productList(categoryId: Int) case productDetail(productId: Int)}Casos de Rutas y su Significado
home: Representa la pantalla principal de la aplicación, sirviendo como la raíz de la jerarquía de navegación. Es un caso simple sin valores asociados, típicamente utilizado para regresar al punto de partida de la aplicación.detail(id: Int): El casodetail, con su valor entero asociadoid, permite la navegación a vistas de detalle específicas. Esto es útil para mostrar información detallada sobre un elemento particular, identificado por su ID.profile(username: String): El casoprofiledemuestra cómo manejar la navegación específica del usuario aceptando un parámetro de cadenausername. Esto permite una navegación dinámica a páginas de perfil mientras se mantiene la seguridad de tipos y el paso claro de parámetros.settings: El casosettings, al igual quehome, es una ruta sencilla sin parámetros, típicamente utilizada para acceder a las pantallas de configuración de la aplicación o preferencias del usuario.categories(categoryId: Int): Este caso, junto conproductListyproductDetail, forma una estructura de navegación jerárquica común en aplicaciones de comercio electrónico. Permite navegar a una lista de categorías específicas, identificadas por sucategoryId.productList(categoryId: Int): Permite navegar a una lista de productos dentro de una categoría específica.productDetail(productId: Int): Permite navegar a la vista de detalle de un producto específico, identificado por suproductId.
Implementación de la Navegación con SwiftUI
La NavigationStack, vinculada a la ruta del enrutador (router’s path), proporciona la base para la navegación de vistas. La jerarquía de vistas comienza con HomeView como raíz, y el modificador navigationDestination define cómo las diferentes rutas se mapean a sus vistas correspondientes. Cada caso en la declaración switch corresponde a una ruta específica definida en nuestra enumeración Route, manejando escenarios de navegación tanto simples como parametrizados.
El modificador .environmentObject(router) hace que la instancia del enrutador esté disponible en toda la jerarquía de vistas, permitiendo que cualquier vista hija acceda y desencadene cambios de navegación.

Por ejemplo, el botón de detalle del producto navega a un producto específico utilizando su ID, y el botón de categorías lleva a una lista de categorías con un ID de categoría especificado. El botón de configuración demuestra la navegación básica sin parámetros.
Manejador de Lógica de Negocio y Navegación
Si se desea, todas estas operaciones de navegación pueden ser gestionadas con un enfoque más lógico desde el lado del viewModel. Los métodos de otra operación de enrutamiento se ejemplifican aquí.
La clase se marca como ObservableObject, lo que permite a las vistas SwiftUI observar y reaccionar a los cambios. Toma una instancia de Router a través de su inicializador, almacenándola como una propiedad privada para manejar la navegación. Este patrón de inyección de dependencias asegura que el viewModel tenga acceso a las capacidades de navegación mientras mantiene un encapsulamiento adecuado.
class ProductViewModel: ObservableObject { private let router: Router init(router: Router) { self.router = router } func navigateToRelatedProduct(id: Int) { router.navigate(to: .productDetail(productId: id)) } func backToList() { router.navigateBack() } func addToCart() { print("Product added to basket") router.navigateBack() }}El viewModel proporciona tres funciones principales:
navigateToRelatedProduct(id: Int): Navega a la vista de detalle de otro producto, útil para mostrar productos relacionados o recomendados. Utiliza el enrutador para navegar a una nueva vista de detalle de producto con el ID de producto especificado.backToList(): Proporciona una forma de regresar a la vista anterior (probablemente una lista de productos) utilizando la funcionalidad de navegación hacia atrás del enrutador.addToCart(): Simula la adición de un producto al carrito de compras (actualmente solo imprime un mensaje) y luego navega de regreso a la vista anterior.
Navigation in SwiftUI is Difficult | Build a Router
Routing Number y Transferencias Bancarias: Una Perspectiva Financiera
Fuera del ámbito del desarrollo de software, el término "routing" también se utiliza en el contexto financiero, particularmente en Estados Unidos, para referirse al "routing number" o número de ruta.
¿Qué es el Routing Number?
El Routing Number, o número de ruta, es un código de 9 dígitos utilizado por los bancos en Estados Unidos para identificarse. Si tienes que realizar una transferencia a una cuenta en los Estados Unidos, además del account number (número de cuenta), necesitarás el routing number del destinatario para poder enviarla. El Routing Number no es más que un sistema de numeración estandarizado que sirve para identificar una cuenta en los Estados Unidos. No debemos confundir el routing number con el account number. Mientras que el primero identifica al banco o entidad financiera donde está localizada la cuenta, el account number es el código utilizado para identificar la cuenta del cliente dentro de un banco o entidad. El número de ruta va acompañado siempre del número de cuenta.
El número de ruta también se conoce como número de ruta ABA, en relación con la Asociación Estadounidense de Banqueros (American Bankers Association).
Routing Number vs. Código SWIFT
Es importante no confundir el routing number con el código SWIFT.
Routing Number: Se utiliza exclusivamente para transferencias nacionales dentro de los Estados Unidos. Identifica a una institución financiera específica dentro de los Estados Unidos.
Código SWIFT (Society for Worldwide Interbank Financial Telecommunication): Es una red internacional que permite la transferencia de dinero entre instituciones financieras a nivel global. Los códigos SWIFT, compuestos por 8 u 11 caracteres alfanuméricos, identifican bancos y sucursales en todo el mundo, facilitando las transacciones internacionales.
Si bien los routing numbers son para transacciones domésticas en EE. UU., los códigos SWIFT son la clave para las transacciones internacionales.

Consideraciones para Transferencias Internacionales
Para aquellos que necesitan operar con cuentas bancarias en Estados Unidos desde otros países, como Chile, existen soluciones. Por ejemplo, la cuenta Wise (anteriormente TransferWise) ofrece la posibilidad de abrir una cuenta online sin costos de apertura ni mantenimiento, proporcionando datos locales en dólares estadounidenses, euros, libras esterlinas y otras divisas. Esta alternativa combina versatilidad con un esquema de comisiones transparentes y bajas, siendo una opción conveniente para quienes reciben o envían dinero internacionalmente.
Routing en Sistemas Financieros Complejos
En el ámbito de las transacciones financieras interbancarias, especialmente con el protocolo SWIFT, el routing puede volverse significativamente más complejo. Los administradores deben enrutar diferentes tipos de documentos SWIFT a destinos variados, como pagos, transferencias a instituciones financieras, tesorería, valores o gestión de efectivo. Para este tipo de enrutamiento SWIFT, se deben considerar el código BIC (Bank Identifier Code, que es básicamente el código SWIFT) y el ID de terminal lógico del remitente, así como la dirección de destino.
Generalmente, se necesitan instalaciones para analizar el contenido de todos los campos de encabezado y carga útil en mensajes MT (Message Type) y la información correspondiente en mensajes MX estructurados en XML. Esto permite implementar algoritmos complejos para determinar un destino de enrutamiento SWIFT. Algunos proveedores de soluciones de interfaz SWIFT recomiendan el uso de productos de middleware, como IBM WebSphere Message Broker, o soluciones integradas que incluyen facilidades de enrutamiento SWIFT, como Intercope’s Box for SWIFTNet. En estas soluciones, las interfaces gráficas de usuario permiten analizar todos los elementos de un mensaje, incluyendo subcadenas y expresiones regulares, para determinar cualquier número de destinos de enrutamiento SWIFT para cualquier tipo de mensaje o acuse de recibo.
El Futuro del Routing: Bidireccionalidad y Seguridad de Tipos
En el desarrollo de aplicaciones modernas, especialmente aquellas que buscan una mayor robustez y seguridad, el concepto de routing bidireccional con seguridad de tipos mejorada es cada vez más relevante. Una biblioteca que implementa este enfoque se basa en un ejercicio de modelado de dominio. Se codifican únicamente los datos que se desean extraer de una URL. Estos detalles son determinados por un enrutador, que puede ser construido con las herramientas proporcionadas por la biblioteca. Su propósito es transformar una URL entrante en un tipo AppRoute. Una vez definido este enrutador, se puede utilizar para implementar lógica de "deep-linking" (enlaces profundos) en una aplicación. Este tipo de enrutamiento es increíblemente útil en aplicaciones iOS del lado del cliente, pero también puede ser utilizado en aplicaciones del lado del servidor.
Este enfoque garantiza que la navegación sea más predecible y menos propensa a errores, ya que el sistema está diseñado para manejar rutas de manera segura y explícita. La capacidad de transformar una URL en un tipo de ruta de aplicación específico permite una integración fluida con los sistemas de navegación nativos y una mejor gestión de las interacciones del usuario.