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?
źródło
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>[]()
źródło
dictArray2
robi) lub natychmiast przypisać jej coś, co kompilator może wymyślić (podobnie jakdictArray3
robi). Pierwsza linia jest bardziej szczegółowa niż to konieczne, ale kompilatorowi to nie przeszkadza.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
źródło
var yourArrayname = [String]() // String or anyOther according to need
źródło
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)
źródło