De Wikipedia, la enciclopedia libre
Saltar a navegación Saltar a búsqueda

Swift es un lenguaje de programación compilado de uso general , de múltiples paradigmas , desarrollado por Apple Inc. y la comunidad de código abierto , lanzado por primera vez en 2014. Swift fue desarrollado como un reemplazo del anterior lenguaje de programación Objective-C de Apple , como Objective-C se había mantenido prácticamente sin cambios desde principios de la década de 1980 y carecía de características lingüísticas modernas. Swift funciona con los marcos Cocoa y Cocoa Touch de Apple , y un aspecto clave del diseño de Swift fue la capacidad de interoperar con el enorme cuerpo de código Objective-C existente desarrollado para los productos de Apple durante las décadas anteriores. Está construido con el marco del compilador LLVM de código abierto y se ha incluido en Xcode desde la versión 6, lanzada en 2014. En las plataformas Apple, [11] utiliza la biblioteca de tiempo de ejecución Objective-C que permite C , Objective-C , C ++ y Swift. código para ejecutar dentro de un programa. [12]

Apple pretendía que Swift admitiera muchos conceptos básicos asociados con Objective-C , en particular envío dinámico , enlace tardío generalizado , 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 puntero nulo y proporciona azúcar sintáctico para ayudar a evitar la pirámide de la fatalidad . Swift admite 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" [13] (similar a los rasgos ). [14]

Swift se presentó en la Conferencia Mundial de Desarrolladores 2014 de Apple (WWDC). [15] Se sometió a una actualización a la versión 1.2 durante 2014 y una actualización importante a Swift 2 en WWDC 2015. Inicialmente un lenguaje propietario , 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 . [16] [17]

A través de la versión 3.0, la sintaxis de Swift experimentó una evolución significativa, y el equipo central se centró en la estabilidad de la fuente en versiones posteriores. [18] [19] En el primer trimestre de 2018, Swift superó a Objective-C en popularidad medida. [20]

Swift 4.0, lanzado en 2017, 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 5, lanzado en marzo de 2019, introdujo una interfaz binaria estable en las plataformas de Apple, lo que permite incorporar el tiempo de ejecución de Swift en los sistemas operativos de Apple. Es compatible con Swift 4. [21]

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 del módulo. La introducción de la estabilidad del módulo permite crear y compartir marcos binarios que funcionarán con futuras versiones de Swift. [22]

Historia [ editar ]

El desarrollo de Swift comenzó en julio de 2010 por Chris Lattner , con la eventual colaboración de muchos otros programadores de Apple . Swift tomó ideas de lenguaje "de Objective-C , Rust , Haskell , Ruby , Python , C # , CLU y demasiados otros para enumerarlos". [8] El 2 de junio de 2014, la aplicación Apple Worldwide Developers Conference (WWDC) se convirtió en la primera aplicación publicada públicamente escrita con Swift. [23] Una versión beta del lenguaje de programación.fue entregado a los desarrolladores registrados de Apple en la conferencia, pero la compañía no prometió que la versión final de Swift sería compatible con el código fuente de la versión de prueba. Apple planeó hacer disponibles convertidores de código fuente si es necesario para el lanzamiento completo. [23]

El lenguaje de programación Swift , un manual gratuito de 500 páginas, también se lanzó en la WWDC y está disponible en la Apple Books Store y en el sitio web oficial. [24]

Swift alcanzó el hito 1.0 el 9 de septiembre de 2014 con el Gold Master de Xcode 6.0 para iOS . [25] Swift 1.1 fue lanzado el 22 de octubre de 2014, junto con el lanzamiento de Xcode 6.1. [26] Swift 1.2 fue lanzado el 8 de abril de 2015, junto con Xcode 6.3. [27] Swift 2.0 se anunció en WWDC 2015 y estuvo disponible para la publicación de aplicaciones en la App Store el 21 de septiembre de 2015. [28] Swift 3.0 se lanzó el 13 de septiembre de 2016. [29] Swift 4.0 se lanzó en septiembre 19 de 2017. [30] Swift 4.1 fue lanzado el 29 de marzo de 2018. [31]

Swift ganó el primer lugar como Lenguaje de programación más querido en la Encuesta para desarrolladores de Stack Overflow 2015 [32] y el segundo lugar en 2016. [33]

El 3 de diciembre de 2015, el lenguaje Swift, las bibliotecas de soporte, el depurador y el administrador de paquetes fueron de código abierto bajo la licencia Apache 2.0 con una excepción de biblioteca en tiempo de ejecución, [34] y se creó Swift.org para alojar el proyecto. El código fuente está alojado en GitHub , donde es fácil para cualquiera obtener el código, compilarlo ellos mismos e incluso crear solicitudes de extracción para contribuir con el 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. [35] [36] [37] Swift Sandbox quedó obsoleto en enero de 2018. [38]

Durante la WWDC 2016 , Apple anunció una aplicación exclusiva para iPad , llamada Swift Playgrounds , destinada a enseñar a las personas cómo codificar en Swift. La aplicación se presenta en una interfaz similar a un videojuego en 3D que proporciona información cuando las líneas de código se colocan en un orden determinado y se ejecutan. [39] [40] [41]

En enero de 2017, Chris Lattner anunció su salida de Apple para ocupar un nuevo puesto en Tesla Motors , y el papel principal del proyecto Swift recayó en el veterano del equipo Ted Kremenek. [42] [43]

Durante la WWDC 2019, Apple anunció SwiftUI, que proporciona un marco para el diseño de la estructura declarativa de la interfaz de usuario en todas las plataformas de Apple. [44]

