Swift: declara un diccionario vacío

178

Estoy empezando a aprender swiftsiguiendo el iBook- The Swift Programming Languageon Swift proporcionado por Apple. El libro dice que para crear un diccionario vacío, uno debe usar lo [:]mismo que al declarar una matriz como []:

Declaré una matriz vacía de la siguiente manera:

let emptyArr = [] // or String[]()

Pero al declarar un diccionario vacío, me sale un error de sintaxis:

let emptyDict = [:]

¿Cómo declaro un diccionario vacío?

z22
fuente
2
raro, no me
equivoco al
NO DA mina de cualquier error de compilación en tiempo de ejecución incluso de que puedo conseguir un println de las constantes y que acaba de imprimir esto en la consola array :() dictionary :{}declaraciones de impresión let arr = [] let dict = [:] println("array :\(arr)") println("dictionary :\(dict)")
NSUInteger
Mira este enlace
Juan Boero

Respuestas:

310
var emptyDictionary = [String: String]()

­

var populatedDictionary = ["key1": "value1", "key2": "value2"]

Nota : si va a cambiar el contenido del diccionario con el tiempo, declare como una var(variable). Usted puede declarar un diccionario vacío como let(constante), pero no tiene sentido si usted tiene la intención de cambiar su contenido con el tiempo, ya constante no se puede cambiar después de que se haya inicializado.


Vieja respuesta :

Crear un diccionario de tipo vacío <String, String>se vería de la siguiente manera:

var emptyDictionary = Dictionary<String, String>()
damirstuhec
fuente
Gracias amigo, esto funciona. Pero, ¿por qué no puedo declarar el diccionario como constante si puedo declarar una matriz como una constante?
z22
2
¿Seguramente no podrías declarar un diccionario constante y dejarlo vacío? ¿Como nunca podría agregarle valores?
CW0007007
1
Puede declarar una matriz vacía como una constante, pero no tiene sentido. Si lee los documentos, puede ver que una matriz siempre se declara varcomo le sugerí: developer.apple.com/library/prerelease/ios/documentation/Swift/…
damirstuhec
1
@ Damir179 la primera línea está completamente equivocada. No hay información de tipo allí, por lo que debe ser explícito, de lo contrario, producirá una instancia inutilizable de __NSDictionaryI. Intente agregar un elemento a eso emptyDicty fallará en el momento de la compilación.
Gabriele Petronella
1
var emptyDict: NSMutableDictionary = [:]
Jio
39

No se puede usar a [:]menos que la información de tipo esté disponible.

Debe proporcionarlo explícitamente en este caso:

var dict = Dictionary<String, String>()

varsignifica que es mutable, por lo que puede agregarle entradas. Por el contrario, si lo convierte en un letno puede modificarlo más ( letsignifica constante).

Puede usar la [:]notación abreviada si se puede inferir la información de tipo, por ejemplo

var dict = ["key": "value"]

// stuff

dict = [:] // ok, I'm done with it

En el último ejemplo, se sabe que el diccionario tiene un tipo Dictionary<String, String>en la primera línea. Tenga en cuenta que no tuvo que especificarlo explícitamente, pero se infirió.

Gabriele Petronella
fuente
De las muchas opciones disponibles en Swift, mi sintaxis favorita para un simple String / String dict es:var dict: [String: String] = [:]
Dawngerpony
¡Gracias!. Dictionary <String, String> () solucionó mi problema, en realidad tenía un diccionario de Enum a MyClass. ¿Qué quiere decir con "la información de tipo está disponible"?
Eduardo Reis
32

La documentación de Swift recomienda la siguiente forma de inicializar un diccionario vacío:

var emptyDict = [String: String]()

Estaba un poco confundido cuando me encontré con esta pregunta por primera vez porque diferentes respuestas mostraban diferentes formas de inicializar un Diccionario vacío. Resulta que en realidad hay muchas maneras de hacerlo, aunque algunas son un poco redundantes o excesivamente detalladas dada la capacidad de Swift para inferir el tipo.

var emptyDict = [String: String]()
var emptyDict = Dictionary<String, String>()
var emptyDict: [String: String] = [:]
var emptyDict: [String: String] = [String: String]()
var emptyDict: [String: String] = Dictionary<String, String>()
var emptyDict: Dictionary = [String: String]()
var emptyDict: Dictionary = Dictionary<String, String>()
var emptyDict: Dictionary<String, String> = [:]
var emptyDict: Dictionary<String, String> = [String: String]()
var emptyDict: Dictionary<String, String> = Dictionary<String, String>()

Después de tener un diccionario vacío, puede agregar un par clave-valor como este:

emptyDict["some key"] = "some value"

Si desea vaciar su diccionario nuevamente, puede hacer lo siguiente:

emptyDict = [:]

Los tipos siguen siendo así <String, String>porque así se inicializó.

Suragch
fuente
Si quisieras inicializar una matriz de un diccionario vacío, lo harías así: var emptyDictArray = [[String: String]()] var emptyDictArray = [Dictionary<String, String>()]
Don Alejandro
19

Use esto funcionará.

var emptyDict = [String: String]()
Lim Thye Chean
fuente
Prefiero éste. Porque podemos declarar una matriz vacía por var emtpyAry = [String](). Eso tiene sentido.
hbin
16

Simplemente puede declararlo así:

