Swift es un lenguaje de programación compilado , de alto nivel , de propósito general y multiparadigma , creado por Chris Lattner en 2010 para Apple Inc. y mantenido por la comunidad de código abierto . Swift se compila a código máquina y utiliza un compilador basado en LLVM . Swift se lanzó por primera vez en junio de 2014 [ 13 ] y el conjunto de herramientas de Swift se incluye en Xcode desde la versión 6, lanzada en septiembre de 2014.
Apple concibió Swift para que soportara muchos conceptos centrales asociados con Objective-C , en particular el despacho dinámico , el enlace tardío generalizado , la programación extensible y características similares, pero de una manera "más segura", lo que facilita la detección de errores de software ; Swift tiene características que abordan algunos errores de programación comunes como la desreferenciación de punteros nulos y proporciona azúcar sintáctico para ayudar a evitar la pirámide de la perdición . Swift soporta el concepto de extensibilidad de protocolo , un sistema de extensibilidad que se puede aplicar a tipos, estructuras y clases , que Apple promueve como un cambio real en los paradigmas de programación que denominan "programación orientada a protocolos" [ 14 ] (similar a los rasgos y las clases de tipos ). [ 15 ]
Swift se presentó en la Conferencia Mundial de Desarrolladores (WWDC) de Apple de 2014. [ 16 ] Se actualizó a la versión 1.2 durante 2014 y a una actualización importante a Swift 2 en la WWDC de 2015. Inicialmente era un lenguaje propietario , pero la versión 2.2 se convirtió en software de código abierto bajo la Licencia Apache 2.0 el 3 de diciembre de 2015 para las plataformas de Apple y Linux . [ 17 ] [ 18 ]
Historia
El desarrollo de Swift comenzó en julio de 2010 de la mano de Chris Lattner , con la posterior colaboración de muchos otros programadores de Apple . Swift surgió de la necesidad de reemplazar el lenguaje de programación anterior de Apple, Objective-C , que prácticamente no había sufrido cambios desde principios de la década de 1980 y carecía de características modernas. Swift tomó ideas de lenguajes como Objective-C , Rust , Haskell , Ruby , Python , C# , CLU y muchos otros. [ 7 ] El 2 de junio de 2014, la aplicación de la Conferencia Mundial de Desarrolladores de Apple (WWDC) se convirtió en la primera aplicación publicada escrita en Swift. [ 19 ] Se lanzó una versión beta del lenguaje de programación para los desarrolladores registrados de Apple en la conferencia, pero la compañía no garantizó que la versión final de Swift fuera compatible con el código fuente de la versión de prueba. Apple planeaba ofrecer convertidores de código fuente si fuera necesario para el lanzamiento completo. [ 19 ]
El manual gratuito de 500 páginas sobre el lenguaje de programación Swift también se presentó en la WWDC y está disponible en la Apple Books Store y en el sitio web oficial. [ 20 ]
Swift alcanzó el hito 1.0 el 9 de septiembre de 2014, con la versión Gold Master de Xcode 6.0 para iOS . [ 21 ] Swift 1.1 se lanzó el 22 de octubre de 2014, junto con el lanzamiento de Xcode 6.1. [ 22 ] Swift 1.2 se lanzó el 8 de abril de 2015, junto con Xcode 6.3. [ 23 ] Swift 2.0 se anunció en la WWDC 2015 y se puso a disposición para publicar aplicaciones en la App Store el 21 de septiembre de 2015. [ 24 ]
Swift 3.0 se lanzó el 13 de septiembre de 2016. [ 25 ] A través de la versión 3.0, la sintaxis de Swift experimentó una evolución significativa, y el equipo principal hizo de la estabilidad del código fuente un enfoque en versiones posteriores. [ 26 ] [ 27 ]
Swift 4.0, lanzado el 19 de septiembre de 2017, [ 28 ] introdujo varios cambios en algunas clases y estructuras integradas. El código escrito con versiones anteriores de Swift se puede actualizar utilizando la funcionalidad de migración integrada en Xcode. Swift 4.1 se lanzó el 29 de marzo de 2018. [ 29 ] En el primer trimestre de 2018, Swift superó a Objective-C en popularidad medida. [ 30 ]
Swift 5, lanzado en marzo de 2019, introdujo una interfaz binaria estable en las plataformas de Apple, lo que permitió incorporar el entorno de ejecución de Swift en los sistemas operativos de Apple. Es compatible a nivel de código fuente con Swift 4. [ 31 ]
Swift 5.1 se lanzó oficialmente en septiembre de 2019. Swift 5.1 se basa en la versión anterior de Swift 5 al extender las características estables del lenguaje al tiempo de compilación con la introducción de la estabilidad de módulos. La introducción de la estabilidad de módulos hace posible crear y compartir marcos binarios que funcionarán con futuras versiones de Swift. [ 32 ] Swift 5.5, anunciado oficialmente por Apple en la WWDC 2021, amplía significativamente el soporte del lenguaje para la concurrencia y el código asíncrono , introduciendo notablemente una versión única del modelo de actor . [ 33 ] Swift 5.9, se lanzó en septiembre de 2023 e incluye un sistema de macros, paquetes de parámetros genéricos y características de propiedad como el nuevo consumeoperador. [ 34 ] Swift 5.10, lanzado en marzo de 2024, mejora el modelo de concurrencia del lenguaje, permitiendo el aislamiento completo de datos para evitar carreras de datos .
Swift 6 se lanzó en septiembre de 2024. [ 35 ] Swift 6.1 se lanzó en marzo de 2025. Incluye "nuevas mejoras del lenguaje para aumentar la productividad, mejoras en los diagnósticos, características de los paquetes y trabajo continuo para mejorar la usabilidad de la seguridad de las condiciones de carrera y los tiempos de compilación". [ 36 ]
Swift ganó el primer lugar como lenguaje de programación más querido en la encuesta de desarrolladores de Stack Overflow de 2015 [ 37 ] y el segundo lugar en 2016. [ 38 ]
El 3 de diciembre de 2015, el lenguaje Swift, sus bibliotecas de soporte, el depurador y el gestor de paquetes se publicaron como código abierto bajo la licencia Apache 2.0 con una excepción para la biblioteca en tiempo de ejecución [ 39 ] , y se creó Swift.org para alojar el proyecto. El código fuente se encuentra alojado en GitHub , donde cualquiera puede obtenerlo fácilmente, compilarlo e incluso enviar solicitudes de extracción para contribuir con código al proyecto.
En diciembre de 2015, IBM anunció su sitio web Swift Sandbox, que permite a los desarrolladores escribir código Swift en un panel y mostrar la salida en otro. [ 40 ] [ 41 ] [ 42 ] Swift Sandbox fue descontinuado en enero de 2018. [ 43 ]
Durante la WWDC 2016 , Apple anunció una aplicación exclusiva para iPad llamada Swift Playgrounds , diseñada para enseñar a programar en Swift. La aplicación se presenta con una interfaz 3D similar a la de un videojuego , que proporciona retroalimentación cuando las líneas de código se colocan en un orden determinado y se ejecutan. [ 44 ] [ 45 ] [ 46 ]
En enero de 2017, Chris Lattner anunció su salida de Apple para ocupar un nuevo puesto en Tesla Motors , y el rol de líder del proyecto Swift pasó a manos del veterano del equipo Ted Kremenek. [ 47 ] [ 48 ]
Durante la WWDC 2019, Apple anunció SwiftUI con Xcode 11, que proporciona un marco para el diseño declarativo de la estructura de la interfaz de usuario en todas las plataformas de Apple. [ 49 ]
Las descargas oficiales del SDK y la cadena de herramientas para la distribución Ubuntu de Linux han estado disponibles desde Swift 2.2, y se han añadido más distribuciones desde Swift 5.2.4, CentOS y Amazon Linux. [ 50 ] Existe un SDK no oficial y un paquete de cadena de herramientas nativa para Android , [ 51 ] [ 52 ] y en octubre de 2025 el grupo de trabajo de Android de Swift anunció una versión preliminar del SDK oficial de Swift para Android. [ 53 ]
Plataformas
Las plataformas compatibles con Swift son los sistemas operativos de Apple ( Darwin , iOS , iPadOS , macOS , tvOS , watchOS ), Linux , Windows , WebAssembly y Android . [ 54 ] [ 55 ]
Un aspecto clave del diseño de Swift es su capacidad de interoperar con el enorme conjunto de código Objective-C existente desarrollado para productos de Apple durante las décadas anteriores, como Cocoa y los frameworks Cocoa Touch . En las plataformas de Apple, [ 56 ] se enlaza con la biblioteca de tiempo de ejecución de Objective-C , lo que permite que el código C , Objective-C , C++ y Swift se ejecute dentro de un mismo programa. [ 57 ]
Historial de versiones
Características
Swift es un lenguaje de programación de propósito general que emplea conceptos modernos de la teoría de lenguajes de programación y busca ofrecer una sintaxis sencilla pero potente. Swift incorpora innovaciones y convenciones de diversos lenguajes de programación, con una notable inspiración en Objective-C, al que reemplazó como lenguaje de desarrollo principal en las plataformas de Apple.
Swift fue diseñado para ser seguro y amigable para los nuevos programadores sin sacrificar la velocidad. Por defecto, Swift gestiona toda la memoria automáticamente y garantiza que las variables siempre se inicialicen antes de su uso. Se comprueban los accesos a arrays para detectar errores de acceso fuera de límites y las operaciones con enteros para detectar desbordamientos. Los nombres de los parámetros permiten crear API claras. Los protocolos definen las interfaces que pueden adoptar los tipos, mientras que las extensiones permiten a los desarrolladores añadir más funcionalidades a los tipos existentes. Swift habilita la programación orientada a objetos con soporte para clases , subtipos y sobreescritura de métodos . Los opcionales permiten manejar valores nulos de forma explícita y segura. Se pueden escribir programas concurrentes utilizando la sintaxis async/await , y los actores aíslan el estado mutable compartido para eliminar las condiciones de carrera. [ 78 ] [ 79 ]
Sintaxis básica
La sintaxis de Swift es similar a la de los lenguajes de estilo C. El código comienza a ejecutarse en el ámbito global por defecto. [ 80 ] Alternativamente, el atributo se puede aplicar a una declaración de estructura, clase o enumeración para indicar que contiene el punto de entrada del programa. [ 81 ]@main
El programa "¡Hola, mundo!" de Swift es:
imprimir ( "¡Hola, mundo!" )La función utilizada aquí está incluida en la biblioteca estándar de Swift, que está disponible para todos los programas sin necesidad de importar módulos externos. Las sentencias en Swift no tienen que terminar con un punto y coma; sin embargo, se requieren puntos y coma para separar varias sentencias escritas en la misma línea. Los comentarios de una sola línea comienzan con y continúan hasta el final de la línea actual. Los comentarios de varias líneas están contenidos entre los caracteres y . Las constantes ( variables que no se pueden modificar) se declaran con la palabra clave , mientras que las variables declaradas con la palabra clave pueden cambiar. Los valores deben inicializarse antes de leerlos. Las variables pueden inferir su tipo en función del tipo del valor inicial proporcionado. Si el valor inicial se establece después de la declaración del valor, se debe declarar un tipo explícitamente. [ 80 ]print(_:separator:terminator:)///**/letvar
let highScoreThreshold = 1000 // Una constante de tipo Int. El tipo se infirió en función del valor proporcionado.var currentScore = 980 // Una variable de tipo Int.currentScore = 1200 // El valor de las variables puede cambiar con el tiempo.let playerMessage : String // Una constante con tipo explícito String.Si currentScore > highScoreThreshold {playerMessage = "¡Eres un jugador de primera!"} demás {playerMessage = "Mejor suerte la próxima vez."}print ( playerMessage ) // Imprime "¡Eres un jugador de primera!"El flujo de control en Swift se gestiona con sentencias if-else , guard y switch , junto con bucles while y for-in . Estas ifsentencias reciben un parámetro booleano y ejecutan el cuerpo de la ifsentencia si la condición es verdadera; de lo contrario, ejecutan el elsecuerpo opcional. La sintaxis proporciona azúcar sintáctico para comprobar la existencia de un valor opcional y desenvolverlo simultáneamente.if-let
sea algúnNúmero = 42Si someNumber % 2 == 0 { // Usa el operador de resto para encontrar el resto de someNumber dividido por 2.print ( " \( someNumber ) es par." )} demás {print ( " \( someNumber ) es impar." )}// Imprime "42 es par."Las funciones se definen con la palabra clave `function`. Los parámetros de función pueden tener nombres que permiten que las llamadas a funciones se lean como frases. Un guion bajo antes del nombre del parámetro permite omitir la etiqueta del argumento en la llamada. Las funciones pueden usar tuplas para devolver varios datos a la vez.func
func constructGreeting ( for name : String ) -> String {devolver "¡Hola \( nombre ) !"}let saludo = construirSaludo ( para : "Craig" )imprimir ( saludo ) // Imprime "¡Hola Craig!"Las funciones, y las funciones anónimas conocidas como cierres , se pueden asignar a propiedades y pasar por el programa como cualquier otro valor.
func divideByTwo ( _ aNum : Int ) -> Int {devolver unNum / 2}func multiplicarPorDos ( _ aNum : Int ) -> Int {devolver unNum * 2}sea operaciónmatemática = multiplicarPorDosprint ( mathOperation ( 21 )) // Imprime "42"Las sentencias requieren que la condición dada sea verdadera antes de continuar después de la sentencia; de lo contrario, se ejecuta guardel cuerpo de la cláusula proporcionada . La cláusula debe salir del control del bloque de código en el que aparece la sentencia. Las sentencias son útiles para garantizar que se cumplan ciertos requisitos antes de continuar con la ejecución del programa. En particular, se pueden usar para crear una versión sin encapsular de un valor opcional que se garantiza que no será nulo durante el resto del ámbito que la contiene.guardelseelseguardguard
func divide ( numerador : Int ?, porDenominador denominador : Int ) -> Int ? {guard denominador != 0 else {print ( "No se puede dividir por 0." )devolver cero}guarda el numerador de lo contrario {imprimir ( "El numerador proporcionado es nulo." )devolver cero}Devuelve el numerador / denominador}sea resultado = dividir ( numerador : 3 , porDenominador : 0 )print ( "El resultado de la división es: \( resultado ) " )// Impresiones:// "No se puede dividir por 0."// "El resultado de la división es: nulo."switchLas sentencias comparan un valor con múltiples valores potenciales y luego ejecutan un bloque de código asociado. switchLas sentencias deben ser exhaustivas, ya sea incluyendo casos para todos los valores posibles o incluyendo un defaultcaso que se ejecute cuando el valor proporcionado no coincida con ninguno de los otros casos. switchLos casos no se ejecutan implícitamente, aunque pueden hacerlo explícitamente con la fallthroughpalabra clave. La coincidencia de patrones se puede usar de varias maneras dentro de switchlas sentencias. Aquí hay un ejemplo de un número entero que se compara con varios rangos potenciales:
sea algúnNúmero = 42cambiar algúnNúmero {caso ..< 0 :imprimir ( " \( algúnNúmero ) negativo." )caso 0 :print ( " \( someNumber ) es 0." )caso 1. .. 9 :print ( " \( algúnNúmero ) mayor que 0, pero menor que 10." )por defecto :print ( " \( someNumber ) es mayor que 9." )}// Imprime "42 es mayor que 9."for-inLos bucles iteran sobre una secuencia de valores:
let nombres = [ "Will" , "Anna" , "Bart" ]para nombre en nombres {imprimir ( nombre )}// Impresiones:// Voluntad// Anna// BartwhileLos bucles se repiten mientras la condición booleana dada se evalúe como true:
// Suma todos los números del 1 al 5.var i = 1var resultado = 0mientras i <= 5 { // El bucle ejecuta su cuerpo mientras i sea menor o igual a 5. resultado += i // Sumar i al resultado actual.i += 1 // Incrementa i en 1.}imprimir ( resultado ) // Imprime "15"Soporte para el cierre
Swift admite cierres , que son bloques de funcionalidad autocontenidos que se pueden pasar y usar en el código, [ 82 ] y también se pueden usar como funciones anónimas . Aquí hay algunos ejemplos:
// El tipo de cierre, definido por sus valores de entrada y salida, se puede especificar fuera del cierre:let closure1 : ( Int , Int ) -> Int = { arg1 , arg2 endevolver arg1 + arg2}// …o dentro de él:let closure2 = { ( arg1 : Int , arg2 : Int ) -> Int indevolver arg1 + arg2}// En la mayoría de los casos, el compilador puede inferir automáticamente el tipo de retorno de la función anónima.let closure3 = { arg1 : Int , arg2 : Int indevolver arg1 + arg2}Los cierres se pueden asignar a variables y constantes, y se pueden pasar a otras funciones o cierres como parámetros. Los cierres de una sola expresión pueden omitir la returnpalabra clave.
Swift también cuenta con una sintaxis de cierre final, que permite escribir el cierre después de la llamada a la función en lugar de dentro de la lista de parámetros de la función. Los paréntesis pueden omitirse por completo si el cierre es el único parámetro de la función.
// Esta función toma un cierre que no recibe parámetros de entrada y devuelve un entero,// lo evalúa y utiliza el valor de retorno del cierre (un Int) como valor de retorno de la función.func foo ( closure bar : () -> Int ) -> Int {barra de retorno ()}// Sin sintaxis de cierre final:foo ( cierre : { return 1 })// Con sintaxis de cierre final y retorno implícito:foo { 1 }A partir de la versión 5.3, Swift admite múltiples cierres finales: [ 83 ]
// Esta función pasa el valor de retorno del primer cierre como parámetro del segundo, // y devuelve el resultado del segundo cierre: func foo ( bar : () -> Int , baz : ( Int ) -> Int ) -> Int { return baz ( bar ()) }// Sin cierres finales: foo ( bar : { return 1 }, baz : { x in return x + 1 })// Con 1 cierre final: foo ( bar : { return 1 }) { x in return x + 1 }// Con 2 cierres finales (solo se omite el nombre del argumento del primer cierre): foo { return 1 } baz : { x in return x + 1 }Swift proporcionará nombres de argumentos abreviados para cierres en línea, eliminando la necesidad de nombrar explícitamente todos los parámetros de los cierres. [ 84 ] Los argumentos pueden ser referenciados con los nombres $0, $1, $2, etc.:
let nombres = [ "Josephine" , "Steve" , "Chris" , "Barbara" ]// filter llama a la función anónima dada para cada valor en names. // Se conservan los valores con un recuento de caracteres menor a 6, los demás se descartan. let shortNames = names . filter { $0 . count < 6 }print ( shortNames ) // Imprime "["Steve", "Chris"]"Los cierres pueden capturar valores de su ámbito circundante. El cierre hará referencia a este valor capturado mientras exista el cierre:
func makeMultiplier ( withMultiple multiple : Int ) -> ( Int ) -> ( Int ) { // Crea y devuelve una función anónima que recibe un Int y devuelve la entrada multiplicada por el valor de multiple. return { $0 * multiple } }let multiplier = makeMultiplier ( withMultiple : 3 ) print ( multiplier ( 3 )) // Imprime "9" print ( multiplier ( 10 )) // Imprime "30"Soporte de cadenas
StringLa biblioteca estándar de Swift incluye tipos compatibles con Unicode Character. Los valores de cadena se pueden inicializar con un literal de cadena, una secuencia de caracteres entre comillas dobles. Las cadenas se pueden concatenar con el +operador:
var someString = "Hola", someString += "mundo!"La interpolación de cadenas permite crear una nueva cadena a partir de otros valores y expresiones. Los valores escritos entre paréntesis precedidos por una \se insertarán en la cadena literal que los contiene: [ 85 ]
var currentScore = 980 print ( "Tu puntuación es \( currentScore ) ." )// Imprime "Tu puntuación es 980."Se puede utilizar un bucle for-in para iterar sobre los caracteres contenidos en una cadena:
para cada carácter en "Swift" { imprimir ( carácter ) } // S // w // i // f // tSi se importa el framework Foundation, Swift crea un puente invisible entre el tipo String y NSString (la clase String que se usa comúnmente en Objective-C).
objetos invocables
En Swift, los objetos invocables se definen usando callAsFunction. [ 86 ]
struct CallableStruct { var value : Int func callAsFunction ( _ number : Int , scale : Int ) { print ( scale * ( number + value )) } } let callable = CallableStruct ( value : 100 ) callable ( 4 , scale : 2 ) callable . callAsFunction ( 4 , scale : 2 ) // Ambas llamadas a funciones imprimen 208.Control de acceso
Swift admite cinco niveles de control de acceso para símbolos: open, public, internal, fileprivate, y private. A diferencia de muchos lenguajes orientados a objetos, estos controles de acceso ignoran las jerarquías de herencia : privateindica que un símbolo es accesible solo en el ámbito inmediato , fileprivateindica que es accesible solo desde dentro del archivo , internalindica que es accesible dentro del módulo contenedor , publicindica que es accesible desde cualquier módulo y open(solo para clases y sus métodos) indica que la clase puede ser subclaseada fuera del módulo. [ 87 ]
Opciones y encadenamiento
Una característica importante de Swift son los tipos opcionales , que permiten que las referencias o los valores funcionen de forma similar al patrón común en C , donde un puntero puede referirse a un valor específico o a ningún valor. Esto implica que los tipos no opcionales no pueden provocar un error de puntero nulo ; el compilador puede garantizar que esto no sea posible.
Los tipos opcionales se crean con la Optionalenumeración. Para hacer un Integer que sea anulable, se usaría una declaración similar a . Al igual que en C#, [ 88 ] Swift también incluye azúcar sintáctico para esto, lo que permite indicar que una variable es opcional colocando un signo de interrogación después del nombre del tipo, . [ 89 ] Las variables o constantes que están marcadas como opcionales tienen un valor del tipo subyacente o son . Los tipos opcionales envuelven el tipo base, lo que resulta en una instancia diferente. y son tipos fundamentalmente diferentes, el primero es de tipo mientras que el segundo es un que puede contener algún valor.var optionalInteger: Optional<Int>var optionalInteger: Int?nilStringString?StringOptionalString
Para acceder al valor interno, suponiendo que no sea nulo, debe desenvolverse para exponer la instancia interna. Esto se realiza con el !operador:
let myValue = anOptionalInstance ! .someMethod ()En este caso, el !operador desempaqueta anOptionalInstancepara exponer la instancia interna, permitiendo que se realice la llamada al método sobre ella. Si anOptionalInstancees nulo, se produce un error de puntero nulo, lo que finaliza el programa. Esto se conoce como desempaquetado forzado. Los opcionales se pueden desempaquetar de forma segura mediante el encadenamiento de opcionales, que primero comprueba si la instancia es nula y, si no lo es, la desempaqueta.
let myValue = anOptionalInstance ? .someMethod ()En este caso, el tiempo de ejecución llama someMethodsolo si anOptionalInstanceno es nulo, suprimiendo el error. Se ?debe colocar un después de cada propiedad opcional. Si alguna de estas propiedades es nula, toda la expresión se evalúa como nula. El origen del término encadenamiento proviene del caso más común en el que se encadenan varias llamadas a métodos/obtenidos. Por ejemplo:
let aTenant = aBuilding.tenantList [ 5 ] let theirLease = aTenant.leaseDetails let leaseStart = theirLease ? .startDatese puede reducir a:
let leaseStart = aBuilding . tenantList [ 5 ]. leaseDetails ?. startDateEl uso de opcionales en Swift permite al compilador utilizar el despacho estático porque la acción de desenvolvimiento se llama en una instancia definida (el contenedor), en lugar de ocurrir en un sistema de despacho en tiempo de ejecución.
Tipos de valor
En muchos lenguajes orientados a objetos, estos se representan internamente en dos partes. El objeto se almacena como un bloque de datos en el montón , mientras que su identificador (o "handle") se representa mediante un puntero . Los objetos se pasan entre métodos copiando el valor del puntero, lo que permite que cualquier usuario con una copia acceda a los mismos datos subyacentes en el montón. En cambio, los tipos básicos como los enteros y los valores de coma flotante se representan directamente; el identificador contiene los datos, no un puntero a ellos, y estos se pasan directamente a los métodos mediante copia. Estos estilos de acceso se denominan paso por referencia en el caso de los objetos y paso por valor para los tipos básicos.
Ambos conceptos tienen sus ventajas y desventajas. Los objetos son útiles cuando los datos son extensos, como la descripción de una ventana o el contenido de un documento. En estos casos, el acceso a esos datos se proporciona copiando un valor de 32 o 64 bits, en lugar de copiar una estructura de datos completa. Sin embargo, los valores más pequeños, como los enteros, tienen el mismo tamaño que los punteros (normalmente ambos ocupan una palabra ), por lo que no hay ninguna ventaja en pasar un puntero en lugar de pasar el valor.
Swift ofrece soporte integrado para objetos que utilizan semántica de paso por referencia o paso por valor; la primera utiliza la classdeclaración y la segunda struct, . Las estructuras en Swift tienen casi todas las mismas características que las clases: métodos, implementación de protocolos y uso de mecanismos de extensión. Por esta razón, Apple denomina a todos los datos genéricamente como instancias , en contraposición a objetos o valores. Sin embargo, las estructuras no admiten herencia. [ 90 ]
El programador es libre de elegir qué semántica es más apropiada para cada estructura de datos en la aplicación. Las estructuras más grandes, como las ventanas, se definirían como clases, lo que permitiría pasarlas como punteros. Las estructuras más pequeñas, como un punto 2D, se pueden definir como estructuras, que serán de paso por valor y permitirán el acceso directo a sus datos internos sin indirección ni conteo de referencias. La mejora de rendimiento inherente al concepto de paso por valor es tal que Swift utiliza estos tipos para casi todos los tipos de datos comunes, incluidos Inty Double, y tipos normalmente representados por objetos, como Stringy Array. [ 90 ] El uso de tipos de valor también puede resultar en mejoras de rendimiento significativas en las aplicaciones de usuario. [ 91 ]
Array, Dictionary, y Settodos utilizan la copia en escritura, de modo que sus datos se copian solo si el programa intenta cambiar un valor en ellos. Esto significa que los distintos accesores tienen, en efecto, un puntero al mismo almacenamiento de datos. Así, aunque los datos se almacenan físicamente como una sola instancia en la memoria, a nivel de la aplicación, estos valores están separados y la separación física se impone mediante la copia en escritura solo cuando es necesario. [ 92 ]
Extensiones
Las extensiones añaden nueva funcionalidad a un tipo existente, sin necesidad de crear subclases ni siquiera tener acceso al código fuente original. Las extensiones pueden añadir nuevos métodos, inicializadores, propiedades calculadas, subíndices y conformidades de protocolo. [ 93 ] Un ejemplo podría ser añadir un corrector ortográfico al Stringtipo base, lo que significa que todas las instancias del Stringprograma adquieren la capacidad de realizar la corrección ortográfica. El sistema también se utiliza ampliamente como técnica de organización, permitiendo agrupar código relacionado en extensiones similares a bibliotecas.
Las extensiones se declaran con la extensionpalabra clave.
struct Rectángulo {ancho : Doblealtura : Doble}Extensión Rectángulo {var área : Doble {devolver altura * ancho}}Programación orientada a protocolos
Los protocolos garantizan que un tipo específico implemente un conjunto de métodos o propiedades, lo que significa que otras instancias del sistema pueden llamar a esos métodos en cualquier instancia que implemente dicho protocolo. Esto se utiliza a menudo en los lenguajes de programación orientados a objetos modernos como alternativa a la herencia múltiple , aunque las características no son del todo idénticas.
En Objective-C, y en la mayoría de los demás lenguajes que implementan el concepto de protocolo, es responsabilidad del programador asegurar que los métodos requeridos se implementen en cada clase. [ 94 ] Swift añade la capacidad de agregar estos métodos mediante extensiones y de utilizar programación genérica (genéricos) para implementarlos. En conjunto, esto permite escribir los protocolos una sola vez y admitir una amplia variedad de instancias. Además, el mecanismo de extensión se puede utilizar para agregar conformidad con el protocolo a un objeto que no lo incluya en su definición. [ 95 ]
Por ejemplo, se podría declarar un protocolo llamado Printable, que garantiza que las instancias que se ajusten al protocolo implementen un requisito descriptionde propiedad y printDetails()método:
// Define un protocolo llamado Printable protocol Printable { var description : String { get } // Requisito de propiedad de solo lectura func printDetails () // Requisito de método }Este protocolo ahora puede ser adoptado por otros tipos:
// Adoptar el protocolo Printable en una clase class MyClass : Printable { var description : String { return "Una instancia de MyClass" }func printDetails () { print ( descripción ) } }Las extensiones pueden utilizarse para añadir conformidad con el protocolo a los tipos. Los propios protocolos también pueden extenderse para proporcionar implementaciones predeterminadas de sus requisitos. Los usuarios pueden definir sus propias implementaciones o utilizar la implementación predeterminada.
extensión Printable { // Todas las instancias de Printable recibirán esta implementación, o pueden definir la suya propia. func printDetails () { print ( descripción ) } }// Bool ahora cumple con Printable y hereda la implementación de printDetails() anterior. extensión Bool : Printable { var descripción : String { return "Una instancia de Bool con valor: \( self ) " }}En Swift, al igual que en muchos lenguajes modernos que admiten interfaces, los protocolos se pueden usar como tipos, lo que significa que las variables y los métodos se pueden definir por protocolo en lugar de por su tipo específico:
func getSomethingPrintable () -> any Printable { return true }var someSortOfPrintableInstance = getSomethingPrintable ( ) print ( someSortOfPrintableInstance.description )// Imprime "Una instancia de Bool con valor: true"No importa qué tipo concreto someSortOfPrintableInstancesea, el compilador se asegurará de que cumpla con el protocolo y, por lo tanto, este código es seguro. Esta sintaxis también significa que las colecciones pueden basarse en protocolos, como let printableArray = [any Printable].
Tanto las extensiones como los protocolos se utilizan ampliamente en la biblioteca estándar de Swift; en Swift 5.9, aproximadamente el 1,2 por ciento de todos los símbolos dentro de la biblioteca estándar eran protocolos, y otro 12,3 por ciento eran requisitos de protocolo o implementaciones predeterminadas. [ 96 ] Por ejemplo, Swift utiliza extensiones para agregar el Equatableprotocolo a muchos de sus tipos básicos, como Strings y Arrays, lo que permite compararlos con el ==operador. El Equatableprotocolo también define esta implementación predeterminada:
func !=< T : Equatable >( lhs : T , rhs : T ) -> BoolEsta función define un método que funciona en cualquier instancia que cumpla con Equatable, proporcionando un operador de desigualdad . Cualquier instancia, clase o estructura, obtiene automáticamente esta implementación simplemente por cumplir con Equatable. [ 97 ]
Los protocolos, las extensiones y los genéricos se pueden combinar para crear API sofisticadas. Por ejemplo, las restricciones permiten que los tipos adopten condicionalmente protocolos o métodos en función de las características del tipo que los adopta. Un caso de uso común puede ser agregar un método a los tipos de colección solo cuando los elementos contenidos en la colección sean Equatable:
extensión Array donde Elemento : Equatable {// allEqual estará disponible solo en instancias de Array que contengan elementos Equatable. func allEqual () -> Bool { for element in self { if element != self . first { return false } } return true } }Concurrencia
Swift 5.5 introdujo la concurrencia estructurada en el lenguaje. [ 98 ] La concurrencia estructurada utiliza la sintaxis Async/await, similar a la de Kotlin, JavaScript y Rust. Una función asíncrona se define con la asyncpalabra clave después de la lista de parámetros. Al llamar a una función asíncrona, la awaitpalabra clave debe escribirse antes de la función para indicar que la ejecución podría suspenderse durante la llamada. Mientras una función está suspendida, el programa puede ejecutar otra función concurrente en el mismo programa. Esta sintaxis permite a los programas señalar claramente los posibles puntos de suspensión y evitar una versión de la Pirámide de la Perdición causada por el uso generalizado anterior de las funciones de devolución de llamada de cierre. [ 99 ]
func downloadText ( name : String ) async -> String { let result = // ... algún código de descarga asíncrona ... return result }let texto = await downloadText ( "texto1" )La async letsintaxis permite que varias funciones se ejecuten en paralelo. awaitSe utiliza de nuevo para marcar el punto en el que el programa se suspenderá para esperar a que finalicen las asyncfunciones llamadas anteriormente.
// Cada una de estas llamadas a downloadText se ejecutará en paralelo. async let text1 = downloadText ( name : "text1" ) async let text2 = downloadText ( name : "text2" ) async let text3 = downloadText ( name : "text3" )let textToPrint = await [ text1 , text2 , text3 ] // Suspende hasta que las tres llamadas a downloadText hayan finalizado. print ( textToPrint )Las tareas y los grupos de tareas se pueden crear explícitamente para generar un número dinámico de tareas secundarias durante la ejecución:
let taskHandle = Task { await downloadText ( name : "someText" ) }let resultado = await taskHandle.valorSwift utiliza el modelo Actor para aislar el estado mutable, permitiendo que diferentes tareas modifiquen el estado compartido de forma segura. Los actores se declaran con la actorpalabra clave `actor` y son tipos de referencia, como las clases. Solo una tarea puede acceder al estado mutable de un actor a la vez. Los actores pueden acceder y modificar su propio estado interno libremente, pero el código que se ejecuta en tareas separadas debe marcar cada acceso con la awaitpalabra clave `actor` para indicar que el código puede suspenderse hasta que otras tareas terminen de acceder al estado del actor.
Directorio de actores { var nombres : [ String ] = [] func add ( nombre : String ) { nombres . append ( nombre ) } }let directorio = Directorio ()// El código se suspende hasta que otras tareas terminen de acceder al actor. await directory . add ( name : "Tucker" ) print ( await directory . names )Bibliotecas, entorno de ejecución, desarrollo
En los sistemas Apple, Swift utiliza el mismo entorno de ejecución que el sistema Objective-C existente , pero requiere iOS 7 o macOS 10.9 o superior. También depende de Grand Central Dispatch . [ 100 ] El código Swift y Objective-C se puede utilizar en un mismo programa y, por extensión, también el C y el C++. A partir de Swift 5.9, el código C++ se puede utilizar directamente desde el código Swift. [ 101 ] En el caso de Objective-C, Swift tiene un acceso considerable al modelo de objetos y se puede utilizar para crear subclases, extender y utilizar código Objective-C para proporcionar soporte de protocolo. [ 102 ] Lo contrario no es cierto: una clase Swift no se puede subclasear en Objective-C. [ 103 ]
Para facilitar el desarrollo de dichos programas y la reutilización de código existente, Xcode 6 y versiones posteriores ofrecen un sistema semiautomatizado que crea y mantiene un archivo de cabecera puente para exponer el código Objective-C a Swift. Este archivo consiste en un archivo de cabecera adicional que simplemente define o importa todos los símbolos Objective-C necesarios para el código Swift del proyecto. En ese momento, Swift puede referirse a los tipos, funciones y variables declarados en esas importaciones como si estuvieran escritos en Swift. El código Objective-C también puede usar código Swift directamente, importando un archivo de cabecera mantenido automáticamente con declaraciones Objective-C de los símbolos Swift del proyecto. Por ejemplo, un archivo Objective-C en un proyecto mixto llamado "MyApp" podría acceder a clases o funciones Swift con el código #import "MyApp-Swift.h". Sin embargo, no todos los símbolos están disponibles a través de este mecanismo: el uso de características específicas de Swift, como tipos genéricos, tipos opcionales que no son objetos, enumeraciones sofisticadas o incluso identificadores Unicode, puede hacer que un símbolo sea inaccesible desde Objective-C. [ 104 ]
Swift también tiene soporte limitado para atributos , metadatos que lee el entorno de desarrollo y que no necesariamente forman parte del código compilado. Al igual que Objective-C, los atributos usan la @sintaxis, pero el conjunto disponible actualmente es pequeño. Un ejemplo es el @IBOutletatributo, que marca un valor dado en el código como un outlet , disponible para su uso dentro de Interface Builder (IB). Un outlet es un dispositivo que vincula el valor de la visualización en pantalla a un objeto en el código.
En sistemas que no son de Apple, Swift no depende de un entorno de ejecución de Objective-C ni de otras bibliotecas del sistema de Apple; un conjunto de implementaciones de Swift "Corelib" las reemplazan. Estas incluyen "swift-corelibs-foundation" para reemplazar Foundation Kit , "swift-corelibs-libdispatch" para reemplazar Grand Central Dispatch y "swift-corelibs-xctest" para reemplazar las API de XCTest de Xcode . [ 105 ]
A partir de 2019, con Xcode 11, Apple también ha añadido un nuevo paradigma de interfaz de usuario importante llamado SwiftUI. SwiftUI reemplaza el antiguo paradigma Interface Builder con un nuevo paradigma de desarrollo declarativo. [ 106 ]
Gestión de la memoria
Swift utiliza el Conteo Automático de Referencias (ARC) para gestionar la memoria . Cada instancia de una clase o cierre mantiene un contador de referencias que lleva la cuenta de las referencias que el programa mantiene abiertas. Cuando este contador llega a cero, la instancia se libera. Esta liberación automática elimina la necesidad de un recolector de basura, ya que las instancias se liberan tan pronto como dejan de ser necesarias.
Un ciclo de referencia fuerte puede ocurrir si dos instancias se referencian fuertemente entre sí (por ejemplo, A referencia a B, B referencia a A). Dado que el contador de referencias de ninguna instancia puede llegar a cero, ninguna se libera, lo que resulta en una fuga de memoria . Swift proporciona las palabras clave weaky unownedpara evitar ciclos de referencia fuertes. Estas palabras clave permiten que una instancia sea referenciada sin incrementar su contador de referencias. weakLas referencias deben ser variables opcionales, ya que pueden cambiar y convertirse en nil. [ 107 ] Intentar acceder a un unownedvalor que ya ha sido liberado resulta en un error en tiempo de ejecución.
Un cierre dentro de una clase también puede crear un ciclo de referencia fuerte al capturar autorreferencias. Las autorreferencias que se consideren débiles o sin propietario pueden indicarse mediante una lista de captura.
clase Persona {let nombre : Cadenaweak var home : Home ? // Definida como una referencia débil para romper el ciclo de referencias. Las referencias débiles no incrementan el contador de referencias de la instancia a la que se refieren.inicializar ( nombre : String ) {nombre = nombre}desinit { print ( "Desinicializado \( nombre ) " ) }}clase Inicio {sea dirección : Cadenavar propietario : ¿Persona ?inicializar ( dirección : Cadena , propietario : Persona ?) {dirección propia = direcciónpropietario = propietario}desinit { print ( "Desinicializado \( dirección ) " ) }}var stacy : Persona ? = Persona ( nombre : "Stacy" )var casa21b : Casa ? = Casa ( dirección : "21b Baker Street" , propietario : stacy )Stacy ?. casa = casa21b // Stacy y casa42b ahora se refieren la una a la otra.stacy = nil // El contador de referencias para stacy ahora es 1, porque house21b todavía mantiene una referencia a ella.house21b = nil // El contador de referencias de house21b cae a 0, lo que a su vez hace que el contador de stacy caiga a 0 porque house21b fue la última instancia que mantuvo una referencia fuerte a stacy.// Impresiones:// Desinicializado 21b Baker Street// Stacy desinicializadaDepuración
Un elemento clave del sistema Swift es su capacidad para depurarse y ejecutarse de forma limpia dentro del entorno de desarrollo, utilizando un bucle de lectura-evaluación-impresión (REPL), lo que le confiere propiedades interactivas más cercanas a las capacidades de scripting de Python que a las de los lenguajes de programación de sistemas tradicionales . El REPL se ve mejorado aún más con Playgrounds , vistas interactivas que se ejecutan dentro del entorno Xcode o la aplicación Playgrounds y que responden a los cambios de código o del depurador en tiempo real. [ 108 ] Playgrounds permite a los programadores añadir código Swift junto con documentación en Markdown. Los programadores pueden recorrer el código paso a paso y añadir puntos de interrupción utilizando LLDB, ya sea en una consola o en un IDE como Xcode.
Comparaciones con otros idiomas
Swift se considera un lenguaje de programación de la familia C y es similar a C en varios aspectos:
- La mayoría de los operadores de C también aparecen en Swift, aunque algunos operadores, como ,
+tienen un comportamiento ligeramente diferente. Por ejemplo, en Swift,+captura el desbordamiento, mientras que&+se utiliza para denotar el comportamiento similar al de C de ajustar el desbordamiento. - Las llaves se utilizan para agrupar instrucciones.
- Las variables se asignan usando un signo de igual , pero se comparan usando dos signos de igual consecutivos . Se proporciona un nuevo operador de identidad,
===, para comprobar si dos elementos de datos se refieren al mismo objeto . - Las instrucciones de control
while,if, yswitchson similares, pero tienen funciones extendidas, por ejemplo, unaswitchque acepta casos no enteroswhileyifadmite coincidencia de patrones y desenvolvimiento condicional de opcionales,forutiliza la sintaxis.foriin1...10 - Los corchetes se utilizan con matrices , tanto para declararlas como para obtener un valor en un índice determinado dentro de una de ellas.
También tiene similitudes con Objective-C:
- Tipos numéricos básicos:
Int, UInt, Float, Double - Los métodos de clase se heredan, al igual que los métodos de instancia;
selfen los métodos de clase, la clase es aquella sobre la que se llamó al método. - Sintaxis de enumeración similar
for...in
Las diferencias con Objective-C incluyen:
- Las instrucciones no necesitan terminar con punto y coma (
;), aunque estos deben usarse para permitir más de una instrucción en una línea. - Sin archivos de cabecera.
- Utiliza inferencia de tipos .
- Programación genérica .
- Las funciones son objetos de primera clase .
- Los casos de enumeración pueden tener datos asociados ( tipos de datos algebraicos ).
- Los operadores pueden redefinirse para las clases ( sobrecarga de operadores ) y pueden definirse nuevos operadores.
- Las cadenas de caracteres son totalmente compatibles con Unicode . La mayoría de los caracteres Unicode se pueden usar tanto en identificadores como en operadores.
- Sin manejo de excepciones . Swift 2 introduce un modelo de manejo de errores diferente e incompatible. [ 109 ]
- Se han eliminado varias características de los lenguajes de la familia C anteriores que eran fáciles de usar incorrectamente:
- Los punteros no se exponen por defecto. El programador no necesita llevar un registro ni marcar los nombres para referenciarlos o desreferenciarlos.
- Las asignaciones no devuelven ningún valor. Esto evita el error común de escribir
i = 0en lugar dei == 0(lo que genera un error de compilación). - No es necesario usar
breaksentencias enswitchbloques. Los casos individuales no se ejecutan en paralelo a menos quefallthroughse utilice la sentencia. - Las variables y constantes siempre se inicializan y los límites de los arrays siempre se comprueban.
- Los desbordamientos de enteros , que en C provocan un comportamiento indefinido para los enteros con signo, se capturan como un error en tiempo de ejecución en Swift. Los programadores pueden optar por permitir desbordamientos utilizando los operadores aritméticos especiales
&+,&-,&*,&/y&%. Las propiedadesminymaxestán definidas en Swift para todos los tipos de enteros y se pueden usar para comprobar de forma segura posibles desbordamientos, en lugar de depender de las constantes definidas para cada tipo en bibliotecas externas. - La forma de una sola instrucción de
ifywhile, que permite omitir las llaves alrededor de la instrucción, no es compatible. - La enumeración al estilo C
for (int i = 0; i < c; i++), que es propensa a errores de uno en uno , no es compatible (a partir de Swift 3). [ 110 ] - Los operadores de incremento y decremento previos y posteriores (
i++,--i...) no son compatibles (a partir de Swift 3), más aún dado queforlas sentencias de estilo C tampoco son compatibles a partir de Swift 3. [ 111 ]
Desarrollo y otras implementaciones
Debido a que Swift puede ejecutarse en Linux, a veces también se utiliza como lenguaje del lado del servidor. [ 112 ] Se han desarrollado algunos marcos web, como Kitura de IBM (ahora descontinuado), Perfect , Vapor y Hummingbird .
Apple también ha creado un grupo de trabajo oficial de "API de servidor" [ 113 ] en el que miembros de la comunidad de desarrolladores de Swift desempeñan un papel central. [ 114 ]
Existe una segunda implementación gratuita de Swift que apunta a Cocoa , la infraestructura de lenguaje común de Microsoft ( .NET Framework , ahora .NET ) y la plataforma Java y Android como parte del compilador Elements de RemObjects Software . [ 115 ]
Se han portado subconjuntos de Swift a plataformas adicionales, como Arduino [ 116 ] y Mac OS 9 . [ 117 ]
Véase también
Referencias
- ↑ Patente estadounidense 9329844
- ↑ "Swift ha alcanzado la versión 1.0" . Apple. 9 de septiembre de 2014. Consultado el 8 de marzo de 2015 .
- ↑ "Versión 6.3.3" . 30 de junio de 2026. Consultado el 1 de julio de 2026 .
- ↑ "Swift, Objectively" . Dr. Dobb's .
Swift es propietario y cerrado: está totalmente controlado por Apple y no existe ninguna implementación de código abierto.
- ↑ Lattner, Chris (11 de junio de 2014). "Re: [ LLVMdev ] [ cfe-dev ] [ Anuncio ] puestos vacantes en el equipo del compilador Swift de Apple" . Archivado del original el 14 de julio de 2014. Recuperado el 12 de junio de 2014. Como
se imaginarán, muchos de nosotros queremos que sea de código abierto y parte de LLVM, pero la discusión aún no se ha producido y no se producirá en un tiempo.
- ↑ "Página principal de Chris Lattner" . Chris Lattner. 3 de junio de 2014. Consultado el 3 de junio de 2014.
El lenguaje Swift es el resultado del incansable esfuerzo de un equipo de expertos en lenguajes, gurús de la documentación, expertos en optimización de compiladores y un importantísimo grupo interno de pruebas internas que proporcionó retroalimentación para ayudar a refinar y poner a prueba las ideas. Por supuesto, también se benefició enormemente de la experiencia adquirida con tanto esfuerzo por muchos otros lenguajes del sector, tomando ideas de Objective-C, Rust, Haskell, Ruby, Python, C#, CLU y muchísimos otros que sería imposible enumerar.
- 1 2 Lattner, Chris (3 de junio de 2014). "Página principal de Chris Lattner" . Chris Lattner . Recuperado el 3 de junio de 2014. Comencé
a trabajar en el lenguaje de programación Swift en julio de 2010. Implementé gran parte de la estructura básica del lenguaje, con solo unas pocas personas conociendo su existencia. Algunas otras personas (increíbles) comenzaron a contribuir en serio a finales de 2011, y se convirtió en un enfoque principal para el grupo de Herramientas para desarrolladores de Apple en julio de 2013 [...] tomando ideas de
Objective-C
, Rust, Haskell, Ruby, Python, C#, CLU y muchos otros para enumerar.
- ↑ "Creación de assert() en Swift, Parte 2: __FILE__ y __LINE__" . Consultado el 25 de septiembre de 2014 .
- ↑ "Influencias - The Rust Reference" . doc.rust-lang.org . Consultado el 2 de mayo de 2020 .
- ↑ "influenciado por la documentación - V" . github.com . Consultado el 3 de noviembre de 2023 .
- ↑ "Preguntas frecuentes sobre el lenguaje Mojo" . modular.com . Consultado el 17 de agosto de 2025 .
- ↑ "Carbon Language GitHub" . github.com . Consultado el 17 de agosto de 2025 .
- ↑ Lardinois, Frederic (2 de junio de 2014). "Apple lanza Swift, un nuevo lenguaje de programación para escribir aplicaciones para iOS y OS X" . TechCrunch . Consultado el 7 de septiembre de 2022 .
- ↑ Programación orientada a protocolos en Swift . Apple Inc. YouTube . Archivado del original el 16 de julio de 2023. Consultado el 18 de junio de 2015 .
- ↑ "Los conceptos son similares a los rasgos de Rust, (creo) a los protocolos de Swift y a Haskel Type C... | Hacker News" . news.ycombinator.com .
- ↑ Williams, Owen (2 de junio de 2014). "En el sexagésimo cumpleaños de Tim Berners-Lee, Apple anuncia Swift, un nuevo lenguaje de programación para iOS" . The Next Web . Consultado el 2 de junio de 2014 .
- ↑ "El nuevo lenguaje de programación de Apple, Swift, ahora es de código abierto" . The Verge . 3 de diciembre de 2015. Consultado el 5 de diciembre de 2015 .
- ↑ "Apple libera el código fuente de Swift en su última propuesta para empresas" . CIO Journal. Blogs de The Wall Street Journal . 3 de diciembre de 2015. Consultado el 5 de diciembre de 2015 .
- 1 2 Plataformas Estado de la Unión, Sesión 102, Conferencia Mundial de Desarrolladores de Apple , 2 de junio de 2014
- ↑ El lenguaje de programación Swift . Apple . 2 de junio de 2014. Consultado el 2 de junio de 2014 .
- "Documentación" . Swift .
- ↑ "Swift ha alcanzado 1.0" . 9 de septiembre de 2014. Consultado el 10 de septiembre de 2014 .
- ↑ "Notas de la versión de Xcode 6.1" . 22 de octubre de 2014. Consultado el 23 de enero de 2015 .
- ↑ "Notas de la versión de Xcode 6.3" . 8 de abril de 2015. Consultado el 8 de abril de 2015 .
- ↑ "Aplicaciones de Swift 2 en la App Store" . Blog de Swift . Consultado el 13 de marzo de 2016 .
- ↑ "¡Swift 3.0 lanzado!" . Swift.org . 13 de septiembre de 2016. Archivado del original el 14 de octubre de 2016. Consultado el 26 de octubre de 2016 .
- ↑ "Retrospectiva de Swift 3 y perspectivas para Swift 4" . Foros de Swift . 29 de julio de 2016. Consultado el 19 de noviembre de 2018 .
- ↑ "Swift-Evolution" . Swift Evolution . Consultado el 19 de noviembre de 2018 .
- ↑ "¡Swift 4.0 lanzado!" . Swift.org . 17 de septiembre de 2017. Archivado del original el 28 de marzo de 2019. Consultado el 1 de marzo de 2018 .
- ↑ "¡Swift 4.1 lanzado!" . Swift.org . 29 de marzo de 2018. Archivado del original el 25 de abril de 2019. Consultado el 30 de marzo de 2018 .
- ↑ "Clasificación de lenguajes de programación de RedMonk: enero de 2018 – tecosystems" . redmonk.com . 7 de marzo de 2018. Consultado el 20 de noviembre de 2018 .
- ↑ Kremenek, Ted (25 de marzo de 2019). "¡Swift 5 lanzado!" .
- ↑ Kremenek, Ted (20 de septiembre de 2019). "¡Swift 5.1 lanzado!" . Archivado del original el 26 de febrero de 2022. Recuperado el 28 de octubre de 2019 .
- ↑ Hudson, Paul (6 de junio de 2021). "¿Qué hay de nuevo en Swift 5.5?" . HackingWithSwift.com . Hacking with Swift . Consultado el 8 de junio de 2021 .
- ↑ "Swift 5.9 lanzado" . Swift.org . 18 de septiembre de 2023. Consultado el 9 de octubre de 2023 .
- ↑ Borla, Holly (17 de septiembre de 2024). "Anuncio de Swift 6" . Swift.org . Consultado el 15 de octubre de 2024 .
- ↑ Borla, Holly (31 de marzo de 2025). "Swift 6.1 Released 6.1" . swift.org . Consultado el 29 de abril de 2025 .
- ↑ "Encuesta a desarrolladores de Stack Overflow 2015" . Stack Overflow .
- ↑ "Resultados de la encuesta a desarrolladores de Stack Overflow 2016" . Stack Overflow .
- ↑ "Swift.org y el código abierto" . Swift.org . Apple Inc. Consultado el 25 de febrero de 2019 .
- ↑ "Presentación del entorno aislado IBM Swift — Swift" . Swift . Consultado el 5 de diciembre de 2015 .
- ↑ Mayo, Benjamin (4 de diciembre de 2015). "Escribe código Swift en un navegador web con IBM Swift Sandbox" . 9to5Mac . Consultado el 5 de diciembre de 2015 .
- ↑ "Después de que Apple lo liberara como código abierto, IBM puso la programación Swift en la nube" . ZDNet . Consultado el 5 de diciembre de 2015 .
- ↑ "Desuso del catálogo de paquetes Swift y del entorno aislado Swift" . Consultado el 9 de noviembre de 2018 .
- ↑ "Swift Playgrounds" . Apple Developer . Consultado el 19 de junio de 2016 .
- ↑ "Swift Playgrounds — Vista previa" . Apple . Consultado el 19 de junio de 2016 .
- ↑ Mayo, Benjamin (13 de junio de 2016). "Apple anuncia Swift Playgrounds para iPad en la WWDC, lanzamiento público en otoño" . 9to5Mac . Consultado el 19 de junio de 2016 .
- ↑ Cunningham, Andrew (10 de enero de 2017). "Programador veterano de Apple y creador de Swift deja Apple para unirse a Tesla" . Ars Technica.
- ↑ Wuerthele, Mike (13 de enero de 2017). "Se dice que Ted Kremenek, el nuevo jefe del proyecto Swift, ha estado dirigiendo el proyecto entre bastidores durante algún tiempo" . AppleInsider.
- ↑ Daniel Eran Dilger (19 de junio de 2019). "WWDC19: SwiftUI fue la estrella más brillante en una galaxia de nuevas ideas" . AppleInsider . Consultado el 19 de julio de 2019 .
- ↑ "Swift.org - Descargar Swift" . Consultado el 21 de junio de 2020 .
- ↑ "Android SDKs para Swift" . GitHub . Consultado el 10 de septiembre de 2021 .
- ↑ "versiones del paquete swift-lang" . Consultado el 10 de septiembre de 2021 .
- ↑ "Anuncio del SDK de Swift para Android" . Swift.org . 24 de octubre de 2025.
- ↑ Readdle (15 de enero de 2020). "Swift para Android: Nuestra experiencia y herramientas" . Medium . Consultado el 20 de agosto de 2020 .
- ↑ Anderson, Tim (30 de marzo de 2020). "Se promete soporte oficial adaptado a Swift para Windows en la versión 5.3: Swift en más plataformas, siempre que no necesites una interfaz gráfica de usuario" . The Register . Consultado el 18 de septiembre de 2020 .
- ↑ "La versión de Swift para Linux" . Swift.org . Apple Inc. 3 de diciembre de 2015. Consultado el 3 de agosto de 2016 .
- ↑ Timmer, John (5 de junio de 2014). "Un vistazo rápido a Swift, el nuevo lenguaje de programación de Apple" . Ars Technica . Condé Nast . Consultado el 6 de junio de 2014 .
- ↑ Kremenek, Ted (25 de marzo de 2019). "¡Swift 5 lanzado!" . Swift.org . Consultado el 28 de marzo de 2019 .
- ↑ "Descargar Swift" . Swift.org . Apple . Consultado el 15 de diciembre de 2020 .
- ↑ Kremenek, Ted (26 de abril de 2021). "¡Swift 5.4 lanzado!" . Swift.org . Apple. Archivado del original el 26 de abril de 2021 . Recuperado el 26 de abril de 2021 .
- ↑ Kremenek, Ted (14 de marzo de 2022). "¡Swift 5.6 lanzado!" . Swift.org . Apple . Consultado el 14 de marzo de 2022 .
- ↑ "Lanzamiento de Swift 5.6.1 · apple/Swift" . GitHub .
- ↑ "Lanzamiento de Swift 5.6.2 · apple/Swift" . GitHub .
- ↑ "Lanzamiento de Swift 5.6.3 · apple/Swift" . GitHub .
- ↑ Borla, Holly (12 de septiembre de 2022). "¡Swift 5.7 lanzado!" . Swift.org . Apple . Consultado el 23 de septiembre de 2022 .
- ↑ "Lanzamiento de Swift 5.7.1 · apple/Swift" . GitHub .
- ↑ "Lanzamiento de Swift 5.8 · apple/Swift" . GitHub .
- ↑ "Lanzamiento de Swift 5.8.1 · apple/swift" . GitHub . Consultado el 14 de junio de 2023 .
- ↑ "Lanzamiento de Swift 5.9 · apple/swift" . GitHub . Consultado el 18 de septiembre de 2023 .
- ↑ "Lanzamiento de Swift 5.9.1 · apple/swift" . GitHub . Consultado el 19 de octubre de 2023 .
- ↑ "Lanzamiento de Swift 5.9.2 · apple/swift" . GitHub . Consultado el 11 de diciembre de 2023 .
- ↑ Borla, Holly (5 de marzo de 2024). "Swift 5.10 Released" . Swift.org . Consultado el 13 de marzo de 2024 .
- ↑ "Swift 5.10.1 Release" . GitHub . Consultado el 5 de junio de 2024 .
- ↑ "Lanzamiento de Swift 6.0" . GitHub . Consultado el 17 de septiembre de 2024 .
- ↑ "Lanzamiento de Swift 6.1" . GitHub . Consultado el 29 de abril de 2025 .
- ↑ "Lanzamiento de Swift 6.2" . GitHub . Consultado el 17 de septiembre de 2025 .
- ↑ "Lanzamiento de Swift 6.3" . GitHub . Consultado el 27 de marzo de 2026 .
- ↑ "Documentación" . docs.swift.org . Consultado el 17 de noviembre de 2023 .
- ↑ "Eliminar condiciones de carrera con Swift Concurrency - WWDC22 - Vídeos" . Apple Inc. Consultado el 17 de noviembre de 2023 .
- 1 2 "Documentación" . docs.swift.org . Consultado el 15 de octubre de 2023 .
- ↑ "Documentación" . docs.swift.org . Consultado el 15 de octubre de 2023 .
- ↑ "Cierres — El lenguaje de programación Swift (Swift 5.5)" . docs.swift.org . Consultado el 31 de agosto de 2021 .
- ↑ Macomber, Kyle; Yaskevich, Yavel; Gregor, Doug; McCall, John. "Cierres finales múltiples" . GitHub . Consultado el 19 de octubre de 2020 .
- ↑ "Documentación" . docs.swift.org . Consultado el 16 de octubre de 2023 .
- ↑ "Cadenas y caracteres" . docs.swift.org . Consultado el 16 de octubre de 2023 .
- ↑ "Declaraciones — El lenguaje de programación Swift (Swift 5.6)" . docs.swift.org . Consultado el 28 de febrero de 2022 .
- ↑ "Control de acceso" . El lenguaje de programación Swift . Apple Developer . Consultado el 25 de octubre de 2016 .
- ↑ "Tipos anulables" , Guía de programación de C#, Microsoft. Archivado el 21 de febrero de 2017 en Wayback Machine .
- ↑ "Tipos" . El lenguaje de programación Swift . Apple Developer . Consultado el 16 de julio de 2014 .
- 1 2 "Clases y estructuras" . El lenguaje de programación Swift . Apple Developer. Archivado del original el 25 de marzo de 2016.
- ↑ Guhit, Fiel (14 de febrero de 2015). "Estudio de caso de rendimiento en Swift 1.1, Swift 1.2 y Objective-C" . Medium . Archivado del original el 12 de diciembre de 2023.
- ↑ Cómo crear mejores aplicaciones con tipos de valor . Apple. Archivado del original el 21 de junio de 2015.
- ↑ "Extensiones" . docs.swift.org . Consultado el 28 de noviembre de 2023 .
- ↑ "Trabajando con protocolos" . Programación con Objective-C . Archivo de documentación para desarrolladores de Apple. 17 de septiembre de 2014. Archivado del original el 29 de abril de 2016.
- ↑ "Referencia del protocolo NSCopying" . Apple .
- ↑ "Estadísticas de la biblioteca estándar de Swift" . swiftinit.org . Swiftinit . Consultado el 2 de octubre de 2023 .
- ↑ Thompson, Mattt (2 de septiembre de 2014). "Implementaciones del protocolo predeterminado de Swift" . NSHipster .
- ↑ "swift-evolution/proposals/0304-structured-concurrency.md en main · apple/swift-evolution" . GitHub . Consultado el 16 de octubre de 2023 .
- ↑ "swift-evolution/proposals/0296-async-await.md en main · apple/swift-evolution" . GitHub . Consultado el 16 de octubre de 2023 .
- ↑ "¿Funcionan las aplicaciones basadas en Swift en macOS 10.9/iOS 7 y versiones anteriores?" , StackOverflow
- ↑ Sandberg, Alexander; Boria, Holly (18 de septiembre de 2023). "Swift 5.9 lanzado" . Swift.org . Apple . Consultado el 9 de octubre de 2023 .
- ↑ "Escribiendo clases Swift con comportamiento Objective-C" , Apple Inc.
- ↑ "Migrando tu código Objective-C a Swift" . Documentación para desarrolladores de Apple .
- ↑ "Swift y Objective-C en el mismo proyecto" , Apple Inc.
- ↑ "Apple: buscar "corelib"" . GitHub .
- ↑ "Xcode - SwiftUI - Desarrollador de Apple" . developer.apple.com . Consultado el 1 de febrero de 2021 .
- ↑ Lanier, Brian; Groff, Joe. "Intermediate Swift" . Apple . Consultado el 3 de julio de 2014 .
- ↑ Metz, Cade. "Por qué los programadores están enloqueciendo con el nuevo lenguaje de programación de Apple" . Wired . Consultado el 16 de julio de 2014 .
- ↑ "Manejo de errores en el lenguaje Swift" . stackoverflow.com
- ↑ "apple/swift-evolution" . GitHub . Consultado el 4 de abril de 2016 .
- ↑ "apple/swift-evolution" . GitHub . Consultado el 4 de abril de 2016 .
- ↑ Barbosa, Greg (22 de febrero de 2016). "IBM lleva Swift a la nube y lanza el framework web Kitura escrito en el lenguaje de programación de Apple" . 9to5Mac . Consultado el 16 de mayo de 2016 .
- ↑ "Grupo de trabajo de API de servidor" . Swift.org . 25 de octubre de 2016. Consultado el 28 de octubre de 2016 .
- ↑ "Swift.org" . Swift.org . Archivado del original el 10 de mayo de 2021. Consultado el 28 de octubre de 2016 .
- ↑ "Compilador de elementos RemObjects" . Consultado el 17 de enero de 2016 .
- ↑ "Swift para Arduino" .
- ^ Rose, Jordania (1 de abril de 2020). "Swift en Mac OS 9" . -dealloc .
Enlaces externos
- Swift (lenguaje de programación)
- Software de Apple Inc.
- Lenguajes de programación
- Lenguajes de programación compilados
- Lenguajes de programación de alto nivel
- lenguajes de programación declarativos
- Lenguajes de programación orientados a objetos
- Lenguajes funcionales
- Lenguajes de programación que coinciden con patrones
- Lenguajes de programación creados en 2014
- Lenguajes de programación de tipado estático
- lenguajes de programación de sistemas
- Software libre multiplataforma
- Software que utiliza la licencia Apache.