2014-06-09 13 views
58

Ich versuche, mich mit dem Initialisieren leerer Arrays in Swift zu beschäftigen.Initialisierung von leeren Arrays von Wörterbüchern in Swift

Für eine Reihe von Strings es ziemlich gerade ist nach vorn:

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

-> ["a", "b"] 

und für ganze Zahlen

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

-> [1, 2] 

es auch für andere Arten von Objekten arbeitet auch 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 ...>] 

Allerdings kann ich die Syntax nicht ausarbeiten, um ein leeres Array von Dictionaries zu initialisieren.

Ich weiß, dass Sie eine Reihe von Wörterbücher haben können, weil mit einem Anfangswert initialisiert funktioniert:

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

var myDictArray = [myDict1] 
myDictArray += myDict2 

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

EDIT: Es gab einen Fehler in dem folgenden Code (Misch myNewDictArray und myDictArray), und wenn es doesn korrigiert‘ Ich arbeite wie gesagt.

wie sich dies:

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

var myNewDictArray: AnyObject = [] 
myDictArray += myDict1 
myDictArray += myDict2 

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

Dies ist jedoch (die Sie die Syntax erwarten würden) nicht:

var myNewDictArray: Dictionary[] = [] 

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

Also die Frage ist, was ist der richtige Weg, um ein leeres Array von Dictionary Items zu initialisieren und warum funktioniert diese Syntax var myNewDictArray: Dictionary[] = [] nicht?

Antwort

158

Sie müssen Typen den Wörterbücher 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

5

Der Grund dafür ist nicht funktioniert:

var myNewDictArray: Dictionary[] = [] 

ist, dass Sie Typen für die Schlüssel und Werte eines Wörterbuchs zur Verfügung stellen müssen, wenn Sie es definieren.Jede dieser Zeilen erstellen Ihnen ein leeres Array von Wörterbuch mit String-Schlüsseln und String-Werten:

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, es zu tun? – dwkns

+0

Swift verwendet * Typinferenz * zur Compile-Zeit, so dass, wenn die Deklaration einer Variablen können Sie entweder den Typ angeben (wie 'dictArray2' der Fall ist) oder sie sofort etwas zuweisen, die der Compiler herausfinden können (wie' dictArray3' tut). Die erste Zeile ist ausführlicher als nötig, aber dem Compiler ist das egal. –

+0

ich hatte auf Swift 2 ** var productImageArray zu ändern: [Dictionary ] = [] ** – swiftBoy

9

Dies wird einen leeren, unveränderlich Wörterbuch erstellen:

let dictionary = [ : ]

Und wenn Sie ein veränderbares wollen ein:

var dictionary = [ : ]

diese beiden Standard Wörterbücher Dictionary<String?, AnyObject?>.

+0

Ihr Beispiel nicht über die Unveränderlichkeit der Wörterbücher, aber die Unveränderlichkeit der Variablen. –

0

Sie können die Verkettung von Elementen 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 
0
var yourArrayname = [String]() // String or anyOther according to need 
-1

Sie können dies verwenden, wenn u 2,3 ​​swift 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 Sie tatsächlich tun. Und warum sollte es das Problem von op beheben? – jmattheis

Verwandte Themen