Inferencia de Tipos de Datos

Hasta ahora se ha visto que se puede declarar una variable o constante sin necesidad de asinar un valor inicial:

let isValid: Bool

if user.verified, user.phoneNumber != nil {
	isValid = true
} else {
	isValid = false
}

En el ejemplo anterior, la constante isValid no tiene ningún valor asignado al momento en que se declara — pero sí tiene información sobre el tipo de dato que puede aceptar (Bool). Esto previene que dentro de alguna de las ramas de ejecución en el condicional se le sea asignado algún otro tipo de dato.

let isValid: Bool

isValid = 1 // #=> Error de compilación, se le quiere asignar un tipo Int a Bool.


Independientemente de la fuente del tipo de dato asignado a un miembro en un programa de Swift, ya sea que haya sido inferido o declarado explícitamente, Swift hará cumplir la regla que dice que un miembro de un programa de Swift solamente puede tener valores del tipo de dato con el que fue declarado inicialmente.

Qué es

Cuando a una variable o constante se le asigna un valor inicial en el momento en el que se declara, no es necesario declarar el tipo de dato:

let age1 = 1
let age2: Int = 1

En el ejemplo anterior, tanto age1 como age2 son de tipo de dato Int aunque a age1 no se le declaró explícitamente el tipo de dato adecuado. Swift es suficientemente inteligente para inferir a través del contexto de la declaración el tipo de dato que esa variable o constante tiene, sin necesidad de que éste sea explícitamente declarado.

Infiriendo parámetros

La inferencia de tipos de datos no solamente funciona al momento de realizar declaraciones de variables o constantes. También es especialmente útil cuando se está trabajando con funciones:

func printValue(value: Int) {
    print("This is an Int: \(value)") // #=> This is an Int: 1
}

func printValue(value: Bool) {
    print("This is a Bool: \(value)") // #=> This is a Bool: false
}

let a = false
let b = 1

printValue(value: a)
printValue(value: b)

En el ejemplo anterior…

  1. Dos funciones con exactamente el mismo nombre. Lo único diferente entre ambas funciones es el tipo de dato del único parámetro que aceptan.
  2. Tanto a como b tienen su tipo de dato inferido a partir del valor que se les asignó en su delcaración, Bool e Int, respectivamente.
  3. Aunque las llamadas a las funciones printValue(value:) se ven exactamente iguales en código, Swift puede inferir a través del tipo de dato del parámetro asignado cuál es la función correcta a llamar en cada caso.

Inferencia de números con punto flotante

En el caso especial de que Swift tenga que inferir algún tipo de dato que involucre números con punto flotante, siempre se preferirá Double sobre Float, a menos que se declare explícitamente otro caso:

let doublePi = 3 + 0.14159			// doublePi es tipo Double
let floatPi: Float = 3 + 0.14159	// floatPi es explícitamente declarado como Float

Swift es un lenguaje de programación de tipos estáticos, lo que significa que cualquier cosa que se pueda representar en Swift tendrá un tipo de dato asignado. Esto significa también que la inferencia de datos funciona para cualquier tipo de dato, independientemente de si este es parte de Swift o es definido por el usuario.


Relacionados