NEW: Learn SwiftUI with my free YouTube video series! >>

< Previous: Variables y constantes   Next: Operadores >

Tipos de datos

Existen muchos tipos de datos, en Swift todos son manejados de forma individual. Ya has visto uno de los tipos más importantes cuando asignaste texto a una variable. En Swift este tipo de dato se llama String - literalmente, una cadena de caracteres.

Las cadenas de caracteres o String pueden ser largas (por ejemplo, un millón de letras o más), cortas (por ejemplo 10 letras) o, incluso, vacías (sin letras); no importa cómo sean: todas son cadenas de caracteres desde la perspectiva de Swfit y todas funcionan de la misma forma. Swift sabe que name debe almacenar una cadena de caracteres porque cuando declaramos y definimos la variable le hemos asignado: "Tim McGraw". Si cambiamos el código a esto, dejaría de funcionar:

var name
name = "Tim McGraw"

En esta ocasión Xcode mostrará un mensaje de error, no tendrá mucho sentido por ahora: "Type annotation missing in pattern". Lo que quiere decir es "No puedo inferir qué tipo de dato es name porque no has proporcionado suficiente información".

Ahora, tienes dos opciones: crear una variable y en la misma línea asignarle un valor o indicar explícitamente el tipo de dato que la variable es capaz de almacenar, incluso si no estás asignándole un valor en este momento, esto se conoce como especificación de tipo (type annotation).

Anteriormente has visto la primera opción, ahora veamos la segunda: type annotations. Sabemos que name va a almacenar cadenas de caracteres, le podemos decir esto a Swift escribiendo dos puntos (":") y String, de la siguiente forma:

var name: String
name = "Tim McGraw"

En aplicaciones reales - a diferencia de los playgrounds - esto funciona bien porque Swift entiende qué tipo de dato es capaz de almacenar name en el futuro. Playgrounds son un caso un tanto especial, te mostrará un error.

Nota: algunas personas prefieren agregar un espacio antes y despues de los dos puntos (":"), escribiendo var name : String pero esto es incorrecto, sin embargo, es bueno ser educados y no mencionarlo públicamente.

La lección que debemos aprender es que Swift siempre quiere saber qué tipo de datos toda variable o constante es capaz de almacenar. Siempre. No hay escapatoria y esto es bueno porque aseguramos lo que se conoce como type safety - si decimos "esto va a almacenar una cadena de caracteres" y luego intentamos almacenar un conejo, Swift no nos lo permitirá.

Podemos probar esto ahora, al mismo tiempo que les presento otro tipo de datos importante llamado Int, que proviene de "Integer" (enteros). El tipo de dato entero, como su nombre lo indica, son números redondos como 3, 30, 300 o -16777216. Por ejemplo:

var name: String
name = "Tim McGraw"

var age: Int
age = 25

Esto declara una variable como cadena de caracteres y otra como entero. Observa cómo ambas String e Int comienzan con una letra mayúscula, mientras que name y age no - esta es la convención de estilo estándar de Swift. A Swift no le interesan las convenciones de estilo (podemos escribir los nombres como queramos!), sin embargo, si que le importa a los desarrolladores. En este caso, los nombres de los tipos de datos comienzan con letra mayúscula mientras que las variables y constantes no.

Ahora que tenemos dos variables de dos tipos, se puede observar type safety en acción, escribe esto:

name = 25
age = "Tim McGraw"

En este código, estás intentando almacenar un número entero en una variable que ha sido definida como cadena de caracteres, y una cadena de caracteres en una variable que ha sido definida como entero - afortunadamente, Xcode mostrará errores. Podrías considerar esta funcionalidad como algo pedante, sin embargo, es muy útil: prometes que una variable va a almacenar un tipo de datos particular y Xcode se va a asegurar de que sea así en todo tu código.

Antes de continuar, por favor elimina las dos líneas de código que están causando el error, si no tu playground no va a funcionar correctamente!.

Float y Double

Veamos dos tipos de datos más, llamados Float y Double. Esta es la forma en la que Swift gestiona los numeros con componentes decimales (o fraccionarios), como por ejemplo 3.1, 3.141, 3.1415926 y -16777216.5. Existen dos tipos de datos para este tipo de números y esto nos permite seleccionar la precisión que queremos, sin embargo, la mayor parte del tiempo esto no es importante por lo que la recomendación oficial de Apple es siempre utilizar Double porque tiene la precisión más alta.

