En esta página:
- Partes
- Tipos de Datos Definidos en Swift – Parte 2 (Final)
- Tipo opcional implícitamente desenvuelto (Implicitly Unwrapped Optional Type)
- Tipo Composición de Protocolo (Protocol Composition Type)
- Tipo Opaco (Opaque Type)
- Tipo Protocolo en Caja (Boxed Protocol Type)
- Tipo Metatipo (Metatype Type)
- Cualquier Tipo (Any Type)
- Autotipo (Self Type)
- Tipo Cláusula de Herencia (Type Inheritance Clause)
- Tipo Inferencia (Type Inference)
- Conclusión
- Nota (s)
Cuando estés aprendiendo o estudiando un lenguaje de programación, primero siempre conoce los tipos de datos que tiene, ya que muchas veces los proyectos, suelen presentar ciertos errores cuando este ha sido terminado. Una de las características de una aplicación para los dispositivos Apple (iPhone, iPad, iMac, etc.) es que no suele colgarse mucho cuando los usuarios la están usando y la tuya no debe ser la excepción. En esta segunda y última parte terminaremos de ver los Tipos de Datos Definidos en Swift, vamos con ello.
Partes
- Parte 1
- Parte 2 (Final)
Tipos de Datos Definidos en Swift – Parte 2 (Final)
Continuemos viendo los tipos de datos definidos que tiene el lenguaje de programación Swift:
Tipo opcional implícitamente desenvuelto (Implicitly Unwrapped Optional Type)
Este tipo de dato te permite realizar condicionalmente una operación en una expresión opcional desenvuelta implícitamente. Si el valor es nil, no se realiza ninguna operación y, por lo tanto, no se produce ningún error de tiempo de ejecución:
1 2 3 4 |
var implicitlyUnwrappedString: String! var explicitlyUnwrappedString: Optional<String> |
Tipo Composición de Protocolo (Protocol Composition Type)
Este tipo define un tipo que se ajusta a cada protocolo en una lista de protocolos especificados, o un tipo que es una subclase de una clase determinada y se ajusta a cada protocolo en una lista de protocolos especificados.
Cuando un tipo de composición de protocolo contiene alias de tipo, es posible que el mismo protocolo aparezca más de una vez en las definiciones; los duplicados se ignoran. Por ejemplo, la definición de PQR en el código siguiente es equivalente a P & Q & R:
1 2 3 4 |
typealias PQ = P & Q typealias PQR = PQ & Q & R |
Tipo Opaco (Opaque Type)
Este tipo define un tipo que se ajusta a un protocolo o composición de protocolo, sin especificar el tipo concreto subyacente.
Los tipos opacos aparecen como el tipo de retorno de una función o subíndice, o el tipo de una propiedad. Los tipos opacos no pueden aparecer como parte de un tipo tupla o un tipo genérico, como el tipo de elemento de una matriz o el tipo ajustado de un opcional:
1 2 3 4 5 |
func jugoFavorito() -> some Jugo { return jugoNaranja(id: "algunId") } |
Un tipo opaco se define con la palabra clave some, como puedes en el código anterior.
Tipo Protocolo en Caja (Boxed Protocol Type)
Este tipo define un tipo que se ajusta a un protocolo o composición de protocolo, con la capacidad de que ese tipo varíe mientras se ejecuta el programa.
Para crear un tipo de protocolo en caja, escribe any antes del nombre de un protocolo:
1 2 3 4 5 6 7 8 |
struct VerticalShapes: Shape { var shapes: [any Shape] func dibujar() -> String { return shapes.map { $0.dibujar() }.joined(separador: "\n\n") } } |
Tipo Metatipo (Metatype Type)
Este tipo se refiere al tipo de cualquier tipo, incluidos tipos de clase, tipos de estructura, tipos de enumeración y tipos de protocolo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
class UnaClaseBase { class func imprimirNombreClase() { print("UnaClaseBase") } } class AlgunaSubclase: UnaClaseBase { override class func imprimirNombreClase() { print(" AlgunaSubclase") } } let unaInstancia: UnaClaseBase = AlgunaSubclase() type(of: unaInstancia).imprimirNombreClase() // Imprimimos "UnaClaseBase" |
Cualquier Tipo (Any Type)
Este tipo puede contener valores de todos los demás tipos y se puede utilizar como tipo concreto para una instancia de cualquiera de los siguientes tipos:
- Una clase, estructura o enumeración.
- Un metatipo, como Int.self
- Una tupla con cualquier tipo de componentes.
- Un tipo de cierre o función
1 2 3 |
let mixto: [Any] = ["uno", 2, true, (4, 5.3), { () -> Int in return 6 }] |
Autotipo (Self Type)
Este tipo no es un tipo específico, sino que te permite consultar cómodamente el tipo actual sin repetir ni conocer el nombre de ese tipo.
El siguiente código muestra un método de instancia f cuyo tipo de retorno es Self:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Superclase { func f() -> Self { return self } } let x = Superclase() print(type(of: x.f())) // Imprimimos "Superclase" class Subclase: Superclase { } let y = Subclase() print(type(of: y.f())) // Imprimimos "Subclase" let z: Superclase = Subclase() print(type(of: z.f())) // Imprimimos "Subclase" |
Tipo Cláusula de Herencia (Type Inheritance Clause)
Este tipo se utiliza para especificar de qué clase hereda un tipo con nombre y a qué protocolos se ajusta un tipo con nombre. Una cláusula de herencia de tipo comienza con dos puntos “:”, seguidos de una lista de identificadores de tipo.
1 2 3 4 5 6 7 8 9 |
class Bicicleta Vehiculo { var esElectrica = false } // let bicicleta = Bicicleta() bicicleta.esElectrica = true |
En el código anterior de forma predeterminada, cualquier instancia nueva a Bicicleta se cree que no tendrá una cesta. Puedes establecer la propiedad esElectrica en true para una particular instancia Bicicleta, después que la instancia es creada.
Tipo Inferencia (Type Inference)
Swift utiliza ampliamente la inferencia de tipos, lo que le permite omitir el tipo o parte del tipo de muchas variables y expresiones en tu código. Por ejemplo, en lugar de escribir var x: Int = 0, puede escribir var x = 0, omitiendo el tipo por completo; el compilador infiere correctamente que x nombra un valor de tipo Int.
También puede darse desde un tipo Double a un Float:
1 2 3 4 |
let e = 2.71828 // El tipo de e infiere que es un Double let eFloat: Float = 2.71828 // El tipo de eFloat es Float |
Si deseas conocer más de este tipo de datos nativos de Swift, puedes leer la documentación oficial de Swift.
Conclusión
En este post has conocido los Tipos de Datos Definidos en Swift, conocerlos es hacer una inmersión profunda a Swift. En otro post veremos los tipos de datos para declarar variables como strings, int, etc. Muchas clases de los SDKs de Apple traen los tipos de datos que hemos compartido en este post que consta de dos partes.
Nota (s)
- No olvides que debemos usar la Tecnología para hacer cosas Buenas por el Mundo.
Síguenos en nuestras Redes Sociales para que no te pierdas nuestros próximos contenidos.