Swift

Swift es un lenguaje de programación creado por Apple y cada vez se usa más. Muchos desarrolladores ya están creando o modificando sus proyectos y aprendiendo las ventajas que trae este lenguaje. En el texto de hoy mostraremos las mejoras que Swift presenta para los programadores.

Swift es un lenguaje de programación desarrollado por Apple para el desarrollo en sistemas iOS, macOS, watchOS, tvOS, Windows y Linux. Fue desarrollado para mantener la compatibilidad con Cocoa API y con el código Objective-C existente. El compilador de Swift usa la infraestructura LLVM y se incluye con Xcode.

En 2014, Swift se anunció en la WWDC, la conferencia anual de Apple. Comenzando con la versión 2.2 en diciembre de 2015, se distribuyó bajo la licencia Apache 2.0, cuando Apple puso a disposición el código fuente de Swift como un proyecto de código abierto.

Con la apertura del código fuente, fue posible utilizar el lenguaje en otras esferas de desarrollo, principalmente para aplicaciones Web, y existían frameworks que ayudaban en el desarrollo, como: Vapor, Perfect y Kitura, propiedad de IBM.

Swift fue aceptado rápidamente por los desarrolladores de iOS, y esto contribuyó en gran medida al rápido desarrollo del lenguaje de programación, con nuevas versiones lanzadas aproximadamente cada cinco o seis meses. Por eso Swift está entre los 20 más populares lenguajes del mercado

Swift se inspiró en lenguajes como Objective-C, Rust, Haskell, Ruby, Pytjon, C#, entre otros. Es una alternativa al lenguaje Objective-C que emplea conceptos modernos de la teoría del lenguaje de programación y se esfuerza por proporcionar una sintaxis más simple. En su presentación, fue descrita como: “Objective-C sin la corpulencia de C”.

En Swift vemos conceptos clave de Objective-C como protocolos, cierres y categorías, sin embargo, la sintaxis a menudo se reemplaza por versiones más limpias y que permiten la aplicación de estos conceptos en otras estructuras del lenguaje.

¿Qué es Swift?

Swift es un lenguaje de programación fuertemente tipado, estático e inferido. Es decir, los valores asignados a las variables en Swift deben ser del mismo tipo que la variable declarada (tipado fuerte), que el tipo de una variable se verifique y establezca en tiempo de compilación (tipado estático) y que los tipos de variables se puedan inferir por el compilador a partir de los valores pasados al inicio (tipado inferido).

Los tipos de variables en Swift pueden ser opcionales, esto hace que el desarrollo sea más seguro, reduciendo el riesgo de un comportamiento incierto causado por la falta de valores esperados en ciertas partes del programa.

Todavía en el lado de la seguridad, Swift verifica que sus variables se hayan inicializado antes de su uso, fuerza la inicialización de los objetos para que nunca sean nulos, verifica los desbordamientos en matrices y números enteros, y administra automáticamente la asignación de memoria por usted.

Y para concluir lo seguro que es, definir constantes es súper simple, con la palabra clave let, y definir variables aún más, con la palabra clave var.

Todavía puede encontrar los siguientes elementos en Swift:

  • Cierres Unificados con punteros de función;
  • Tipos genéricos;
  • Tuplas;
  • Superestructuras, que soportan la definición de métodos, extensiones e implementación de protocolos;
  • Control de flujo y aún más seguridad con guardar, diferir y repetir palabras clave.

Swift también es multiparadigma, apoyando el desarrollo en paradigmas orientados a objetos, imperativos, concurrentes y funcionales.

Swift x Objective-C

Con la aparición de Swift, Objective-C no dejó de existir, hoy en día se considera un lenguaje muy maduro y estable, y Swift fue diseñado desde el principio para ser compatible con él. Y ambos son compatibles con Cocoa API y Cocoa Touch Framework, utilizados en el desarrollo de aplicaciones para iDevices y Macs.

Este marco contiene funciones que permiten a los desarrolladores dibujar imágenes y textos en la pantalla, respondiendo a la interacción del usuario. De esa manera, cuando escuche que aún necesita aprender Objective-C para crear aplicaciones para iOS, la mayoría significa que necesita aprender a usar el marco Cocoa Touch y con Swift tiene una forma más de comenzar a usar este marco.

Además, ambos lenguajes son compatibles con la arquitectura LLVM de los compiladores, lo que permite reutilizar múltiples herramientas de compilación de una a otra.

