Подтвердить что ты не робот

Инициализация пустых массивов словарей в Swift

Я пытаюсь обернуть голову вокруг инициализации пустых массивов в Swift.

Для массива строк это довольно прямолинейно:

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

-> ["a", "b"]

и для целых чисел

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

-> [1, 2]

он также работает для других типов объектов, таких как объекты 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 ...>]

Однако я не могу разобрать синтаксис для инициализации пустого массива словарей.

Я знаю, что вы можете иметь массив словарей, потому что инициализация с начальным значением работает:

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

var myDictArray = [myDict1]
myDictArray += myDict2

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

EDIT: произошел сбой в следующем коде (смешение myNewDictArray и myDictArray), и при исправлении он не работает, как я уже сказал.

как это делает:

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

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

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

Забастовкa >

Это, однако, (что вы ожидаете от синтаксиса):

var myNewDictArray: Dictionary[] = []

с ошибкой Cannot convert the expression type 'Dictionary[]' to type 'Hashable'

Итак, вопрос в том, что является правильным способом инициализации пустого массива элементов Dictionary и почему этот синтаксис var myNewDictArray: Dictionary[] = [] не работает?

4b9b3361

Ответ 1

Вам нужно указать типы в словарях:

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

или

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

Изменить. Вы также можете использовать более короткий синтаксис:

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

или

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

Ответ 2

Это создаст пустой, неизменный словарь:

let dictionary = [ : ]

И если вы хотите изменить его:

var dictionary = [ : ]

Оба этих словаря по умолчанию равны Dictionary<String?, AnyObject?>.

Ответ 3

Причина, по которой это не работает:

var myNewDictArray: Dictionary[] = []

заключается в том, что вам необходимо указать типы ключей и значений словаря при его определении. Каждая из этих строк создаст вам пустой массив словарей со строковыми и строковыми значениями:

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

Ответ 4

Вы больше не можете использовать конкатенацию элементов.

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

Ответ 5

var yourArrayname = [String]() // String or anyOther according to need

Ответ 6

Вы можете использовать это, если хотите использовать 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)