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!.
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.
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.
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
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"
SPONSORED Take the pain out of configuring and testing your paywalls. RevenueCat's all new Paywall Editor allow you to remotely configure your paywall view without any code changes or app updates.
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.