Las descargas oficiales para la distribución Ubuntu de Linux han estado disponibles desde Swift 2.2, con más distribuciones agregadas desde Swift 5.2.4, CentOS y Amazon Linux. [45] También hay un paquete no oficial para Android. [46]

Los lenguajes no son estrictamente compatibles con los sistemas operativos, las bibliotecas asociadas (y los compiladores) sí lo hacen. Swift aún no es compatible oficialmente con Android, pero hay disponibles cadenas de herramientas no oficiales, como Swift Android Toolchain, [47] que mantiene cierta compatibilidad con los programas multiplataforma que permiten Apple.

Plataformas [ editar ]

Las plataformas compatibles con Swift son los sistemas operativos de Apple ( Darwin , iOS , iPadOS , macOS , tvOS , watchOS ), Linux , Windows y Android . [47] [48] También existe un puerto no oficial para FreeBSD .

Historial de versiones [ editar ]

Funciones [ editar ]

Swift es una alternativa al lenguaje Objective-C que emplea conceptos modernos de la teoría del lenguaje de programación y se esfuerza por presentar una sintaxis más simple. Durante su introducción, se describió simplemente como "Objective-C sin el bagaje de C". [51] [52]

Por defecto, Swift no expone punteros y otros inseguras accessors , en contraste con Objective-C, que utiliza los punteros penetrante para referirse a instancias de objetos. Además, el uso de Objective-C de una sintaxis similar a Smalltalk para realizar llamadas a métodos ha sido reemplazado por un estilo de notación de puntos y un sistema de espacio de nombres más familiar para los programadores de otros lenguajes orientados a objetos (OO) comunes como Java o C # . Swift introduce parámetros con nombre real y conserva los conceptos clave de Objective-C, incluidos protocolos , cierres y categorías, a menudo reemplazando la sintaxis anterior con versiones más limpias y permitiendo que estos conceptos se apliquen a otras estructuras de lenguaje, como tipos enumerados (enums) [53]

Soporte de cierre [ editar ]

Swift admite cierres (conocidos como lambdas en otros idiomas). Aquí hay un ejemplo:

// Aquí hay un cierre( arg1 :  Int ,  arg2 :  Int )  ->  Int  en devolver  arg1  +  arg2

Swift tiene una sintaxis de cierre final como esta:

// Esta función toma un cierre o función que devuelve un int y luego solo evalúa la función.func  a ( cierre  a :  ()  ->  Int )  ->  Int  { devolver  un ()}// Sin sintaxis de cierre finala ( cierre :  { return  1 })// Con sintaxis de cierre finala  { return  1 }

A partir de la versión 5.3, Swift admite varios cierres finales: [54]

// Esta función pasa el resultado del primer cierre o función a otro y devuelve su resultado. func  a ( cierre  a :  ()  ->  Int ,  otroCierre :  ( Int )  ->  Int )  ->  Int  {  devolver  otroCierre ( a ()) }// Sin cierres finales a ( cierre :  { retorno  1 }, otro  cierre :  { x  en  retorno  x  +  1 })// Con 1 cierre final a ( cierre :  { retorno  1 })  { x  en  retorno  x  +  1 })// Con 2 cierres finales a  { return  1 }  anotherClosure :  { x  in  return  x  +  1 }

Estos son los criterios para la sintaxis de cierre final:

  • Si los últimos argumentos de una función son cierres, puede usar la sintaxis de cierre final.
  • Se debe omitir el nombre del parámetro del primer cierre final.
  • Los nombres de los parámetros de los cierres finales restantes no deben omitirse.
  • Si todos los argumentos dados a una función son cierres finales, puede omitir los paréntesis después del nombre de la función.
  • Las llamadas a una función con cierres finales deben estar entre paréntesis si se usan en una guarddeclaración. [55]

Soporte de cadenas [ editar ]

En los entornos Cocoa y Cocoa Touch , muchas clases comunes formaban parte de la biblioteca de Foundation Kit . Esto incluyó la biblioteca de cadenas NSString (usando Unicode , UTF-8 en Swift 5, cambiado de UTF-16 ), las clases de colección NSArray y NSDictionary, y otras. Objective-C proporcionó varios bits de azúcar sintáctico para permitir que algunos de estos objetos se creen sobre la marcha dentro del lenguaje, pero una vez creados, los objetos se manipulan con llamadas a objetos. Por ejemplo, en Objective-C, la concatenación de dos NSStrings requirió llamadas a métodos similares a esto:

NSString  * str  =  @ "hola" ; str  =  [ str  stringByAppendingString : @ "mundo" ];

En Swift, muchos de estos tipos básicos se han promovido al núcleo del lenguaje y se pueden manipular directamente. Por ejemplo, las cadenas se unen de forma invisible a NSString (cuando se importa Foundation) y ahora se pueden concatenar con el +operador, lo que permite una sintaxis muy simplificada; el ejemplo anterior se convierte en: [56]

var  str  =  "hola," str  + =  "mundo"

Control de acceso [ editar ]

Swift admite cinco de control de acceso niveles de 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 alcance 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 subclasificada fuera del módulo. [57]

Opcionales y encadenamiento [ editar ]

Una característica nueva importante en Swift son los tipos de opciones , que permiten que las referencias o valores operen de una manera similar al patrón común en C , donde un puntero puede referirse a un valor o puede ser nulo. Esto implica que los tipos no opcionales no pueden dar como resultado un error de puntero nulo ; el compilador puede asegurarse de que esto no sea posible.

