Blog de Desarrollo en Swift para Plataformas Apple y Linux

Swift – Restricción por Tipo

Get real time updates directly on you device, subscribe now.

La restricción por tipo será el tema que abordaremos en el Tutorial Swift de esta semana, un tema que no hemos tocado directamente pero que está muy relacionado con la programación genérica.

[ads1]

Recordemos que uno de los hechos más importantes que debemos tener en mente cuando estamos escribiendo código genérico es que por defecto no sabemos nada acerca del tipo de dato que será usado por nuestra función, método o tipo de dato propio.

Hasta ahora hemos creado Pilas que manejan tipos de datos como Int y String pero también pudiéramos haberlas creado de cualquier otro tipo. El impacto práctico de no conocer el tipo de dato final es que podemos hacer bien poco con el comodín que estemos usando, ya que como es lógico ciertas operaciones son válidas para un tipo de terminado de datos y para otros no, por ejemplo no podemos comprobar que dos comodines del mismo tipo son iguales, el siguiente código generaría un error:

func checkIfEqual<T>(first: T, _ second: T) -> Bool {
    
    return first == second
    
} // checkIfEqual

…el código de error sería:

Playground execution failed: TypeConstraints.playground:1:18: error: binary operator '==' cannot be applied to two 'T' operands

El problema reside en que si esta función compilase podría trabajar con cualquier tipo de dato incluyendo aquellos a los que no tendría sentido que comparásemos como los closures o los tipos definidos por nosotros y que quizás no adoptan el protocolo Equatable.

Dicho esto creo que se entiende perfectamente porque es un comportamiento peligroso y que el compilador evita, recordemos que el lenguaje de programación Swift está enfocado en la seguridad y en los casos de los posibles errores que acabo de comentar el anterior código generaría un error en tiempo de ejecución, algo así jamás compilaría.

[ads2]

Para solucionar esto, Swift permite el uso de la restricción de tipo que no es más que establecer ciertas características que tiene que cumplir el tipo de dato que pasemos a nuestra función genérica. Hay dos  restricciones de tipo: una donde se establece que el tipo de dato sea una subclase de una clase específica y el segundo donde este tipo tiene que adoptar un protocolo en particular.

Un ejemplo de esto último sería el protocolo Equatable del que hablamos hace poco, con este estaríamos restringiendo el uso de tipos de datos que puedan ser comparados y así evitar los errores antes comentados, veamos:

func checkIfEqual<T: Equatable>(first: T, _ second: T) -> Bool {
    
    return first == second
    
} // checkIfEqual

…con esta pequeña modificación ya nuestro código compila.

Algo similar pudiéramos hacer para comparar la descripción de dos tipos de datos:

func checkIfDescriptionsMatch<T: CustomStringConvertible, U: CustomStringConvertible>(first: T, _ second: U) -> Bool {
    
    return first.description == second.description
    
} // checkIfEqual

…aquí vemos una versión del ejemplo anterior, ahora trabaja con dos tipos de datos distintos y para ser aceptados por la función genérica cada uno de estos tiene que adoptar el protocolo CustomStringConvertible.

[ads3]

Este protocolo obliga a los tipos de datos a implementar una representación textual del valor que almacena, representación textual que es la que se usa cuando intentamos escribir el valor de la variable o constante hacia un flujo de salida, como cuando usamos print.

Veamos un ejemplo de uso:

func checkIfDescriptionsMatch<T: CustomStringConvertible, U: CustomStringConvertible>(first: T, _ second: U) -> Bool {
    
    return first.description == second.description
    
} // checkIfEqual

print(checkIfDescriptionsMatch(Int(1), UInt(1)))
print(checkIfDescriptionsMatch(1, 1.0))
print(checkIfDescriptionsMatch(Float(1.0), Double(1.0)))
print(checkIfDescriptionsMatch(5, "5"))

…la salida en pantalla:

true
false
true
true

Bueno amigos creo que con lo ya comentado y los ejemplos que hemos visto se entiende perfectamente la función y utilidad de una restricción por tipo.

Falta aún mucho por aprender en nuestro camino a convertirnos en iOS Developer. Suscríbete a nuestra lista de correo mediante el formulario en el panel derecho y síguenos en nuestras redes sociales. Mantente así al tanto de todas nuestras publicaciones futuras.

Espero que todo cuanto se ha dicho aquí, de una forma u otra le haya servido de aprendizaje, de referencia, que haya valido su preciado tiempo.

Este artículo, al igual que el resto, será revisado con cierta frecuencia en pos de mantener un contenido de calidad y actualizado.

Cualquier sugerencia, ya sea errores a corregir, información o ejemplos a añadir será, más que bienvenida, necesaria!

Get real time updates directly on you device, subscribe now.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More

RECIBE CONTENIDO SIMILAR EN TU CORREO

RECIBE CONTENIDO SIMILAR EN TU CORREO

Suscríbete a nuestra lista de correo y mantente actualizado con las nuevas publicaciones.

Se ha suscrito correctamente!