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

print(values.dynamicType) 

druckt:Warum ist die Eigenschaft "values" in einem Dictionary kein einfaches Array, sondern eher etwas Seltsames?

LazyMapCollection<Dictionary<Int, String>, String> 

Es gibt zwei Dinge, die ich hier nicht verstehen. Wäre es nicht ein bisschen einfacher, wenn values einen Array zurückgibt? Was ist LazyMapCollection? Ich schaute in Apple's reference, aber es bietet buchstäblich keine Informationen (oder nichts, dem ich Sinn machen kann). Sie können über dieses Objekt durchlaufen, weil es CollectionType ist:

for v in values { 
    print(v) 
} 

druckt:

Two 
Three 
One 

Aber aus irgendeinem Grund von Apple nicht genutzt Array Typ.

+0

Leistungsoptimierung, sonst nichts. – Sulthan

+0

Können Sie es ausarbeiten? –

Antwort

4

Eine LazyMapCollection ist eine faule (nur bei Bedarf ausgewertet) Sicht auf eine Sammlung. Mit "Ansicht" meine ich "Fenster", "Rahmen", "virtuelle Teilmenge", diese Art von Konzept.

Um die tatsächlichen Werte von ihm zu erhalten, nur die Array-Initialisierer verwenden:

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

Danke, das sind nützliche Informationen. Aber was ist der Zweck eines solchen "Fensters" (kann man es Wrapper nennen?)? –

+1

Der Zweck besteht darin, eine Teilmenge einer Sammlung bearbeiten zu können, ohne den Array-Inhalt tatsächlich verwenden zu müssen. Die eigentliche Datenmanipulation wird auf den letzten möglichen Moment verschoben (hier, wenn wir die Werte daraus mit dem Array-Initialisierer extrahieren). Das ist Optimierungskriterium: 'dict.values' extrahiert die Werte nicht wirklich, es bereitet sie vor, um später extrahiert zu werden, wenn es nötig ist, sozusagen. – Moritz

3

Sie haben hier eine ernsthafte Geschwindigkeitsoptimierung. Erstellen eines Arrays ist teuer. Stattdessen erhalten Sie eine Instanz einer seltsamen Klasse, die sich wie ein Array verhält. Es hat jedoch nicht seine Daten in einem realen Array gespeichert, stattdessen greifen sie auf die Daten aus einem Wörterbuch zu.

Angenommen, Sie haben ein Wörterbuch mit 10.000 Zeichenfolgenwerten. Sie möchten nicht, dass iOS alle 10.000 Zeichenfolgenwerte beim Aufrufen von dict.values ​​kopiert, oder? Dafür ist diese Klasse da, um das Kopieren von 10.000 Strings zu verhindern. Ein echtes Array würde das Kopieren erzwingen.

Und mit Ihrem Benutzernamen fragen Sie nach solchen Dingen, und Apple bietet viele Beispiele. So machen sie iOS schnell.

+0

Können Sie einen Link zu den Beispielen bereitstellen, über die Sie sprechen? [Wie für meinen Benutzernamen.] (Https://en.wikipedia.org/wiki/Brainfuck) –

2

Beide Arrays und Wörterbücher sind Werttypen (Strukturen). Das bedeutet, sobald Sie ein Array angefordert haben, müssen die Werte kopiert werden. Wenn Dictionary.values ein Array zurückgeben würde, könnte dies eine kostspielige Operation sein - und eine, die normalerweise nicht benötigt wird, weil die meiste Zeit nur über die Werte iteriert werden soll.

So ist die Verwendung eines speziellen (lazy) Sammlungs-Typs im Grunde eine Möglichkeit, das Kopieren zu verhindern, wenn das Kopieren nicht benötigt wird. Wenn Sie eine Kopie möchten, müssen Sie explizit danach fragen.

Verwandte Themen