Los tipos opcionales se crean con el Optionalmecanismo: para hacer un entero que sea anulable, se usaría una declaración similar a var optionalInteger: Optional<Int>. Como en C #, [58] Swift también incluye azúcar sintáctico para esto, lo que permite uno para indicar una variable es opcional mediante la colocación de un signo de interrogación después el nombre del tipo, var optionalInteger: Int?. [59] Las variables o constantes que están marcadas como opcionales tienen un valor del tipo subyacente o lo son nil. Los tipos opcionales envuelven el tipo base, lo que da como resultado una instancia diferente. Stringy String?son fundamentalmente tipos diferentes, este último tiene más en común con Int?que String.

Para acceder al valor interno, asumiendo que no es nulo, debe desenvolverse para exponer la instancia interna. Esto se realiza con el !operador:

let  myValue  =  anOptionalInstance !. someMethod ()

En este caso, el !operador desenvuelve anOptionalInstancepara exponer la instancia en su interior, lo que permite que se realice la llamada al método. Si anOptionalInstancees nulo, se produce un error de puntero nulo. Esto puede ser molesto en la práctica, por lo que Swift también incluye el concepto de encadenamiento opcional para probar si la instancia es nula y luego desenvolverla si no es nula:

let  myValue  =  anOptionalInstance ?. someMethod ()

En este caso, el tiempo de ejecución llama someMethodsolo si anOptionalInstanceno es nil, suprimiendo el error. Normalmente, esto requiere que el programador pruebe si myValuees nulo antes de continuar. El origen del término encadenamiento proviene del caso más común en el que varias llamadas / captadores de métodos están encadenados. Por ejemplo:

let  aTenant  =  aBuilding . tenantList [ 5 ] let  theirLease  =  aTenant . leaseDetails let  leaseStart  =  theirLease ?. fecha de inicio

se puede reducir a:

let  leaseStart  =  aBuilding . tenantList [ 5 ]. leaseDetails ?. fecha de inicio

La ?sintaxis elude la pirámide de la fatalidad .

Swift 2 introdujo la nueva palabra clave guardpara los casos en los que el código debería dejar de ejecutarse si no se cumple alguna condición:

guard  let  leaseStart  =  aBuilding . TenantList [ 5 ] ?. leaseDetails ?. startDate  else {  // manejar el caso de error donde cualquier cosa en la cadena es nula  // si no, el alcance debe salir del método o ciclo actual } // continuar, sabiendo que leaseStart no es nil

El uso guardtiene tres beneficios. Si bien la sintaxis puede actuar como una ifdeclaración, su beneficio principal es inferir la no nulabilidad. Cuando una ifdeclaración requiere un caso, se guardasume el caso en función de la condición proporcionada. Además, dado que guardno contiene visor, con la excepción del elsecierre, leaseStartse presenta como un opcional desenvuelto para el superámbito del guardia. Por último, si la guardprueba de la declaración falla, Swift requiere elseque salga del método o ciclo actual, asegurándose de que leaseStartnunca se acceda cuando nil. Esto se realiza con las palabras clave return, continue, break, o throw, o llamando a una función que devuelve un Never(por ejemplo fatalError()).

Objective-C tenía un tipo débil y permitía llamar a cualquier método en cualquier objeto en cualquier momento. Si la llamada al método fallaba, había un controlador predeterminado en el tiempo de ejecución que devolvía nil. Eso significaba que no era necesario desenvolver ni probar, la declaración equivalente en Objective-C:

leaseStart  =  [[[ aBuilding  tenantList : 5 ]  leaseDetails ]  startDate ]

Devolvería cero, y esto podría probarse. Sin embargo, esto también exigía que todas las llamadas a métodos fueran dinámicas, lo que introduce una sobrecarga significativa. El uso de opcionales de Swift proporciona un mecanismo similar para probar y tratar con nils, pero lo hace de una manera que permite al compilador usar el envío estático porque la acción de desenvolver se llama en una instancia definida (el contenedor), en lugar de ocurrir en el envío en tiempo de ejecución. sistema.

Tipos de valor [ editar ]

En muchos lenguajes orientados a objetos, los objetos se representan internamente en dos partes. El objeto se almacena como un bloque de datos colocado en el montón , mientras que el nombre (o "identificador") de ese objeto está representado por un puntero . Los objetos se pasan entre métodos copiando el valor del puntero, lo que permite que cualquiera que tenga una copia pueda acceder a los mismos datos subyacentes en el montón. Por el contrario, los tipos básicos como los números enteros y los valores de coma flotante se representan directamente; el identificador contiene los datos, no un puntero a él, y esos datos se pasan directamente a los métodos mediante la copia. Estos estilos de acceso se denominan paso por referencia en el caso de objetos y paso por valor para tipos básicos.

Ambos conceptos tienen sus ventajas y desventajas. Los objetos son útiles cuando los datos son grandes, 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 son una palabra ), por lo que no hay ninguna ventaja en pasar un puntero en lugar de pasar el valor. Además, el paso por referencia requiere de forma inherente una operación de desreferenciación, que puede producir una sobrecarga notable en algunas operaciones, normalmente las que se utilizan con estos tipos de valores básicos, como las matemáticas.

De manera similar a C # y en contraste con la mayoría de los otros lenguajes OO, [ cita requerida ] Swift ofrece soporte integrado para objetos usando semántica de paso por referencia o paso por valor, el primero usando la classdeclaración y el segundo usando struct. Las estructuras en Swift tienen casi todas las mismas características que las clases: métodos, implementación de protocolos y uso de los mecanismos de extensión. Por esta razón, Apple denomina todos los datos genéricamente como instancias , versus objetos o valores. Sin embargo, las estructuras no admiten la herencia. [60]