Al comparar Objective-C, que es un lenguaje con más de 20 años, Swift trae facilidades como Generics y una sintaxis más simple donde con pocas líneas de código el programador puede hacer más cosas de las que haría con Objective-C. Swift se parece mucho a los lenguajes de scripts como Ruby y Python, sin embargo, mantiene las llamadas de métodos centrales similares a Objective-C, lo que facilita la migración de desarrolladores nuevos y antiguos.

Objective-C traduce las llamadas a métodos en una llamada objc_msgSend. Se encarga de seleccionar lo que se quiere enviar y su objeto, buscando la parte del código que supuestamente debe manejar los eventos de este método a través de la tabla de métodos de la clase. Esto es extremadamente rápido, pero a veces hace mucho más de lo necesario. Cuando declara un objeto MyObject*, puede ser MyObject o una subclase, puede ser una instancia de un tipo estático e incluso una instancia de una clase completamente diferente. De esa manera, puede “mentirle” al compilador sobre el tipo de objeto que está enviando y su código seguirá funcionando.

A diferencia de Objective-C, en Swift no puedes “mentirle” al compilador, el objeto debe ser más específico, si creamos una instancia de un objeto de la clase MyClass, puede ser una instancia de MyClass o MySubclass, nada más. En lugar de usar objc_msgSend, el compilador de Swift emite código que realiza una llamada en una vtable, una matriz de funciones y punteros a los que se accede mediante un índice:

callMethod = objeto->clase.vtable[indexOfMethod1]
métodollamada()
clase MiClase {
func metodo1() { print("llamando al metodo1") }
@final func method2() { print("llamando al método2") }
}

clase MiSubClase: MiClase {
override func method1() { print("llamando a la subclase method1") }
}

Swift: ventajas y desventajas

Swift vino a resolver la mayor queja de los programadores con respecto a Objective-C la sintaxis complicada y difícil de depurar, ya que Swift es más fácil, conciso y expresivo.

Un buen ejemplo de esto se puede encontrar en el ejercicio inicial “Hello World” en ambos lenguajes, en la siguiente tabla:

A pesar de ser más sencillo, Apple deja muy claro que esa sencillez no resta potencia a este lenguaje.

Es un lenguaje rápido, como su nombre indica, seguro, escalable, con gestión automática de memoria y por ser muy fácil de leer, también facilita que nuevos desarrolladores se sumen al equipo con el proyecto en curso.

A continuación, veremos algunas de las principales características de Swift.

Controle de acceso

Swift admite seis niveles de control de acceso con símbolos: open, public, internal, fileprivate, y private. A diferencia de otros lenguajes orientados a objetos, estos controles de acceso ignoran las jerarquías de herencia: private indica que un símbolo es accesible solo dentro del alcance inmediato, fileprivate indica que solo es accesible dentro del archivo, internal indica que es accesible dentro del alcance del módulo que contiene o, public indica que es accesible desde cualquier módulo, y open, solo para clases y sus métodos, indica que la clase puede ser “subclasificada” desde fuera del módulo.

Tipo de valores

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 objeto identificador se representa mediante un puntero.

Los objetos se pasan entre métodos copiando el valor del puntero, lo que permite que cualquier persona con una copia acceda a los datos contenidos en el montón. A su vez, los tipos básicos como los valores enteros y de coma flotante se representan directamente. Los identificadores contienen los datos, no un puntero, y estos datos se pasan directamente a los métodos mediante la copia. Estos estilos de acceso se denominan pass-by-reference para objetos y pass-by-value para tipos base.

Similar a C# (si desea saber más sobre este lenguaje, tenemos un texto en nuestro blog: C# – Variables y Constantes), Swift admite de forma nativa objetos que utilizan ambas semánticas de pasar por referencia y pasar por valor. El primero se usa para declaración de clase y el segundo para Structs.

Y hablando de Structs, en Swift tiene casi todas las mismas características que las clases: métodos, protocolos de implementación y uso de mecanismos de extensión. Por esta razón, Apple nombró genéricamente todos los datos como instancias, en lugar de objetos o valores. Sin embargo, las Structs no permiten la herencia.

// Definición de struct
struct Resolution {
var width = 0
var height = 0
}

// creación de instancias
let hd = Resolution(width: 1920, height: 1080)

// Dado que "Resolution" es una estructura, se crea una copia de la instancia
var cinema = hd

Enumeraciones y coincidencia de patrones

En Swift, las enumeraciones fuertemente tipadas y sus variantes tienen múltiples valores.

Estos son algunos ejemplos de declaración de enumeraciones y coincidencia de patrones:

enum Browser {
case chrome
case firefox
case safari
case edge
case ie(UInt8)
}

let browser = Browser.ie(11)
switch browser {
case .chrome:
fallthrough // .chrome ou .edge
case .edge:
print("Chromium")
case let .ie(version):
print("Internet Explorer (version)")
default:
print("Otro navegador")
}

