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[] = []?

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]]()

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?>.


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>[]()

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


-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)

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.