El programador es libre de elegir qué semánticas son más apropiadas para cada estructura de datos en la aplicación. Las estructuras más grandes, como las ventanas, se definirían como clases, lo que les permitiría pasarlas como punteros. Las estructuras más pequeñas, como un punto 2D, se pueden definir como estructuras, que se pasarán por valor y permitirán el acceso directo a sus datos internos sin desreferencia. La mejora del rendimiento inherente al concepto de transferencia por valor es tal que Swift utiliza estos tipos para casi todos los tipos de datos comunes, incluidos Inty Double, y los tipos normalmente representados por objetos, como Stringy Array. [60] El uso de tipos de valor también puede dar como resultado mejoras significativas en el rendimiento de las aplicaciones de usuario. [61]

Para asegurarse de que incluso las estructuras más grandes no causen una penalización de rendimiento cuando se entregan, Swift usa la copia al escribir para que los objetos se copien solo si el programa intenta cambiar un valor en ellos. Esto significa que los distintos accesos tienen lo que en realidad es un puntero al mismo almacenamiento de datos. Entonces, aunque los datos se almacenan físicamente como una instancia en la memoria, en el nivel de la aplicación, estos valores están separados y la separación física se aplica mediante copia en escritura solo si es necesario. [62]

Programación orientada a protocolos [ editar ]

Una característica clave de Objective-C es su soporte para categorías , métodos que se pueden agregar para extender clases en tiempo de ejecución. Las categorías permiten extender las clases en el lugar para agregar nuevas funciones sin necesidad de crear una subclase o incluso tener acceso al código fuente original . Un ejemplo podría ser agregar compatibilidad con el corrector ortográfico a la NSStringclase base , lo que significa que todas las instancias de NSString en la aplicación obtienen el corrector ortográfico. El sistema también se utiliza ampliamente como técnica organizativa, lo que permite que el código relacionado se recopile en extensiones similares a bibliotecas. Swift continúa apoyando este concepto, aunque ahora se denominan extensiones y se declaran con la palabra claveextension. A diferencia de Objective-C, Swift también puede agregar nuevos descriptores de acceso, tipos y enumeraciones a las instancias existentes [ cita requerida ] .

Otra característica clave de Objective-C es el uso de protocolos , conocidos en la mayoría de los lenguajes modernos como interfaces . Los protocolos prometen que una clase en particular implementa un conjunto de métodos, lo que significa que otros objetos en el sistema pueden llamar a esos métodos en cualquier objeto que admita ese protocolo. Esto se usa a menudo en los lenguajes OO modernos como un sustituto de la herencia múltiple , aunque los conjuntos de características no son del todo similares. Un ejemplo común de un protocolo en Cocoa es el NSCopyingprotocolo, que define un método copyWithZone, que implementa la copia profunda en objetos. [63]

En Objective-C, y en la mayoría de los otros lenguajes que implementan el concepto de protocolo, depende del programador asegurarse de que los métodos requeridos se implementen en cada clase. [64] Swift agrega la capacidad de agregar estos métodos usando extensiones y usar programación genérica (genéricos) para implementarlos. Combinados, estos permiten que los protocolos se escriban una vez y admiten una amplia variedad de instancias. Además, el mecanismo de extensión se puede utilizar para agregar conformidad de protocolo a un objeto que no incluye ese protocolo en su definición. [63]

Por ejemplo, un protocolo podría declararse llamado StringConvertible, lo que garantiza que las instancias que se ajustan al protocolo implementen un toStringmétodo que devuelva un String. En Swift, esto se puede declarar con un código como este:

protocolo  StringConvertible {  func  toString ()  ->  String }

Este protocolo ahora se puede agregar a String, sin acceso a la fuente de la clase base:

 cadena de extensión :  StringConvertible {  func  toString ()  ->  String  {  self  } }

En Swift, al igual que 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 su tipo específico:

var  someSortOfPrintableObject :  StringConvertible ... print ( someSortOfPrintableObject . toString ())

No importa qué tipo de instancia someSortOfPrintableObjectsea, el compilador se asegurará de que cumpla con el protocolo y, por lo tanto, este código sea seguro. Esta sintaxis también significa que las colecciones también pueden basarse en protocolos, como let printableArray = [StringConvertible].

Como Swift trata las estructuras y clases como conceptos similares, tanto las extensiones como los protocolos se utilizan ampliamente en el tiempo de ejecución de Swift para proporcionar una API rica basada en estructuras. Por ejemplo, Swift usa una extensión para agregar el Equatableprotocolo a muchos de sus tipos básicos, como Strings y Arrays, lo que les permite compararlos con el ==operador. Un ejemplo concreto de cómo interactúan todas estas características se puede ver en el concepto de implementaciones de protocolo predeterminado :

func  ! = < T  :  Equatable > ( lhs :  T ,  rhs :  T )  ->  Bool

Esta función define un método que funciona en cualquier instancia conforme Equatable, proporcionando una función no igual . Cualquier instancia, clase o estructura, obtiene automáticamente esta implementación simplemente por ajustarse a Equatable. Como muchas instancias ganan a Equatabletravés de sus implementaciones base u otras extensiones genéricas, la mayoría de los objetos básicos en el tiempo de ejecución ganan igual y no igual sin código. [sesenta y cinco]

Esta combinación de protocolos, valores predeterminados, herencia de protocolo y extensiones permite que muchas de las funciones normalmente asociadas con las clases y la herencia se implementen en tipos de valor. [63] Si se usa correctamente, esto puede conducir a mejoras dramáticas en el rendimiento sin límites significativos en la API. Este concepto es tan ampliamente utilizado dentro de Swift que Apple ha comenzado a llamarlo un lenguaje de programación orientado a protocolos . Sugieren abordar muchos de los dominios de problemas que normalmente se resuelven a través de clases y herencia utilizando protocolos y estructuras en su lugar.

