- Rust y Swift comparten un sistema de tipos sólido y características de lenguajes funcionales, y gracias a compiladores basados en LLVM pueden compilarse a código nativo y WASM
- Rust comenzó como un lenguaje de sistemas de bajo nivel y luego incorporó funciones de más alto nivel, mientras que Swift comenzó como un lenguaje de alto nivel y permite acceso de bajo nivel cuando hace falta
- Swift usa por defecto tipos por valor y Copy-on-Write, e implementa conceptos similares al modelo de ownership de Rust con una sintaxis más simple
- En tipos opcionales, manejo de errores y enums recursivos, Swift envuelve conceptos de Rust con una sintaxis familiar de la familia C, ofreciendo mayor comodidad al desarrollador
- Swift sigue evolucionando como lenguaje multiplataforma y puede usarse en Windows, Linux y entornos embebidos, por lo que surge como alternativa a Rust
Similitudes y diferencias entre Rust y Swift
- Ambos lenguajes incluyen características de lenguajes funcionales (enum etiquetados, expresiones match/switch, genéricos y funciones de primera clase)
- Rust ofrece conteo de referencias y control de copias mediante
Rc, Arc, Cow
- Swift usa por defecto tipos por valor y Copy-on-Write y, cuando es necesario, admite movimiento de ownership (move) y acceso a punteros unsafe
- Ambos usan compiladores basados en LLVM, por lo que pueden compilarse a código nativo y WASM
Modelo de memoria: Rust de arriba hacia abajo, Swift de abajo hacia arriba
- Rust parte como lenguaje de sistemas de bajo nivel y luego ofrece funciones de alto nivel
- Swift parte como lenguaje de alto nivel y permite acceso de bajo nivel cuando es necesario
- El modelo de memoria base de Swift son los tipos por valor con Copy-on-Write, similares a
Cow<> de Rust
- Rust es rápido por defecto, pero al usar
Cow<> hay que manejarlo explícitamente
- Swift es simple por defecto, y permite elegir mover en lugar de copiar
Enfoque sintáctico de Swift: ocultar conceptos de Rust con estilo C
- La sentencia
switch de Swift cumple prácticamente la misma función que la expresión match de Rust
- Soporta pattern matching y no tiene
fallthrough
- El
enum de Swift puede incluir métodos directamente, por lo que permite un uso más orientado a objetos que Rust
- Los tipos opcionales (
T?) son el mismo concepto que Option<T> en Rust, y nil corresponde a None
- En Swift se pueden desempaquetar de forma segura con la sintaxis
if let val
- El manejo de errores es similar al tipo
Result de Rust, y do-catch y try en Swift son la misma estructura envuelta en una sintaxis más familiar
Diferencias en el comportamiento del compilador
- El compilador de Rust se centra en detectar problemas y advertirlos; por ejemplo, obliga a usar
Box<> al definir enum recursivos
- Swift maneja enums recursivos solo con la palabra clave
indirect, y el compilador automatiza internamente la gestión de punteros
- Swift automatiza más procesos que Rust, por lo que el desarrollador necesita lidiar menos directamente con la estructura de memoria
Utilidad práctica de Swift y extensibilidad del lenguaje
- Swift fue diseñado para reemplazar Objective-C, por lo que es un lenguaje más grande y práctico
- Incluye muchas funciones como clases/herencia, async-await, actors, propiedades lazy, property wrappers, Result Builders y más
- Con un diseño de “divulgación progresiva (progressive disclosure)”, a medida que avanzas en el aprendizaje se van revelando más funciones
Equilibrio entre comodidad y rendimiento
- Swift es un lenguaje fácil para empezar y productivo, mientras que Rust es un lenguaje rápido por defecto
- En Rust “la rapidez es la base”; en Swift “la comodidad es la base”
- Rust es adecuado para sistemas, embebidos, compiladores y motores de navegador
- Swift es adecuado para UI, servidores y algunos componentes del sistema operativo, y las áreas de uso de ambos lenguajes se superponen cada vez más
Expansión multiplataforma de Swift
- Swift ya no es un lenguaje exclusivo de Apple
- Windows: The Browser Company lo usa para compartir código del navegador Arc
- Linux: Apple apoya Swift on Server y patrocina conferencias
- Embedded Swift: se usa en dispositivos pequeños como Panic Playdate
- El blog oficial de Swift presenta proyectos para Windows, Embedded, Linux(Gnome) y Playdate
- Swift también mejora la experiencia de desarrollo fuera de Xcode con una extensión para VSCode, open source del LSP y más
Limitaciones de Swift y su posición actual
- El tiempo de compilación es lento, al igual que en Rust
- El lenguaje creció por el feature creep, y parte de la sintaxis no resulta familiar
- El ecosistema de paquetes es menos maduro que el de Rust
- Aun así, Swift ya cuenta con estabilidad ABI, Automatic Reference Counting (ARC), funciones para elegir ownership y paquetes compatibles con Linux, como lenguaje multiplataforma
- Swift se está posicionando como una alternativa más conveniente que Rust y existe como una opción actual, no como un futuro por esperar
1 comentarios
Opiniones de Hacker News
En general estoy de acuerdo, pero en los detalles se ve el verdadero problema
Xcode es un IDE tosco que se cuelga seguido en proyectos grandes al refrescar paquetes o manejar múltiples targets. Y aunque quisieras arreglarlo, no se puede parchear el binario
El sistema de build es mucho más fácil de manejar con Cargo que con SPM. El sistema de macros todavía depende de generación de código externa
Hay linters y formatters, pero su calidad es baja. Swift tiene muchos precipicios de rendimiento, y como la inferencia de tipos es bidireccional, se vuelve lenta en expresiones complejas. Esto pega especialmente en casos de uso importantes como SwiftUI
Los imports están atados a nivel de módulo, así que aunque cambies un solo archivo hay que recompilar todo el módulo. La distinción entre clases y structs también se siente rara por compatibilidad con ObjC
Al final, Swift podría ser un lenguaje más fácil que Rust, pero en la práctica no lo parece por la inmadurez de su tooling
Siento que el modelo de memoria semiautomático de Swift es mucho más difícil de manejar que el de Rust o Go
swift, y funciona bastante bien. También corre bien en Linux y WindowsSe dijo que en Rust hace falta
Boxpara expresar una estructura de árbol con enum, pero en realidad no es necesario porqueVecya da una referencia al heapEn Rust, enum, struct, union e incluso tipos primitivos pueden tener métodos. Por ejemplo, se puede llamar algo como
'F'.to_digit(16)Incluso a un raw pointer se le pueden agregar métodos. Eso me parece parte del diseño moderno de Rust
VecyBox.Veces un handle de tamaño fijo en compilación, mientras queBoxhace falta para manejar tipos unsizedBoxVec<T>en sí es un handle de tamaño fijo que apunta a datos en el heap, así que no hace faltaBoxSwift es un lenguaje genial, pero del lado server-side convence poco
El ecosistema es chico, y frente a Go o Rust no ofrece mucho para ganar. El soporte en VSCode también es flojo y no quiero usar Xcode
El desarrollo de servidores ya está ocupado por Python, TypeScript, Go y Rust. El ecosistema cerrado de Apple también pesa
Me parece que la calidad del IDE es mejor que en otros lenguajes, aunque para programación de sistemas Rust sigue siendo más adecuado
Se dice que Swift ya es un lenguaje multiplataforma, pero en Linux sigue siendo un ecosistema centrado en Apple
La documentación, los tutoriales y las librerías están escritos pensando en macOS. Me pregunto si realmente hay gente usando Swift sin dispositivos Apple
Resumí en un blog lo que pasé al hacer un cliente WebSocket
Versión 2023 / Versión 2025
El soporte para Android también es interesante, pero siento que con Kotlin alcanza
En lo personal mantengo librerías con soporte incluso para Windows. No es perfecto, pero va mejorando
El
switchde Swift es básicamente una expresión match. Solo cambia la sintaxis, pero hace pattern matchingswitchy reducir la confusión de los desarrolladoresIntroduce un significado nuevo con una sintaxis familiar para facilitar una transición gradual
Este enfoque lleva a una discusión interesante sobre hasta qué punto un lenguaje debería perseguir un diseño fuertemente opinado
La clave de Rust es la zero-cost abstraction. Swift no sigue ese principio
Muchas funciones de Rust fueron diseñadas para respetar esa regla, y el modelo de ownership es el ejemplo más representativo
Tiene una curva de aprendizaje, pero mejora la productividad de desarrollo
Se dijo que Arc Browser usó Swift para Windows, pero después de la cancelación del desarrollo parece que ese trabajo relacionado también fue cancelado
Prefiero Rust porque no tiene dependencia de una gran corporación. Creo que Apple podría abandonar Swift
Eso también está indicado en Wikipedia
Aprovechando las funciones de reference counting de Rust, se puede obtener comodidad sin pasarse a Swift
Con
Rcse logran referencias compartidas inmutables, y con interior mutability se pueden implementar cambios con chequeos en runtimeDocumentación de Rc, documentación de interior mutability
He creado herramientas de análisis y compiladores para Linux tanto en Swift como en Rust
En Swift, ARC hace más cómoda la gestión de memoria; Rust exige pensar más, pero la calidad del tooling es muchísimo mejor
Clippy y el soporte de LSP son excelentes, y Swift trae muchas cosas incluidas de base
Aun así, como la comunidad de Rust es más grande, es más fácil encontrar gente, y también veo potencial en Swift como lenguaje sustituto de C++