Opciones

Una característica importante de Swift son los tipos opcionales, que permiten que los valores o referencias funcionen de manera similar al patrón C común, donde un puntero puede hacer referencia a un valor o ser nulo.

let website: String? = "https://www.wikipedia.org"
if website != nil {
print("Website: (website!)") // `!` desenvolver a la fuerza el valor
}

// Formulario alternativo (predeterminado)
if let addr = website {
print("Website: (addr)")
}

// Formulario alternativo (guardia)
func unwrap(_ website: String?) -> String {
guard let addr = website else {
return "" // Regresa prematuramente
}
return addr
}

Manejo de errores

Swift tiene excepciones similares a Objective-C. Como por ejemplo:

enum ValueError: Error {
    case tooSmall
    case tooLarge
}

// Función que puede fallar
func verify(n: Int) throws -> Int {
    guard n >= 4 else {
        throw ValueError.tooSmall
    }

    guard n <= 20 else {
        throw ValueError.tooLarge
    }

    return n
}
Y el manejo de errores:
do {
    print("Número:", try verify(n: 3))
    print("Número:", try verify(n: 4))
} catch ValueError.tooSmall { // Detectar error específico
    print("Erro: número muy pequeño ")
} catch { // Demasiado erros
    print("Erro")
}

Genérico

Ejemplo de un árbol binario en Swift:

// Los tipos recursivos deben declararse como `indirect`
indirect enum Tree {
case empty
case node(T, Tree, Tree)
}

let tree = Tree.node(5.96, .empty, .node(1.0, .empty, .empty))

// El primer miembro se extrae como una constante; ignorar a otros miembros
if case let .node(value, _, _) = tree {
print("(value)")
}

// Los miembros se extraen si se cumple la condición.
if case let .node(value, left, right) = tree, value < 6.0 {
print("-> (left)")
print("-> (right)")
}

Iteradores y cierres

Un iterador, en Swift, está representado por el protocolo IteratorProtocol; el protocolo Sequence proporciona métodos de adaptador para crear nuevos iteradores. También tiene un literal para representar rangos (un tipo de iterador).

En el siguiente ejemplo, el programa enumera los números primos entre 4 y 20:

var numbers: [Int] = [];
// `4...20` es un iterador inclusivo (incluye 20)for i in 4...20 {
// `2..

Conclusión

Con Swift, Apple ha mejorado su herramienta de desarrollo Xcode al agregar una parte de Playground en la que el programador puede probar fácilmente su código sin tener que construir o compilar. Además de mostrar el resultado de forma inmediata, también muestra gráficos sobre el rendimiento del código.

Si te preguntas por qué aprender a programar en Swift si ni siquiera tengo una Mac, esta es la mejor parte: no necesitas una Mac para aprender a programar o desarrollar soluciones usando Swift.

La gran mayoría de los editores de código agnósticos (por ejemplo, Atom, VSCode, Sublime, etc.) ya son compatibles con Swift. Además, puede compilar código escrito en Swift en su Linux, ¡gracias a que el lenguaje está disponible como código abierto! Y si usa Windows, también puede hacerlo, gracias a la compatibilidad de Swift con el lenguaje C y la amplia colección de bibliotecas C ya presentes en el sistema que también admite Swift.

En conclusión, Swift es un lenguaje muy seguro, de sintaxis limpia, muy accesible y fácil de aprender, tanto si estás empezando a aprender a programar como si eres un veterano con años de experiencia en otros lenguajes.

Con él tendrás acceso al mundo del desarrollo de iOS, a través de Xcode y Cocoa Touch Framework, así que, si ese es tu objetivo, ¡aprender Swift es un gran comienzo!

En beecrowd ofrecemos Swift en nuestra plataforma, ¡ven a practicar con nosotros!

¿Te gustó nuestro contenido? Así que síganos en las redes sociales para estar al tanto de más información y siga nuestro blog.

CONTENIDO

Nuestros artículos más recientes
Lea sobre las últimas tendencias en tecnología
blog skills
beecrowd ha actualizado la pantalla de habilidades, haciendo que sea más fácil...
UXblogfix
UX es fundamental en el desarrollo de software, ya que influye directamente...
Blog 12-09
La programación funcional se está convirtiendo en una tendencia en el desarrollo...

Extra, extra!

Assine nossa newsletter

Fique sempre atualizado com as novidades em tecnologia, transformação digital, mercado de trabalho e oportunidades de carreira

¿Le gustaría hablar con un representante de ventas?

Interesado en: