Cómo saber el tipo de variable en Swift: guía completa con ejemplos de código

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿por qué es necesario saber el tipo de variable en Swift?

\n

¿Alguna vez has escrito código en Swift y de repente te has encontrado pensando: «¿Qué tipo tiene esta variable?» Especialmente cuando trabajas con Any, genéricos o herencias complejas. Es como intentar adivinar qué hay dentro de una caja sin abrirla. Pero en Swift existen herramientas potentes que te permiten mirar dentro y determinar con precisión el tipo o clase de una variable.

\n

En este artículo, analizaremos cómo mostrar el tipo de una variable en Swift, utilizando type(of:), Mirror, String(describing:) e incluso el clásico dynamicType (sí, todavía sigue vivo en código heredado). Aprenderás no solo a imprimir el tipo, sino también a usarlo en proyectos reales: para depuración, registro, verificación de tipos en tiempo de ejecución y trabajo con protocolos.

\n

El artículo está escrito para el sitio web educativo pythonlib.ru y está adaptado tanto para desarrolladores principiantes como experimentados. ¡Allá vamos!

\n\n

1. La forma más simple: type(of:)

\n

La forma más popular y correcta de conocer el tipo de una variable en Swift es usar la función global type(of:). Esta devuelve el metatipo (MetaType) del valor pasado.

\n

Ejemplo:

\n
let name = "Ana"\nlet age = 25\nlet price: Double = 99.99\nlet isActive = true\n\nprint(type(of: name))   // String\nprint(type(of: age))    // Int\nprint(type(of: price))  // Double\nprint(type(of: isActive)) // Bool\n
\n

Ten en cuenta: type(of:) funciona con cualquier tipo: estructuras, clases, enumeraciones, closures. Incluso con valores opcionales:

\n
var optionalValue: String? = "Hola"\nprint(type(of: optionalValue)) // Optional<String>\n
\n\n

¿Por qué type(of:) es la mejor opción?

\n
    \n
  • Funciona con tipos de valor (estructuras, enumeraciones) y tipos de referencia (clases).
  • \n
  • Admite protocolos y genéricos.
  • \n
  • No requiere especificar el tipo explícitamente en el código.
  • \n
  • Devuelve el tipo dinámico exacto (tiene en cuenta la herencia).
  • \n
\n\n

2. La forma clásica: String(describing:)

\n

A veces no solo necesitas conocer el tipo, sino convertirlo en una cadena para mostrarlo en un registro o interfaz. String(describing:) se encarga perfectamente de esta tarea:

\n
let value: Any = 42\nprint(String(describing: type(of: value))) // Int\n
\n

Se puede combinar con type(of:) para un registro elegante:

\n
func logType(_ value: Any) {\n    let typeName = String(describing: type(of: value))\n    print("[LOG] Tipo: \\(typeName), valor: \\(value)")\n}\nlogType(3.14)  // [LOG] Tipo: Double, valor: 3.14\n
\n\n

3. Trabajo con clases: dynamicType y Mirror

\n

Antes de Swift 3 se usaba la propiedad dynamicType. Todavía está disponible para compatibilidad inversa, pero oficialmente está obsoleta. Sin embargo, puedes encontrarla en proyectos antiguos:

\n
class Animal {}\nclass Dog: Animal {}\n\nlet pet: Animal = Dog()\nprint(pet.dynamicType) // Dog (sintaxis obsoleta)\n
\n

El reemplazo moderno es type(of:):

\n
print(type(of: pet)) // Dog\n
\n\n

Mirror: mirando más profundo

\n

Si necesitas conocer no solo el tipo, sino también la estructura del objeto (por ejemplo, los nombres de las propiedades), usa Mirror:

\n
struct User {\n    let name: String\n    let age: Int\n}\n\nlet user = User(name: "Iván", age: 30)\nlet mirror = Mirror(reflecting: user)\nprint(mirror.subjectType) // User\nfor child in mirror.children {\n    print("\\(child.label ?? ""): \\(child.value) (\\(type(of: child.value)))")\n}\n// Salida:\n// name: Iván (String)\n// age: 30 (Int)\n
\n

Esto es especialmente útil para depurar jerarquías complejas o al trabajar con reflexión.

\n\n

4. Determinación de clase para Any y AnyObject

\n

En Swift, a menudo nos encontramos con el tipo Any: puede almacenar un valor de cualquier tipo. Para conocer el tipo específico

Blogs

Book Recommendations