Initialisieren leerer Wörterbuch-Arrays in Swift


80

Ich versuche, mich mit dem Initialisieren leerer Arrays in Swift zu beschäftigen.

Für eine Reihe von Zeichenfolgen ist es ziemlich einfach:

var myStringArray: String[] = []
myStringArray += "a"
myStringArray += "b"

-> ["a", "b"]

und für ganze Zahlen

var myIntArray: Int[] = []
myIntArray += 1
myIntArray += 2

-> [1, 2]

Es funktioniert auch für andere Objekttypen wie NSImage-Objekte:

let path = "/Library/Application Support/Apple/iChat Icons/Flags/"
let image1 = NSImage(byReferencingFile: path + "Brazil.png")
let image2 = NSImage(byReferencingFile: path + "Chile.png")

var myImageArray: NSImage[] = []
myImageArray += image1
myImageArray += image2

-> [<NSImage 0x7fe371c199f0 ...>, <NSImage 0x7fe371f39ea0 ...>]

Ich kann jedoch die Syntax zum Initialisieren eines leeren Arrays von Wörterbüchern nicht ausarbeiten.

Ich weiß, dass Sie eine Reihe von Wörterbüchern haben können, da das Initialisieren mit einem Anfangswert funktioniert:

let myDict1 = ["someKey":"someValue"]
let myDict2 = ["anotherKey":"anotherValue"]

var myDictArray = [myDict1]
myDictArray += myDict2

-> [["someKey": "someValue"], ["anotherKey": "anotherValue"]]

Dies schlägt jedoch fehl (was Sie von der Syntax erwarten würden):

var myNewDictArray: Dictionary[] = []

mit dem Fehler Cannot convert the expression's type 'Dictionary[]' to type 'Hashable'

Die Frage ist also, wie man ein leeres Array von Wörterbuchelementen richtig initialisiert und warum diese Syntax nicht var myNewDictArray: Dictionary[] = []funktioniert.

Antworten:


214

Sie müssen den Wörterbüchern Typen geben:

var myNewDictArray: [Dictionary<String, Int>] = []

oder

var myNewDictArray = [Dictionary<String, Int>]()

Bearbeiten : Sie können auch die kürzere Syntax verwenden:

var myNewDictArray: [[String:Int]] = []

oder

var myNewDictArray = [[String:Int]]()

9

Dadurch wird ein leeres, unveränderliches Wörterbuch erstellt:

let dictionary = [ : ]

Und wenn Sie eine veränderliche wollen:

var dictionary = [ : ]

Beide Wörterbücher sind standardmäßig aktiviert Dictionary<String?, AnyObject?>.


In Ihrem Beispiel geht es nicht um die Unveränderlichkeit der Wörterbücher, sondern um die Unveränderlichkeit der Variablen.
Samy Dindane

6

Der Grund, warum dies nicht funktioniert:

var myNewDictArray: Dictionary[] = []

ist, dass Sie Typen für die Schlüssel und Werte eines Wörterbuchs angeben müssen, wenn Sie es definieren. Jede dieser Zeilen erstellt ein leeres Array von Wörterbüchern mit Zeichenfolgenschlüsseln und Zeichenfolgenwerten:

var dictArray1: Dictionary<String, String>[] = Dictionary<String, String>[]()
var dictArray2: Dictionary<String, String>[] = []
var dictArray3 = Dictionary<String, String>[]()

1
Ja, das funktioniert. Irgendeine Idee, warum es zwei Möglichkeiten gibt, dies zu tun?
Dwkns

Swift verwendet zur Kompilierungszeit die Typinferenz. Wenn Sie also eine Variable deklarieren, können Sie entweder den Typ angeben (wie es dictArray2tut) oder ihm sofort etwas zuweisen, das der Compiler herausfinden kann (wie es dictArray3tut). Die erste Zeile ist ausführlicher als nötig, aber der Compiler hat nichts dagegen.
Nate Cook

Ich musste auf Swift 2 var productImageArray ändern: [Dictionary <String, String>] = []
swiftBoy

0

Sie können die Elementverkettung nicht mehr verwenden.

class Image {}
Image i1
Image i2

var x = [Image]()

x += i1 // will not work (adding an element is ambiguous)
x += [i1] // this will work (concatenate an array to an array with the same elements)

x += [i1, i2] // also good


-1

Sie können dies verwenden, wenn Sie Swift 2.3 verwenden möchten!

let path = "/Library/Application Support/Apple/iChat Icons/Flags/"
let image1 = UIImage(contentsOfFile: readPath + "Brazil.png")
let image2 = UIImage(contentsOfFile: readPath + "Chile.png")

var myImageArray = [UIImage]()
myImageArray.append(image1)
myImageArray.append(image2)

1
Bitte fügen Sie eine Erklärung hinzu, was Ihr Code tatsächlich tut. Und warum sollte es das Problem von op beheben.
Jmattheis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.