web-dev-qa-db-fra.com

Initialisation de tableaux vides de dictionnaires dans Swift

J'essaie de comprendre comment initialiser des tableaux vides dans Swift.

Pour un tableau de chaînes, c'est assez simple: 

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

-> ["a", "b"]

et pour les entiers 

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

-> [1, 2]

cela fonctionne aussi pour d'autres types d'objet tels que les objets 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 ...>]

Cependant, je ne peux pas élaborer la syntaxe pour initialiser un tableau vide de dictionnaires. 

Je sais que vous pouvez avoir un tableau de dictionnaires car l'initialisation avec une valeur initiale fonctionne:

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

var myDictArray = [myDict1]
myDictArray += myDict2

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

Cependant, ceci (ce que vous attendez de la syntaxe) échoue:

var myNewDictArray: Dictionary[] = []

avec l'erreur Cannot convert the expression's type 'Dictionary[]' to type 'Hashable' 

La question est donc de savoir quelle est la bonne façon d’initialiser un tableau vide d’articles de dictionnaire et pourquoi cette syntaxe var myNewDictArray: Dictionary[] = [] ne fonctionne-t-elle pas?

65
dwkns

Vous devez donner des types aux dictionnaires:

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

ou

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

Edit : Vous pouvez également utiliser la syntaxe la plus courte:

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

ou

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

Cela créera un dictionnaire vide et immuable:

let dictionary = [ : ]

Et si vous en voulez un mutable:

var dictionary = [ : ]

La valeur par défaut de ces deux dictionnaires est Dictionary<String?, AnyObject?>.

9
Erik

La raison pour laquelle cela ne fonctionne pas:

var myNewDictArray: Dictionary[] = []

c’est que vous devez fournir des types pour les clés et les valeurs d’un dictionnaire lorsque vous le définissez. Chacune de ces lignes vous créera un tableau vide de dictionnaires avec des clés de chaîne et des valeurs de chaîne:

var dictArray1: Dictionary<String, String>[] = Dictionary<String, String>[]()
var dictArray2: Dictionary<String, String>[] = []
var dictArray3 = Dictionary<String, String>[]()
5
Nate Cook
var yourArrayname = [String]() // String or anyOther according to need
0
Prashant chaudhary

Vous ne pouvez plus utiliser la concaténation d'éléments.

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
0
CPD