¿Por qué la propiedad "valores" en un dictionary no es una matriz simple, sino que es algo raro?

let dict = [1:"One", 2:"Two", 3:"Three"] let values = dict.values print(values.dynamicType) 

huellas dactilares:

 LazyMapCollection<Dictionary<Int, String>, String> 

Hay dos cosas que no entiendo aquí. ¿No sería un poco más simple si los values devolvieran una Array ? Además, ¿qué es LazyMapCollection ? Analicé la reference de Apple, pero literalmente no proporciona información (ni nada de lo que pueda entender). Puede iterar sobre este object, porque es CollectionType :

 for v in values { print(v) } 

huellas dactilares:

 Two Three One 

Pero, por alguna razón, Apple no utilizó el tipo de Array .

A LazyMapCollection es una vista perezosa (solo evaluada si es necesario) en una colección. Por "vista" me refiero a "window", "marco", "subset virtual", este tipo de concepto.

Para get los valores reales, simplemente use el inicializador Array:

 let values = dict.values let result = Array(values) 

Aquí tienes una optimization de velocidad seria. Crear una matriz es costoso . En cambio, obtienes una instancia de una class extraña que se comporta de todos modos como una matriz. Sin embargo, no tiene sus datos almacenados en una matriz real, sino que accede a los datos de un dictionary.

Digamos que tiene un dictionary con 10 000 valores de cadena. No desea que iOS copie todos los 10 000 valores de cadena cuando llame a dict.values, ¿verdad? Para eso está esta class, para evitar copyr 10,000 cadenas. Una matriz real obligaría a copyr.

Y de todos modos, con tu nombre de usuario estás pidiendo cosas como esta, y Apple ofrece muchos ejemplos. Así es como hacen que iOS sea rápido.

Tanto las matrices como los dictionarys son types de valor (estructuras). Eso significa que una vez que solicita una matriz, los valores deben copyrse. Si Dictionary.values devolviera una matriz, esta podría ser una operación costosa de performance, y una que normalmente no es necesaria porque la mayoría de las veces solo desea iterar sobre los valores.

Entonces, usar un tipo de colección especial (perezoso) es básicamente una forma de evitar la copy cuando no se necesita copyr. Si desea una copy, tiene que pedirla explícitamente.