2016-10-12 3 views
0

Wie befreie ich die "()" auf dem ersten Wert, damit ich der nächsten Variablen zuweisen kann? DieseSWIFT - Kann keinen Wert des Typs '[(String, [String: Any])]' zu type '[String: [String: Beliebige]]'

ist, wie ich initialisieren meinen Wörterbuch:

var imagedata: [String: [String: Any]] = [:] 

I-Daten in das Wörterbuch zu laden und ich es dann sortieren

imagedata = Array(imagedata).sort({ $0.0 < $1.0 }) 

aber es gibt mir einen Wert vom Typ ‚[(String, [String: Beliebige])] 'anstelle von' [String: [String: Beliebige]] ', damit es nicht zugewiesen werden kann.

+0

Wie ist die Datenstruktur der 'imagedata' Variablen in' Array (imagedata) '? – Enix

+0

Ein Wörterbuch ist per Definition ungeordnet und das Ergebnis Ihrer "gefälschten Sortierung" ist ein Array von Tupeln anstatt eines Wörterbuchs. – vadian

+0

Dies ist imagedata: ["10October201611": ["images": [, {500, 500}, , {1024, 768}], "Anzahl": 2, "Datum" : "Montag: 10-Oktober-2016-11: 14: 48" ", ..." 10Oktober201608 ": [" images ": [, {1024, 768}, , { 1024, 768}], "count": 2, "date": "Montag: 10-Oktober-2016-08: 18: 52PM"]] – ConfusedLuigi

Antwort

0

Sie sortieren, aber das Ergebnis zurück zu imagedata wie diese nicht speichern kann, weil Array(imagedata).sort({ $0.0 < $1.0 }) ein (sortiert) array erzeugt, während imagedata den Typ eines dictionary hat.

Diese Sie einen Kompilierungsfehler geben: imagedata = Array(imagedata).sort({ $0.0 < $1.0 })

Während dies nicht Array(imagedata).sort({ $0.0 < $1.0 })

Dies sagt uns, dass das Problem nicht die Sortiermethode ist, aber die Variable, die wir das Ergebnis speichern verwenden .

Wörterbücher haben ihre eigene sort Methode, die Sie verwenden können. Aber versuchen, einen array (der Wert, der von einer beliebigen sort-Methode zurückgegeben wird) zu dictionary() zuzuweisen, wird immer fehlschlagen.

EDIT:

Hier ist ein Beispiel dafür, wie Sie die sort Methode auf Ihrem Wörterbuch benutzen konnte und mit dem Rückgabewert arbeiten:

var imagedata: [String: [String: Any]] = [:] 
imagedata["a"] = ["Hello": 2] 
imagedata["b"] = ["World": UIImage()] 
imagedata["c"] = ["Foo": "Bar"] 
imagedata["d"] = ["LifeQuest": 42] 

print(imagedata) 
// prints the content of the dictionary. Dictionaries are un-ordered, so you may always get different results here 
// ["b": ["World": <UIImage: 0x60000009ea00>, {0, 0}], "a": ["Hello": 2], "d": ["LifeQuest": 42], "c": ["Foo": "Bar"]] 

let orderedKeysAndValues = imagedata.sort({ $0.0 < $1.0 }) 
for (key, value) in orderedKeysAndValues { 
    print("key: \(key)") 
    print("value: \(value)") 
} 

// the content of the loop will print 
// key: a 
// value: ["Hello": 2] 
// key: b 
// value: ["World": <UIImage: 0x60000009ba80>, {0, 0}] 
// key: c 
// value: ["Foo": "Bar"] 
// key: d 
// value: ["LifeQuest": 42] 
+0

* Wörterbücher haben ihre eigene Sortiermethode *. Nein, haben sie nicht. Streng gesprochene Wörterbücher können überhaupt nicht sortiert werden, da es sich bei einem Wörterbuch um einen ** ungeordneten ** Sammlertyp handelt. – vadian

+0

@vadian Ja, sie haben [Link] (https://developer.apple.com/Referenz/swift/Wörterbuch/2298238-sortiert). Obwohl der Rückgabetyp kein "Wörterbuch" ist, können Sie 'sort' in Wörterbüchern aufrufen. – ezcoding

+0

Der Rückgabetyp Ihrer verknüpften Methode ist * Ein sortiertes Array *, kein Wörterbuch. Deshalb habe ich ** streng gesprochen ** geschrieben. – vadian

1

var imagedata: [String: [String: Any]] = [:] // imagedata ist ein Wörterbuch.

imagedata = Array(imagedata).sort({ $0.0 < $1.0 }) Hier haben Sie imagedata zu Array hinzugefügt und sortiert. Weil wir das Wörterbuch nicht sortieren können. Das Ergebnis von sort({ $0.0 < $1.0 }) wird Array mit ursprünglichen Array-Objekttypen sein. So gibt es [(String, [String : Any])] zurück. Also können wir der imagedata Variable nicht zuweisen.

Eigentlich Array(imagedata).sort({ $0.0 < $1.0 }) tut nichts. Weil das Array nur ein Objekt hat. So kommt es zur selben Sache zurück.

Verwandte Themen