Intentemos poner esto en un playground:

var latitude: Double
latitude = 36.166667

var longitude: Float
longitude = -86.783333

Observamos los números que están a la derecha (después del punto decimal). Fíjate bien porque hay una pequeña discrepancia. Decimos que longitude debe ser igual a -86.783333, pero en el panel de resultados (a la derecha de nuestro playground) veremos -86.78333 - el último 3 no aparece. Ahora, podrías decir "entre nos ¿Qué importancia tiene 0.000003?", sin embargo, evidencia lo que mencioné antes sobre la precisión.

Los playgrounds se actualizan según vas escribiendo, podemos probar lo siguiente para que puedas ver exactamente cómo Float y Double se diferencian. Prueba cambiando el código a esto:

var longitude: Float
longitude = -86.783333
longitude = -186.783333
longitude = -1286.783333
longitude = -12386.783333
longitude = -123486.783333
longitude = -1234586.783333

Intenta ir agregando números antes del punto decimal, mientras mantienes la misma cantidad de números luego de este. Observarás, en el panel de resultados, que agregando más números antes del punto, Swift elimina los números luego de este. Esto es porque Swift tiene un espacio limitado para almacenar tu número, entonces lo que hace es almacenar lo más importante primero - un margen de error de 1.000.000 es algo importante, por el contrario un margen de error de 0.000003, no lo es tanto.

En Swift `Float` almacena menos datos que un `Double` por lo tanto es mejor utilizar `Double` cuando sea posible.

Ahora, cambia de Float a Double y verás que Swift siempre muestra (imprime) el valor correcto:

var longitude: Double

Esto sucede, de nuevo, porque Double tiene el doble de precisión en comparación con Float y por eso no necesita truncar el número para poder almacenarlo. El tipo de dato Double tiene sus limitaciones, si intentas almacenar un número bastante grande como 123456789.123456789, este es redondeado a 123456789.12345679.

Boolean

Swift proporciona un tipo de dato que puede almacenar si un valor es verdadero (true) o falso (false), se llama Bool que proviene de "Boolean". Este tipo de dato no tiene acepta "puede que" o "quizá", solo valores absolutos: true o false. Por ejemplo:

var stayOutTooLate: Bool
stayOutTooLate = true

var nothingInBrain: Bool
nothingInBrain = true

var missABeat: Bool
missABeat = false

Usando la especificación de tipo de forma inteligente

Como hemos aprendido, hay dos formas de decirle a Swift el tipo de dato que una variable puede almacenar: asignar un valor a la variable al momento de su creación o utilizar la especificación de tipo (type annotation). Si puedes elegir, la primera alternativa es preferible porque es más clara. Por ejemplo:

var name = "Tim McGraw"

…es preferible a:

var name: String
name = "Tim McGraw"

Esto aplica a todos los tipos de datos. Por ejemplo:

var age = 25
var longitude = -86.783333
var nothingInBrain = true

Esta técnica es llamada inferencia de tipo (type inference), porque Swift puede inferir qué tipo de dato debe utilizar la variable, basándose en el tipo de dato que estamos almacenando. Cuando se trata de números como -86.783333, Swift va a inferir que es Double en vez de un Float.

En aras de mostrar todas las posibilidades, debo agregar que es posible especificar el tipo de dato y, además, proporcionar un valor al mismo tiempo, así:

var name: String = "Tim McGraw"

LEARN SWIFTUI FOR FREE I wrote a massive, free SwiftUI tutorial collection, and also have a growing list of free SwiftUI tutorials on YouTube – get started today!

< Previous: Variables y constantes   Next: Operadores >
MASTER SWIFT NOW
Buy Testing Swift Buy Practical iOS 12 Buy Pro Swift Buy Swift Design Patterns Buy Swift Coding Challenges Buy Server-Side Swift (Vapor Edition) Buy Server-Side Swift (Kitura Edition) Buy Hacking with macOS Buy Advanced iOS Volume One Buy Advanced iOS Volume Two Buy Hacking with watchOS Buy Hacking with tvOS Buy Hacking with Swift Buy Dive Into SpriteKit Buy Swift in Sixty Seconds Buy Objective-C for Swift Developers Buy Beyond Code

Was this page useful? Let me know!

Click here to visit the Hacking with Swift store >>