En este artículo veremos las conversiones de tipos en Swift, que al igual que en otros lenguajes, son muy importantes a la hora de crear nuestros propios programas. Veremos como hacer conversiones a números enteros y números en punto flotante de los que ya hablamos en el artículo Tipos de datos numéricos en Swift.
Conversiones de tipos en Swift
Lo normal cuando programamos en lenguaje Swift es usar siempre el tipo de dato Int para las constantes y variables que declaramos, aun cuando en la mayoría de ocasiones sabemos que nunca van a tomar valores negativos. Usar el tipo de datos entero por defecto en todas las situaciones significa que las constantes y variables están disponibles desde ya y nos va a facilitar mucho la tarea de programar.
Conversiones de tipos en Swift, usaremos otro tipo de enteros cuando queramos hacer una tarea en la que, por ejemplo, necesitemos expecificar el tamaño de los datos que provienen de una fuente externa (temperatura, caudal, etc.), o por otras cuestiones como el aumento del rendimiento de nuestros programas, la optimización del uso de memoria, etc. Si usamos tamaños explícitos en estas situaciones nos ayudará a captar cualquier desbordamiento accidental que pueda provocar un error en nuestro programa.
Enteros
El rango de números que pueden ser almacenadas en una constante o variable entera es diferente para cada tipo de datos numérico. Por ejemplo en las conversiones de tipos en Swift, una constante de tipo Int8 puede almacenar números entre -128 y 127, mientras que una constante UInt8 puede almacenar números entre 0 y 255. Si intentamos almacenar un valor numérico que no cabe en una constante de tipo entero, se nos mostrará un error en tiempo de compilación como podemos ver en el siguiente fragmento de código:
let noPuedeSerNegativa: UInt8 = -1
// UInt8 no puede almacenar valores negativos (es unsigned) y por eso nos va mostrar un error
let demasiadoGrande: Int8 = Int8.max + 1
// Int8 no puede almacenar un valor mayor que su valor máximo y en este caso también nos va a mostrar un error
Porque cada tipo numero puede almacenar distintos rangos de valores, necesitamos un mecanismo que nos permita convertir entre los distintos tipos. Este tipo de enfoque evita errores de conversiones ocultos y nos ayuda a realizar conversiones explícitas en nuestro código.
Para convertir un numero determinado a otro, necesitamos inicializar un nuevo numero del tipo deseado con el valor existente. En el siguiente ejemplo, el valor de la constante dosMil es de tipo UInt16, mientras que la constante uno es de tipo UInt8. Según lo comentado, es evidente que estas constantes no se pueden sumar directamente porque no son del mismo tipo. Por el contrario, este ejemplo usa UInt16 (uno) para crear un nuevo UInt16 con el valor 1 el cual será usado en la expresión suma en lugar de su valor original:
let dosMil: UInt16 = 2_000
let uno: UInt8 = 1
let dosMilMasUno = dosMil + UInt16(uno)
Ahora como en ambos lados de la expresión suma usamos el tipo de datos UInt16 la operación está permitida. La constante resultante dosMilMasUno va a ser implícitamente de tipo UInt16 porque es la suma de dos valores UInt16.
AlgunTipo (valorInicial) es la forma por defecto que tiene el lenguaje Swift para convertir un valor inicial de un tipo en otro tipo. El tipo de datos UInt16 tiene un inicializador que acepta un valor de tipo UInt8 pero esto no quiere decir que se pueda pasar cualquier valor a dicho inicializador. Si queremos proporcionar valores distintos a los inicializadores de tipos existentes lo haremos con la nueva funcionalidad Extensiones que será cubierta en un próximo artículo.
Punto Flotante
Las conversiones de tipos en Swift entre enteros y números en punto flotante deben se de hacerse de forma explícita como podemos ver en el siguiente ejemplo:
let enteroTres = 3
let numeroFlotante = 0.14159
let pi = Double(enteroTres) + numeroFlotante
// pi es igual a 3.14159 y va a ser de tipo Double
En el ejemplo anterior, la constante enteroTres es convertida de forma explícita al tipo de datos Double para que ambos lados de la suma sean del mismo tipo. Sin esta conversión explícita la suma nos daría un error.
Al revés, es decir, las conversiones entre punto flotante y números enteros también deben de hacerse de forma explícita. Un tipo Int puede ser inicializado con un valor de tipo Double o Float como se puede ver en el siguiente fragmento de código:
let enteroPi = Int(pi)
// enteroPi es igual a 3 y es inicializado de forma explícita al tipo Int
Los valores en punto flotante cuando son usados en un inicializador Int para crear un nuevo número entero siempre son truncados. Esto significa que 4.75 será 4 y -3.9 será -3.
Las reglas usadas para convertir constantes y variables numéricas (enteras o en punto flotante) son diferentes de las reglas para los literales numéricos. El valor literal 3 puede ser añadido directamente al valor literal 0.14159. Esto es así debido a que los literales numéricos no tienen un tipo explícito en sí mismos. El tipo de dato del literal numérico es inferido cuando es evaluado por el compilador de Swift.
Hasta aquí el artículo en el que hemos repasado como realizar conversiones de tipos numéricos en Swift. Espero que os haya resultado útil y que sobre todo os ayude a prevenir molestos errores en vuestros programas por conversiones implícitas en variable y constantes. Nos leemos en el próximo.
Adiós, os!