2015-11-20 6 views
5
let dict = [1:"One", 2:"Two", 3:"Three"] 
let values = dict.values 

print(values.dynamicType) 

stampe:Perché la proprietà "values" in un dizionario non è una matrice semplice, ma invece è qualcosa di strano?

LazyMapCollection<Dictionary<Int, String>, String> 

Ci sono due cose che non capisco qui. Non sarebbe un po 'più semplice se values restituisse un Array? Inoltre, che cos'è LazyMapCollection? Ho esaminato Apple's reference ma non fornisce letteralmente alcuna informazione (o nulla di cui sia in grado di dare un senso). È possibile eseguire iterazioni su questo oggetto, perché è CollectionType:

for v in values { 
    print(v) 
} 

stampe:

Two 
Three 
One 

Ma per qualche motivo Apple non ha utilizzato Array tipo.

+0

Ottimizzazione delle prestazioni, nient'altro. – Sulthan

+0

Puoi elaborare? –

risposta

4

A LazyMapCollection è una vista pigra (valutata solo se necessario) su una raccolta. Per "vista" intendo "finestra", "cornice", "sottoinsieme virtuale", questo tipo di concetto.

Per ottenere i valori reali, basta utilizzare l'Array inizializzatore:

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

Grazie, questa è un'informazione utile. Ma ancora, qual è lo scopo di avere una tale "finestra" (possiamo chiamarla wrapper?)? –

+1

Lo scopo è di essere in grado di manipolare un sottoinsieme di una collezione senza dover effettivamente usare il contenuto dell'array. La manipolazione dei dati effettiva viene rimandata all'ultimo momento possibile (qui, quando estraiamo i valori da essa con l'inizializzatore Array). Questa è roba di ottimizzazione: 'dict.values' in realtà non estrae i valori, li prepara per essere estratti in seguito, se necessario, per così dire. – Moritz

3

Avete qui un'ottimizzazione della velocità seria. La creazione di un array è costosa. Invece si ottiene un'istanza di qualche classe strana che si comporta in ogni modo come una matrice. Tuttavia, non ha i suoi dati memorizzati in un vero array, ma accede ai dati da un dizionario.

Supponiamo di avere un dizionario con 10.000 valori di stringa. Non vuoi che iOS copi tutti i 10.000 valori di stringa quando chiami dict.values, vero? Ecco a cosa serve questa classe, per evitare di copiare 10.000 stringhe. Un vero array forzerebbe la copia.

E comunque, con il tuo nome utente stai chiedendo cose come questa, e Apple fornisce molti esempi. Ecco come rendono iOS veloce.

+0

Puoi fornire un collegamento agli esempi di cui stai parlando? [Come per il mio nome utente.] (Https://en.wikipedia.org/wiki/Brainfuck) –

2

Sia gli array che i dizionari sono tipi di valori (structs). Ciò significa che una volta richiesta una matrice, i valori devono essere copiati. Se restituisse un array, questa potrebbe essere un'operazione costosa per le prestazioni e di solito non è necessaria poiché la maggior parte delle volte si desidera solo iterare sui valori.

Quindi, per utilizzare un tipo di raccolta speciale (pigro) è fondamentalmente un modo per impedire la copia quando la copia non è necessaria. Se vuoi una copia, devi chiederla esplicitamente.

Problemi correlati