Inicialización de matrices vacías de diccionarios en Swift

82

Estoy tratando de entender la inicialización de matrices vacías en Swift.

Para una variedad de cadenas, es bastante sencillo:

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

-> ["a", "b"]

y para enteros

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

-> [1, 2]

también funciona para otros tipos de objetos como los objetos 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 ...>]

Sin embargo, no puedo resolver la sintaxis para inicializar una matriz vacía de diccionarios.

Sé que puede tener una variedad de diccionarios porque la inicialización con un valor inicial funciona:

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

var myDictArray = [myDict1]
myDictArray += myDict2

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

Sin embargo, esto (que esperaría que fuera la sintaxis) falla:

var myNewDictArray: Dictionary[] = []

con el error Cannot convert the expression's type 'Dictionary[]' to type 'Hashable'

Entonces, la pregunta es ¿cuál es la forma correcta de inicializar una matriz vacía de elementos de diccionario y por qué no funciona esta sintaxis var myNewDictArray: Dictionary[] = []?

dwkns
fuente

Respuestas:

219

Necesita dar tipos a los diccionarios:

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

o

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

Editar : también puede usar la sintaxis más corta:

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

o

var myNewDictArray = [[String:Int]]()
dibujar
fuente
9

Esto creará un diccionario vacío e inmutable:

let dictionary = [ : ]

Y si quieres uno mutable:

var dictionary = [ : ]

Ambos diccionarios están predeterminados en Dictionary<String?, AnyObject?>.

Erik
fuente
Su ejemplo no se trata de la inmutabilidad de los diccionarios, sino de la inmutabilidad de las variables.
Samy Dindane
6

La razón por la que esto no funciona:

var myNewDictArray: Dictionary[] = []

es que necesita proporcionar tipos para las claves y valores de un diccionario cuando lo define. Cada una de estas líneas le creará una matriz vacía de diccionarios con claves de cadena y valores de cadena:

var dictArray1: Dictionary<String, String>[] = Dictionary<String, String>[]()
var dictArray2: Dictionary<String, String>[] = []
var dictArray3 = Dictionary<String, String>[]()
Nate Cook
fuente
1
Si, esto funciona. ¿Alguna idea de por qué hay dos formas de hacerlo?
dwkns
Swift usa la inferencia de tipos en tiempo de compilación, por lo que al declarar una variable puede especificar el tipo (como dictArray2hace) o asignarle inmediatamente algo que el compilador pueda averiguar (como dictArray3hace). La primera línea es más detallada de lo necesario, pero al compilador no le importa.
Nate Cook
Tuve que cambiar en Swift 2 var productImageArray: [Dictionary <String, String>] = []
swiftBoy
0

Ya no puede usar la concatenación de elementos.

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
CPD
fuente
0
var yourArrayname = [String]() // String or anyOther according to need
Prashant chaudhary
fuente
-1

¡Puedes usar esto si quieres usar 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)
Alejandro Viquez
fuente
1
Agregue una explicación, lo que realmente hace el código. Y por qué debería solucionar el problema de la operación.
jmattheis