Ініціалізація порожніх масивів словників у Swift


82

Я намагаюся обернути голову ініціалізацією порожніх масивів у 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"]]

Однак це (яке, як ви очікуєте, синтаксис) не вдається:

var myNewDictArray: Dictionary[] = []

з помилкою Cannot convert the expression's type 'Dictionary[]' to type 'Hashable'

Отже, питання полягає в тому, який правильний спосіб ініціалізувати порожній масив елементів словника, і чому цей синтаксис не var myNewDictArray: Dictionary[] = []працює?

Відповіді:


219

Вам потрібно надати типи словникам:

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

або

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

Редагувати : Ви також можете використовувати коротший синтаксис:

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

або

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

9

Це створить порожній, незмінний словник:

let dictionary = [ : ]

А якщо ви хочете змінити:

var dictionary = [ : ]

Обидва ці словники за замовчуванням Dictionary<String?, AnyObject?>.


Ваш приклад стосується не незмінності словників, а незмінності змінних.
Samy Dindane,

6

Причина цього не працює:

var myNewDictArray: Dictionary[] = []

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

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

1
Так, це працює. Будь-яка ідея, чому існує два способи зробити це?
dwkns

Swift використовує умовивід типу під час компіляції, тому при оголошенні змінної ви можете або вказати тип (наприклад, dictArray2робить), або негайно призначити йому щось, що компілятор може зрозуміти (як dictArray3це робить). Перший рядок є більш багатослівним, ніж потрібно, але компілятор не проти цього.
Nate Cook

мені довелося змінити на Swift 2 var productImageArray: [Словник <Рядок, Рядок>] = []
swiftBoy

0

Ви більше не можете використовувати об’єднання елементів.

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

Ви можете використовувати це, якщо ви хочете використовувати швидкий 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
Будь ласка, додайте пояснення щодо того, що ви кодуєте насправді. І чому це має вирішити проблему ОП.
jmattheis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.