Swift cuenta con un poderoso mecanismo de inferencia de tipos: permite al compilador determinar automáticamente el tipo de un valor sin que el programador tenga que especificarlo explícitamente. La inferencia de tipos facilita el código y reduce su "ruido". Por ejemplo:
let number = 42 // inferido como Int let name = "John" // inferido como String let items = [1, 2, 3] // inferido como [Int]
Sin embargo, es importante tener en cuenta algunos matices:
¿Qué tipo obtendrá la variable si declaramos
let emptyArray = []?
A menudo se responde que emptyArray será un arreglo "de cualquier cosa" o [Any]. Sin embargo, el compilador de Swift no podrá inferir el tipo y producirá un error:
let emptyArray = [] // Error: el literal de colección vacío requiere un tipo explícito
Para utilizar un arreglo vacío, es necesario especificar el tipo explícitamente:
let emptyArray: [Int] = []
Historia
El equipo agregó un diccionario vacío como let params = [:] y esperaba que el tipo fuera [String: Any], sin embargo, el compilador no pudo inferir el tipo, lo que provocó que la compilación fallara. Resultado: tiempo perdido tratando de averiguar la causa debido a las particularidades de la inferencia de tipos.
Historia
En el proyecto se utilizó un tipo de salida de una función que fue definido como let value = decode(json). El desarrollador tenía la expectativa de que fuera [String: Any], pero debido a la ambigüedad, el analizador devolvía Any, lo que provocó que la aplicación fallara al convertir el tipo en tiempo de ejecución.
Historia
Se intentaron agregar valores de diferentes tipos en un arreglo sin especificar explícitamente — let items = [1, "two", 3.0]. Swift infería el tipo como [Any], pero esto causó errores en la lógica donde se esperaba un arreglo de elementos del mismo tipo para operaciones posteriores.