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?

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]]()

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


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>[]()

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


-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)

1
Dodaj wyjaśnienie, co właściwie robi kod. I dlaczego to powinno rozwiązać problem OP.
jmattheis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.