Inicjalizacja pustych tablic słowników w języku Swift

82

Próbuję owinąć głowę inicjalizacją pustych tablic w języku Swift.

W przypadku tablicy ciągów jest 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]

działa również dla innych typów 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żesz mieć tablicę słowników, ponieważ inicjalizacja z wartością początkową działa:

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

var myDictArray = [myDict1]
myDictArray += myDict2

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

To jednak (czego można się spodziewać po składni) zawodzi:

var myNewDictArray: Dictionary[] = []

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

Zatem pytanie brzmi, jaki jest prawidłowy sposób inicjalizacji pustej tablicy elementów słownika i dlaczego ta składnia nie var myNewDictArray: Dictionary[] = []działa?

dwkns
źródło

Odpowiedzi:

219

Musisz nadać typy słownikom:

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

lub

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

Edycja : możesz także użyć krótszej składni:

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

lub

var myNewDictArray = [[String:Int]]()
drewag
źródło
9

Spowoduje to utworzenie pustego, niezmiennego słownika:

let dictionary = [ : ]

A jeśli chcesz zmienną:

var dictionary = [ : ]

Oba te słowniki mają domyślnie Dictionary<String?, AnyObject?>.

Erik
źródło
Twój przykład nie dotyczy niezmienności słowników, ale niezmienności zmiennych.
Samy Dindane
6

Powód, dla którego to nie działa:

var myNewDictArray: Dictionary[] = []

polega na tym, że podczas definiowania musisz podać typy kluczy i wartości słownika. Każda z tych linii utworzy pustą tablicę słowników z kluczami łańcuchowymi i wartościami ciągów:

var dictArray1: Dictionary<String, String>[] = Dictionary<String, String>[]()
var dictArray2: Dictionary<String, String>[] = []
var dictArray3 = Dictionary<String, String>[]()
Nate Cook
źródło
1
Tak, to działa. Masz pojęcie, dlaczego można to zrobić na dwa sposoby?
dwkns
Swift używa wnioskowania o typie w czasie kompilacji, więc podczas deklarowania zmiennej można określić typ (tak jak dictArray2robi) lub natychmiast przypisać jej coś, co kompilator może wymyślić (podobnie jak dictArray3robi). Pierwsza linia jest bardziej szczegółowa niż to konieczne, ale kompilatorowi to nie przeszkadza.
Nate Cook
musiałem zmienić w Swift 2 var productImageArray: [Dictionary <String, String>] = []
swiftBoy
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
CPD
źródło
0
var yourArrayname = [String]() // String or anyOther according to need
Prashant Chaudhary
źródło
-1

Możesz tego użyć, jeśli chcesz 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)
Alejandro Viquez
źródło
1
Dodaj wyjaśnienie, co właściwie robi kod. I dlaczego to powinno rozwiązać problem OP.
jmattheis