how dictionaries create array ios swift swift3

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 .