2014-06-09 13 views
58

Próbuję owijać głowę wokół inicjowania pustych tablic w Swift.Inicjowanie pustych tablic słowników w Swift

Na tablicy ciągów To całkiem proste:

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

-> ["a", "b"] 

i dla liczb całkowitych

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

-> [1, 2] 

to działa również w innych typach obiektów, takich jak obiekty NSImage:

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 ...>] 

Jednak nie mogę opracować składni, aby zainicjować pustą tablicę słowników.

Wiem, że można mieć tablicę słowników ponieważ inicjalizacji z początkową wartością działa:

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

var myDictArray = [myDict1] 
myDictArray += myDict2 

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

EDIT: Wystąpił błąd w następującym kodzie (mieszanie myNewDictArray i myDictArray) i kiedy skorygować to robi” działa tak jak powiedziałem.

jak ma to:

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

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

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

to jednak (co można się spodziewać składnia być) nie powiedzie się:

var myNewDictArray: Dictionary[] = [] 

z błędem Cannot convert the expression's type 'Dictionary[]' to type 'Hashable'

Pytanie brzmi: jaki jest właściwy sposób inicjowania pustej tablicy elementów słownika i dlaczego ta składnia nie działa?

Odpowiedz

158

Trzeba dać typy do słowników:

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

lub

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

Edit: Można również użyć krótszego składnię:

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

lub

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

Powód to nie działa:

var myNewDictArray: Dictionary[] = [] 

jest to, że trzeba dostarczyć rodzajów za klucze i wartości słownika kiedy go zdefiniować.Każda z tych linii stworzy Ci pustą tablicę słowników z kluczami ciąg i wartości ciągów:

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

Tak, to działa. Masz pomysł, dlaczego są na to dwa sposoby? – dwkns

+0

Swift używa * interferencji * typu * w czasie kompilacji, więc podczas deklarowania zmiennej można albo określić typ (jak robi to 'dictArray2'), albo natychmiast przypisać mu coś, co kompilator może wymyślić (jak robi' dictArray3'). Pierwsza linia jest bardziej gadatliwa niż to konieczne, ale kompilatorowi to nie przeszkadza. –

+0

Musiałem zmienić na Swift 2 ** var productImageArray: [Dictionary ] = [] ** – swiftBoy

9

Spowoduje to utworzenie pustego, niezmienny słownika:

let dictionary = [ : ]

A jeśli chcesz zmienny jeden:

var dictionary = [ : ]

Obie te domyślnie słowniki do Dictionary<String?, AnyObject?>.

+0

Twój przykład nie dotyczy niezmienności słowników, ale niezmienności zmiennych. –

0

Nie można już używać konkatenacji elementów.

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

Można to wykorzystać, jeśli u chcą używać Swift 2.3!

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

Proszę dodać wyjaśnienie, co faktycznie kodu. I dlaczego powinien rozwiązać problem op. – jmattheis