var emptyDict:NSMutableDictionary = [:]
Jio
fuente
6

Tienes que darle un tipo al diccionario

// empty dict with Ints as keys and Strings as values
var namesOfIntegers = Dictionary<Int, String>()

Si el compilador puede inferir el tipo, puede usar la sintaxis más corta

namesOfIntegers[16] = "sixteen"
// namesOfIntegers now contains 1 key-value pair
namesOfIntegers = [:]
// namesOfIntegers is once again an empty dictionary of type Int, String
nevan king
fuente
5

Rápido:

var myDictionary = Dictionary<String, AnyObject>()
Juan boero
fuente
4

Estoy jugando con esto también. Parece extraño que pueda declarar un diccionario vacío y luego agregarle un par clave / valor de la siguiente manera:

var emptyDictionary = Dictionary<String, Float>()
var flexDictionary = [:]
emptyDictionary["brian"] = 4.5
flexDictionary["key"] = "value" // ERROR : cannot assign to the result of this expression

Pero puede crear un Diccionario que acepte diferentes tipos de valores utilizando el tipo "Cualquiera" de esta manera:

var emptyDictionary = Dictionary<String, Any>()
emptyDictionary["brian"] = 4.5
emptyDictionary["mike"] = "hello"
Lee Probert
fuente
4

Debe indicar explícitamente el tipo de datos o el tipo puede inferirse cuando declara algo en Swift.

Swift 3

El siguiente ejemplo declara un diccionario con clave como Inttipo y el valor como Stringtipo.

Método 1: inicializador

let dic = Dictionary<Int, String>()

Método 2: sintaxis abreviada

let dic = [Int:String]()

Método 3: Diccionario literal

var dic = [1: "Sample"]
// dic has NOT to be a constant
dic.removeAll()
Lorem Ipsum Dolor
fuente
4

Swift 4

let dicc = NSDictionary()

//MARK: - This is empty dictionary
let dic = ["":""]

//MARK:- This is variable dic means if you want to put variable 
let dic2 = ["":"", "":"", "":""]

//MARK:- Variable example
let dic3 = ["name":"Shakeel Ahmed", "imageurl":"https://abc?abc.abc/etc", "address":"Rawalpindi Pakistan"]

//MARK: - This is 2nd Variable Example dictionary
let dic4 = ["name": variablename, "city": variablecity, "zip": variablezip]

//MARK:- Dictionary String with Any Object
var dic5a = [String: String]()
//MARK:- Put values in dic
var dic5a = ["key1": "value", "key2":"value2", "key3":"value3"]

var dic5b = [String:AnyObject]()
dic5b = ["name": fullname, "imageurl": imgurl, "language": imgurl] as [String : AnyObject]

or
//MARK:- Dictionary String with Any Object
let dic5 = ["name": fullname, "imageurl": imgurl, "language": imgurl] as [String : AnyObject]

//MARK:- More Easy Way
let dic6a = NSDictionary()
let dic6b = NSMutalbeDictionary()
Shakeel Ahmed
fuente
3

Si quieres crear un diccionario genérico con cualquier tipo

var dictionaryData = [AnyHashable:Any]()
reetu
fuente
Gracias, finalmente porque esto es necesario para agregar un tipo de diccionario más tarde, no solo cadena
Mitchell Currie
3

Usualmente estoy usando

var dictionary:[String:String] = [:]
dictionary.removeAll()
Lind el Loren
fuente
3

Declarando e inicializando diccionarios en Swift

Diccionario de cuerdas

var stringDict: [String: String] = [String: String]()

O

var stringDict: Dictionary<String, String> = Dictionary<String, String>()

Diccionario de Int

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

O

var stringDict: Dictionary<String, Int> = Dictionary<String, Int>()

Diccionario de AnyObject

var stringDict: [String: AnyObject] = [String: AnyObject]()

O

var stringDict: Dictionary<String, AnyObject> = Dictionary<String, AnyObject>()

Diccionario de matriz de cuerdas

var stringDict: [String: [String]] = [String: [String]]()

O

var stringDict: Dictionary<String, Array<String>> = Dictionary<String, Array<String>>()

Matriz de diccionarios de cuerdas

var stringDict: [[String: String]] = [[String: String]]()

O

var stringDict: Array<Dictionary<String, String>> = Array<Dictionary<String, String>>()
Syed Qamar Abbas
fuente
0

Puede declararlo como nulo con lo siguiente:

var assoc : [String:String]

Entonces, lo bueno es que ya ha escrito (note que usé var y no lo dejo, piense en esto como mutable e inmutable). Luego puedes llenarlo más tarde:

assoc = ["key1" : "things", "key2" : "stuff"]
newshorts
fuente
0

Puedes usar el siguiente código:

var d1 = Dictionary<Int, Int>()
var d2 = [Int: Int]()
var d3: Dictionary<Int, Int> = [Int : Int]()
var d4: [Int : Int] = [:]
levan
fuente
-1

var dictList = String: String para diccionario en swift var arrSectionTitle = String para array en swift

Gaurav
fuente
-2

Es muy útil para encontrar el camino.

dict var: Diccionario = [:]

Uttam Kumar
fuente
También debe usar los tipos de clave y valor.
Suragch
-2
var parking = [Dictionary < String, Double >()]

^ esto agrega un diccionario para una entrada [string: double]

comodín
fuente