ios - dictionaries - ¿Cuál es la diferencia entre Any, Hashable, AnyHashable en Swift 3?
swift 4 dictionaries (1)
Es más importante entender qué son que cuáles son las diferencias entre ellos.
Any
significa "cualquier cosa", desde enums rápidos, tuplas, cierres, estructuras, clases, protocolos, lo que sea. Todos los tipos se pueden asignar a una variable de tipo Any
.
Hashable
es un protocolo que dice "este objeto puede ser hash, es decir, tiene un hashcode". Si su objeto puede ser hash, implemente este protocolo, porque muchas estructuras de datos (principalmente diccionarios y conjuntos) lo necesitan.
Entonces, ¿qué es AnyHashable
?
Normalmente, si intentas hacer esto:
let a: Set<Hashable>?
no compila Esto se debe a que Hashable
hereda de Equatable
que contiene Self
.
Ahora, supongamos que desea exportar un método de Objective-C a swift. Ese método toma un parámetro de tipo NSSet
. En Swift, esto se convertirá en un Set
, pero ¿cuál es su parámetro genérico? Si ponemos Any
como hacemos con NSArray
s, no funciona porque los objetos de Set
deben ser manejables. Pero si ponemos Set<Hashable>
tampoco funciona porque Hashable
solo puede usarse como restricción genérica. Es por eso que envolvieron Hashable
con un AnyHashable
que no usa Self
y por lo tanto puede usarse como un parámetro genérico.
En relación con lo que "tipo borrado" significa:
Tener Self
en un protocolo es algo así como un protocolo con un parámetro genérico, y el parámetro genérico siempre es la clase conforming. Esto hace que los protocolos no se puedan usar por sí solos, como Set<Hashable>
porque el "parámetro genérico" es desconocido. AnyHashable
soluciona este problema al no usar Self
en absoluto, por lo que ahora se convierte en una estructura normal. "Borra" el tipo de Self
genérico.
Me rasco la cabeza a través de un montón de tutoriales para entender la diferencia entre los 3 términos anteriores y encontrar un nuevo type erased
contenedor type erased
, ahora me resulta confuso. Surgen muchas preguntas.
¿Por qué Swift presenta AnyHashable
?
¿Cuál es la diferencia fundamental entre estos 3 términos?
Diferencia entre Any
y AnyHashable
?
Diferencia entre Hashable
y AnyHashable
?
¿Cuándo usar Hashable
y cuándo AnyHashable
?
Por último, pero más confuso, ¿qué significa el type erased
término type erased
en el contexto de AnyHashable
?
Seguí Swift Evolution Proposal SE-0131 .