Bibliotecas, tiempo de ejecución y desarrollo [ editar ]

En los sistemas Apple, Swift usa el mismo tiempo 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 . [66] El código Swift y Objective-C se puede utilizar en un programa y, por extensión, C y C ++ también. A diferencia de C, el código C ++ no se puede utilizar directamente desde Swift. Se debe crear un contenedor Objective-C o C entre Swift y C ++. [67] En el caso de Objective-C, Swift tiene un acceso considerable al modelo de objetos y puede usarse para crear subclases, extender y usar código Objective-C para proporcionar soporte de protocolo. [68] Lo contrario no es cierto: una clase Swift no puede ser subclasificada en Objective-C. [69]

Para ayudar al desarrollo de dichos programas y la reutilización del código existente, Xcode 6 y superior ofrece un sistema semiautomático que crea y mantiene un encabezado puente para exponer el código Objective-C a Swift. Esto toma la forma de un archivo de encabezado adicional que simplemente define o importa todos los símbolos de Objective-C que necesita el código Swift del proyecto. En ese momento, Swift puede referirse a los tipos, funciones y variables declaradas en esas importaciones como si estuvieran escritas en Swift. El código Objective-C también puede usar código Swift directamente, importando un archivo de encabezado 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 de 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 pueden hacer que un símbolo sea inaccesible desde Objective-C. [70]

Swift también tiene soporte limitado para atributos , metadatos que lee el entorno de desarrollo, y no es necesariamente 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 una salida , disponible para su uso dentro de Interface Builder (IB). Una salida es un dispositivo que vincula el valor de la visualización en pantalla a un objeto en código.

En los sistemas que no son de Apple, Swift no depende de un tiempo de ejecución de Objective-C ni de otras bibliotecas del sistema de Apple; un conjunto de implementaciones Swift "Corelib" las reemplaza. Estos incluyen un "swift-corelibs-foundation" para reemplazar el Foundation Kit , un "swift-corelibs-libdispatch" para reemplazar el Grand Central Dispatch y un "swift-corelibs-xctest" para reemplazar el XCTest. API de XCode . [71]

A partir de 2019, con XCode 11, Apple también ha agregado un nuevo e importante paradigma de interfaz de usuario llamado SwiftUI. SwiftUI reemplaza el antiguo paradigma de Interface Builder con un nuevo paradigma de desarrollo declarativo. [72]

Gestión de la memoria [ editar ]

Swift utiliza el conteo automático de referencias (ARC) para administrar la memoria . Apple solía requerir la administración de memoria manual en Objective-C, pero introdujo ARC en 2011 para permitir una asignación y desasignación de memoria más fácil. [73] Un problema con ARC es la posibilidad de crear un ciclo de referencia fuerte , donde los objetos se referencian entre sí de una manera que puede llegar al objeto desde el que comenzó siguiendo las referencias (por ejemplo, A hace referencia a B, B hace referencia a A). Esto hace que se filtren en la memoria ya que nunca se liberan. Swift proporciona las palabras clave weaky unownedpara evitar fuertes ciclos de referencia. Por lo general, una relación padre-hijo usaría una referencia sólida, mientras que un niño-padre usaríaweakreferencia, donde padres e hijos pueden no estar relacionados, o unowneddonde un hijo siempre tiene un padre, pero el padre puede no tener un hijo. Las referencias débiles deben ser variables opcionales, ya que pueden cambiar y volverse nil. [74]

Un cierre dentro de una clase también puede crear un fuerte ciclo de referencia al capturar autorreferencias. Las autorreferencias para ser tratadas como débiles o sin dueño se pueden indicar usando una lista de captura.

Depuración y otros elementos [ editar ]

Un elemento clave del sistema Swift es su capacidad para depurarse y ejecutarse de forma limpia en el entorno de desarrollo, utilizando un ciclo de lectura, evaluación e impresión (REPL), lo que le confiere propiedades interactivas más en común con las capacidades de scripting de Python que con la programación del sistema tradicional Idiomas. El REPL se mejora aún más con el nuevo concepto de parques infantiles . Estas son vistas interactivas que se ejecutan dentro del entorno de Xcode que responden a cambios de código o depurador sobre la marcha. [75] Patios de recreoPermitir a los programadores agregar código Swift junto con documentación de rebajas. Si algún código cambia con el tiempo o con respecto a algún otro valor de entrada de rango, la vista se puede usar con el Asistente de línea de tiempo para demostrar la salida de forma animada. Además, Xcode tiene funciones de depuración para el desarrollo de Swift que incluyen puntos de interrupción, instrucciones paso a paso y paso a paso, así como desgloses de ubicación de elementos de interfaz de usuario para desarrolladores de aplicaciones.

Apple dice que Swift es "un lenguaje de programación de calidad industrial que es tan expresivo y agradable como un lenguaje de secuencias de comandos". [76]

Rendimiento [ editar ]

Muchas de las características introducidas con Swift tienen reconocidas compensaciones de rendimiento y seguridad. Apple ha implementado optimizaciones que reducen esta sobrecarga. [77]

Comparaciones con otros idiomas [ editar ]

