Avatar ·

¿Cómo determinar el tipo de objeto en Swift? (type(of:) y is/as)

¡Hola a todos! Acabo de empezar a aprender Swift y estoy escribiendo mi primera aplicación. Me encontré con un problema: necesito entender qué tipo de objeto hay en una variable, especialmente cuando uso protocolos o herencia. Aquí hay un ejemplo. Tengo una clase base `Animal` y dos subclases: `Dog` y `Cat`. Creo un array `let animals: [Animal] = [Dog(), Cat(), Dog()]` y quiero en un bucle for-in determinar quién es perro y quién es gato. En otros lenguajes (por ejemplo, en C#) usaba `typeof()` o `is` para verificar. ¿Cómo se hace esto en Swift? Probé escribir `if animal is Dog { ... }`, pero esto solo funciona para verificar, ¿cómo obtengo el nombre del tipo como string? También escuché sobre `type(of:)`, pero no entiendo la diferencia entre `type(of:)` y `is`/`as`. No solo necesito verificar, sino a veces también convertir el objeto a un tipo específico para llamar a su propio método. Por favor, indíquenme cómo trabajar correctamente con tipos en Swift: cómo saber el tipo, cómo verificar la pertenencia a una clase/protocolo y cómo hacer downcasting.