Swift se considera un lenguaje de programación de la familia C y es similar a C de varias maneras:

  • La mayoría de los operadores de C se utilizan en Swift, pero hay algunos operadores nuevos, por ejemplo, para admitir operaciones de enteros con desbordamiento (consulte las diferencias).
  • Las llaves se utilizan para agrupar declaraciones.
  • Las variables se asignan con un signo igual , pero se comparan con dos signos iguales consecutivos . Se proporciona un nuevo operador de identidad, ===, para comprobar si dos elementos de datos se refieren al mismo objeto .
  • Las sentencias de control while, ify switchson similares, pero han extendido funciones, por ejemplo, una switchque toma los casos no enteros, whiley ifel apoyo a la coincidencia de patrones y condicionalmente desenvolver opcionales, forutiliza la sintaxis.for i in 1...10
  • Los corchetes se utilizan con matrices , tanto para declararlas como para obtener un valor en un índice dado en 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, como los métodos de instancia; selfen métodos de clase es la clase a la que se llamó al método.
  • Similar for... insintaxis de enumeración.

Las diferencias con Objective-C incluyen:

  • No es necesario que las declaraciones terminen con punto y coma ( ;), aunque deben usarse para permitir más de una declaración en una línea.
  • Sin archivos de encabezado.
  • Utiliza la 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 se pueden redefinir para las clases ( sobrecarga de operadores ) y se pueden definir nuevos operadores.
  • Las cadenas son totalmente compatibles con Unicode . La mayoría de los caracteres Unicode se pueden utilizar en identificadores u operadores.
  • Sin manejo de excepciones . Swift 2 presenta un modelo de manejo de errores diferente e incompatible. [78]
  • Se han eliminado varias características de los lenguajes de la familia C anteriores que son fáciles de usar incorrectamente:
    • Los punteros no están expuestos de forma predeterminada. No es necesario que el programador realice un seguimiento y marque los nombres para referenciarlos o eliminarlos.
    • Las asignaciones no devuelven ningún valor. Esto evita el error común de escribir en i = 0lugar de i == 0generar un error en tiempo de compilación.
    • No es necesario utilizar breaksentencias en switchbloques. Los casos individuales no pasan al siguiente caso a menos fallthroughque se utilice la declaración.
    • Las variables y constantes siempre se inicializan y los límites de la matriz siempre se comprueban.
    • Los desbordamientos de enteros , que dan como resultado un comportamiento indefinido para los enteros con signo en C, quedan atrapados como un error de tiempo de ejecución en Swift. Los programadores pueden optar por permitir desbordamientos mediante el uso de los operadores aritméticos especiales &+, &-, &*, &/y &%. Las propiedades miny maxse definen en Swift para todos los tipos de enteros y se pueden utilizar para comprobar de forma segura posibles desbordamientos, en lugar de depender de constantes definidas para cada tipo en bibliotecas externas.
    • La forma de un enunciado de ify while, que permite la omisión de llaves alrededor del enunciado, no está respaldada.
    • La enumeración de estilo C for (int i = 0; i < c; i++), que es propensa a errores de uno en uno , no se admite (desde Swift 3 en adelante). [79]
    • Los operadores de incremento y decremento previos y posteriores ( i++, --i...) no son compatibles (desde Swift 3 en adelante), más aún porque las fordeclaraciones de estilo C tampoco son compatibles desde Swift 3 en adelante. [80]

Desarrollo y otras implementaciones [ editar ]

Dado que el lenguaje es de código abierto, existen posibilidades de que se traslade a la web. [81] Algunos marcos web ya se han desarrollado, tales como IBM 's Kitura , perfecto y vapor .

Apple también ha iniciado un grupo de trabajo oficial de "API de servidor", [82] con miembros de la comunidad de desarrolladores de Swift desempeñando un papel central. [83]

Una segunda implementación libre de Swift que los objetivos de cacao , Microsoft 's Common Language Infrastructure ( NET ), y el de Java y Android plataforma existe como parte del compilador Elementos de RemObjects software . [84]

Al combinar cadenas de herramientas de LLVM y Macintosh Programmer's Workshop , es posible ejecutar un subconjunto muy pequeño del lenguaje en Mac OS 9 . [85]

Ver también [ editar ]

  • Comparación de lenguajes de programación
  • C objetivo
  • Kotlin (lenguaje de programación)
  • Python (lenguaje de programación)
  • Nim (lenguaje de programación)

Referencias [ editar ]

  1. ^ Patente de EE. UU. No. 9329844
  2. ^ "Swift ha alcanzado 1.0" . Manzana. 9 de septiembre de 2014 . Consultado el 8 de marzo de 2015 .
  3. ^ "Versión 5.3.3" .
  4. ^ https://forums.swift.org/t/swift-5-4-release-process/41936
  5. ^ "Rápido, objetivamente" . Swift es propietario y cerrado: está completamente controlado por Apple y no hay una implementación de código abierto.
  6. ^ Lattner, Chris (11 de junio de 2014). "Re: [LLVMdev] [cfe-dev] [Anuncio] posiciones abiertas en el equipo de compilación de Swift de Apple" . Archivado desde el original el 14 de julio de 2014 . Consultado el 12 de junio de 2014 . Puede imaginar que muchos de nosotros queremos que sea de código abierto y que forme parte de LLVM, pero la discusión aún no se ha producido y no lo hará durante algún tiempo.
  7. ^ Lattner, Chris (3 de junio de 2014). "Página de inicio de Chris Lattner" . Chris Lattner . Consultado el 3 de junio de 2014 . El lenguaje Swift es el producto del esfuerzo incansable de un equipo de expertos en lenguaje, gurús de la documentación, ninjas de optimización de compiladores y un grupo interno de prueba interna increíblemente importante que brindó comentarios para ayudar a refinar y probar ideas. Por supuesto, también se benefició enormemente de las experiencias ganadas con esfuerzo por muchos otros lenguajes en el campo, extrayendo ideas de Objective-C, Rust, Haskell, Ruby, Python, C #, CLU y demasiados otros para enumerarlos.
  8. ↑ a b Lattner, Chris (3 de junio de 2014). "Página de inicio de Chris Lattner" . Chris Lattner . Consultado 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, y solo unas pocas personas sabían de su existencia. Algunas otras (increíbles) personas comenzaron a contribuir en serio a fines de 2011, y se convirtió en un enfoque importante para el grupo de herramientas de desarrollo de Apple en julio de 2013 [...] extrayendo ideas de Objective-C , Rust, Haskell, Ruby, Python, C #, CLU y demasiados otros para enumerarlos.
  9. ^ "Construcción de assert () en Swift, Parte 2: __FILE__ y __LINE__" . Consultado el 25 de septiembre de 2014 .
  10. ^ "Influencias - La referencia de óxido" . doc.rust-lang.org . Consultado el 2 de mayo de 2020 .
  11. ^ "El puerto de Swift Linux" . Swift.org . Apple . Consultado el 3 de agosto de 2016 .
  12. ^ Timmer, John (5 de junio de 2014). "Una mirada rápida a Swift, el nuevo lenguaje de programación de Apple" . Ars Technica . Condé Nast . Consultado el 6 de junio de 2014 .
  13. ^ Programación orientada a protocolos en Swift . Apple . YouTube .
  14. ^ "Los conceptos son similares a los rasgos de óxido" .
  15. ^ Williams, Owen (2 de junio de 2014). "El sexagésimo cumpleaños de Tim Berners-Lee Apple anuncia Swift, un nuevo lenguaje de programación para iOS" . La próxima web . Consultado el 2 de junio de 2014 .
  16. ^ "El nuevo lenguaje de programación Swift de Apple ahora es de código abierto" . The Verge . Consultado el 5 de diciembre de 2015 .
  17. ^ "Apple Open Sources Swift en el último lanzamiento para la empresa" . Revista CIO. Los blogs del Wall Street Journal . 3 de diciembre de 2015 . Consultado el 5 de diciembre de 2015 .
  18. ^ "Mirando hacia atrás en Swift 3 y adelante a Swift 4" . Foros rápidos . Consultado el 19 de noviembre de 2018 .
  19. ^ "Evolución rápida" . Evolución rápida . Consultado el 19 de noviembre de 2018 .
  20. ^ "Las clasificaciones del lenguaje de programación de RedMonk: enero de 2018 - tecosystems" . redmonk.com . Consultado el 20 de noviembre de 2018 .
  21. ^ Kremenek, Ted (25 de marzo de 2019). "¡Lanzamiento de Swift 5!" .
  22. ^ Kremenek, Ted (20 de septiembre de 2019). "¡Lanzamiento de Swift 5.1!" .
  23. ^ a b Estado de la Unión de plataformas, sesión 102, Conferencia mundial de desarrolladores de Apple , 2 de junio de 2014
  24. ^ El lenguaje de programación Swift . Manzana . 2 de junio de 2014 . Consultado el 2 de junio de 2014 . Resumen de laicos .
  25. ^ "Swift ha alcanzado 1.0" . 9 de septiembre de 2014 . Consultado el 10 de septiembre de 2014 .
  26. ^ "Notas de la versión de Xcode 6.1" . 22 de octubre de 2014 . Consultado el 23 de enero de 2015 .
  27. ^ "Notas de la versión de Xcode 6.3" . 8 de abril de 2015 . Consultado el 8 de abril de 2015 .
  28. ^ "Aplicaciones Swift 2 en la App Store" . Blog de Swift . Consultado el 13 de marzo de 2016 .
  29. ^ Inc., Apple (13 de septiembre de 2016). "¡Lanzamiento de Swift 3.0!" . Swift.org . Consultado el 26 de octubre de 2016 .
  30. ^ Inc., Apple (17 de septiembre de 2017). "¡Lanzamiento de Swift 4.0!" . Swift.org . Consultado el 1 de marzo de 2018 .
  31. ^ Inc., Apple (29 de marzo de 2018). "¡Lanzamiento de Swift 4.1!" . Swift.org . Consultado el 30 de marzo de 2018 .
  32. ^ "Resultados de la encuesta de desarrollador de desbordamiento de pila 2015" .
  33. ^ "Resultados de la encuesta de desarrollador de desbordamiento de pila 2016" .
  34. ^ "Swift.org y código abierto" . Swift.org . Apple . Consultado el 25 de febrero de 2019 .
  35. ^ "Presentación de IBM Swift Sandbox - Swift" . Rápido . Consultado el 5 de diciembre de 2015 .
  36. ^ Mayo, Benjamin. "Escriba código Swift en un navegador web con IBM Swift Sandbox" . 9to5Mac . Consultado el 5 de diciembre de 2015 .
  37. ^ "Después de que Apple lo abre, IBM pone la programación Swift en la nube | ZDNet" . ZDNet . Consultado el 5 de diciembre de 2015 .
  38. ^ "Catálogo de paquetes Swift y desactivación de Swift Sandbox" . Consultado el 9 de noviembre de 2018 .
  39. ^ "Swift Playgrounds" . Desarrollador de Apple . Consultado el 19 de junio de 2016 .
  40. ^ "Swift Playgrounds - Preview" . Manzana . Consultado el 19 de junio de 2016 .
  41. ^ 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 .
  42. ^ Cunningham, Andrew (10 de enero de 2017). "Programador de Apple desde hace mucho tiempo y creador de Swift deja Apple por Tesla" . Ars Technica.
  43. ^ Wuerthele, Mike (13 de enero de 2017). "El nuevo jefe del proyecto Swift, Ted Kremenek, dijo que llevaría el espectáculo detrás de escena durante algún tiempo" . AppleInsider.
  44. ^ Miércoles, Daniel Eran Dilger; 19 de junio; 2019; Hora del Pacífico, 11:26 a. M. "WWDC19: SwiftUI fue la estrella más brillante en una galaxia de nuevas ideas" . AppleInsider . Consultado el 19 de julio de 2019 .CS1 maint: nombres numéricos: lista de autores ( enlace )
  45. ^ "Swift.org - Descargar Swift" . Consultado el 21 de junio de 2020 .
  46. ^ "Paquete rápido - termux" . Consultado el 21 de junio de 2020 .
  47. ^ a b Readdle (15 de enero de 2020). "Swift para Android: nuestra experiencia y herramientas" . Medio . Consultado el 20 de agosto de 2020 .
  48. ^ Anderson, Tim (30 de marzo de 2020). "Soporte oficial personalizado de Swift para Windows prometido en 5.3: Swift en más plataformas, siempre que no necesite una GUI" . El registro . Consultado el 18 de septiembre de 2020 .
  49. ^ Kremenek, Ted (25 de marzo de 2019). "¡Lanzamiento de Swift 5!" . Swift.org . Consultado el 28 de marzo de 2019 .
  50. ^ "Descarga Swift" . Swift.org . Manzana . Consultado el 15 de diciembre de 2020 .
  51. ^ Metz, Rachel (3 de junio de 2014). "Apple busca una forma rápida de atraer a más desarrolladores" . Revisión de tecnología .
  52. ^ Weber, Harrison (2 de junio de 2014). "Apple anuncia 'Swift', un nuevo lenguaje de programación para macOS e iOS" . VentureBeat .
  53. ^ "Ventajas de usar Swift" . themindstudios.com . Consultado el 24 de febrero de 2017 .
  54. ^ Macomber, Kyle; Yaskevich, Yavel; Gregor, Doug; McCall, John. "Múltiples cierres finales" . GitHub . Consultado el 19 de octubre de 2020 .
  55. ^ Lattner, Chris. "Permitir cierres finales en condiciones" . GitHub . Consultado el 19 de octubre de 2020 .guard
  56. ^ "Cadenas y caracteres" . developer.apple.com . Apple Inc. Consultado el 16 de julio de 2014 .
  57. ^ "Control de acceso" . developer.apple.com . Apple Inc. Consultado el 25 de octubre de 2016 .
  58. ^ "Tipos que aceptan valores NULL" , Guía de programación de C #, Microsoft.
  59. ^ "Tipos" . developer.apple.com . Apple Inc. Consultado el 16 de julio de 2014 .
  60. ^ a b "Clases y estructuras" . Apple.com .
  61. ^ Guhit, Fiel. "Estudio de caso de rendimiento en Swift 1.1, Swift 1.2 y Objective-C" .
  62. ^ Creación de mejores aplicaciones con tipos de valor . Manzana.
  63. ^ a b c "Referencia de protocolo de NSCopying" . Manzana .
  64. ^ "Trabajar con protocolos" . Manzana .
  65. ^ Thompson, Mattt (2 de septiembre de 2014). "Implementaciones de protocolo predeterminado de Swift" . NSHipster .
  66. ^ "¿Las aplicaciones basadas en Swift funcionan en macOS 10.9 / iOS 7 y versiones anteriores?" , Desbordamiento de pila
  67. ^ "Uso de Swift con Cocoa y Objective-C: Configuración básica" . apple.com . 6 de enero de 2015.
  68. ^ "Escribir clases rápidas con comportamiento Objective-C" , Apple Inc.
  69. ^ "Migración de su código Objective-C a Swift" .
  70. ^ "Swift y Objective-C en el mismo proyecto" , Apple Inc.
  71. ^ "Apple: busque" corelib " " . GitHub .
  72. ^ "Xcode - SwiftUI- Desarrollador de Apple" . developer.apple.com . Consultado el 1 de febrero de 2021 .
  73. ^ "Recuento automático de referencias" , Apple Inc.
  74. ^ Lanier, Brian; Groff, Joe. "Veloz intermedio" . Manzana . Consultado el 3 de julio de 2014 .
  75. ^ Metz, Cade. "Por qué los codificadores se están volviendo locos con el nuevo lenguaje de programación de Apple" . Cableado . Consultado el 16 de julio de 2014 .
  76. ^ Acerca de Swift , Apple Inc.
  77. ^ "Optimización del rendimiento rápido" . Apple, Inc. Junio ​​de 2015.
  78. ^ "Manejo de errores en Swift-Language" . stackoverflow.com .
  79. ^ "manzana / evolución rápida" . GitHub . Consultado el 4 de abril de 2016 .
  80. ^ "manzana / evolución rápida" . GitHub . Consultado el 4 de abril de 2016 .
  81. ^ Barbosa, Greg (22 de febrero de 2016). "IBM lleva Swift a la nube, lanza el marco web Kitura escrito en el lenguaje de programación de Apple" . 9to5Mac . Consultado el 16 de mayo de 2016 .
  82. ^ Inc., Apple (25 de octubre de 2016). "Grupo de trabajo de APIs del servidor" . Swift.org . Consultado el 28 de octubre de 2016 .
  83. ^ Inc., Apple. "Swift.org" . Swift.org . Consultado el 28 de octubre de 2016 .
  84. ^ "Compilador de elementos de RemObjects" . Consultado el 17 de enero de 2016 .
  85. ^ Rose, Jordan (1 de abril de 2020). "Swift en Mac OS 9" . -dealloc .

Enlaces externos [ editar ]

  • Página web oficial
  • Desarrollador rápido de Apple
  • Código fuente de Swift en GitHub
  • Swift del lado del servidor
  • Ejemplo rápido
  • Swift del lado del servidor: el marco de vapor