¿Cómo agregar elementos a un diccionario en Swift?

217

Tengo un diccionario simple que se define como:

var dict : NSDictionary = [ 1 : "abc", 2 : "cde"]

Ahora quiero agregar un elemento a este diccionario: 3 : "efg"

¿Cómo puedo agregar 3 : "efg"a este diccionario existente?

Dharmesh Kheni
fuente
use NSMutableDictionary
Saurabh Prajapati
1
¿Estás seguro de que quieres un diccionario y no una matriz, ya que tus claves parecen ser los números 1, 2 y 3?
gnasher729

Respuestas:

240

Usted está utilizando NSDictionary. A menos que explícitamente necesite que sea de ese tipo por alguna razón, le recomiendo usar un diccionario Swift.

Puede pasar un diccionario Swift a cualquier función que espera NSDictionarysin ningún trabajo adicional, porque Dictionary<>y NSDictionarysin problemas tender un puente entre sí. La ventaja de la forma nativa de Swift es que el diccionario usa tipos genéricos, por lo que si lo define con Intla clave y Stringel valor, no puede usar claves y valores por error. (El compilador verifica los tipos en su nombre).

Según lo que veo en su código, su diccionario lo utiliza Intcomo clave y Stringcomo valor. Para crear una instancia y agregar un elemento más adelante, puede usar este código:

var dict = [1: "abc", 2: "cde"] // dict is of type Dictionary<Int, String>
dict[3] = "efg"

Si más tarde necesita asignarlo a una variable de NSDictionarytipo, simplemente realice una conversión explícita:

let nsDict = dict as! NSDictionary

Y, como se mencionó anteriormente, si desea pasarlo a una función que espera NSDictionary, páselo como está sin ningún tipo de conversión o conversión.

Antonio
fuente
Gracias por una explicación adecuada de lo que una persona realmente debería hacer. Utilizando la conveniencia de Swift para crear y manipular un Dictionaryobjeto y luego convertirlo al NSDictionaryfinal si es necesario. Maravilloso. Gracias.
Joshua Pinter
¿Hay alguna forma de que pueda agregar a la misma clave usando un delimitador (similar a addValue )? Me refiero a agregar una "Antonio"tecla a 1para dic[1]que regrese "abc, Antonio".
Miel
@honey no es que yo sepa ... pero es un simple agregado si el elemento ya existe
Antonio
113

puede agregar usando la siguiente manera y cambiar DictionaryaNSMutableDictionary

dict["key"] = "value"
yashwanth77
fuente
2
Recibí un error que diceCannot assign to the result of this expression
Dharmesh Kheni
agregue de esta manera su pregunta dict [3] = "efg";
yashwanth77
compruebe que mi respuesta editada funciona para mí. ¡cambie el diccionario a Mutable, funciona!
yashwanth77
1
dict["testval"] = "test".. Errorfatal error: unexpectedly found nil while unwrapping an Optional value
jose920405
2
No funcionará con 2.2+, dict es de solo lectura en esa expresión
desarrollador
67

Sé que esto podría llegar muy tarde, pero puede resultar útil para alguien. Entonces, para agregar pares de valores clave a los diccionarios en swift, puede usar el método updateValue (value:, forKey:) de la siguiente manera:

var dict = [ 1 : "abc", 2 : "cde"]
dict.updateValue("efg", forKey: 3)
print(dict)
HeadOnn
fuente
49

SWIFT 3 - XCODE 8.1

var dictionary =  [Int:String]() 

dictionary.updateValue(value: "Hola", forKey: 1)
dictionary.updateValue(value: "Hello", forKey: 2)
dictionary.updateValue(value: "Aloha", forKey: 3)

Entonces, tu diccionario contiene:

diccionario [1: Hola, 2: Hola, 3: Aloha]

Cristian Mora
fuente
3
¿Cómo es esto mejor que dictionary[1] = "Hola"?
Ben Leggiero
Es simplemente otra forma de hacerlo. ¡Todo depende de lo que necesites hacer! En mi caso, esta es la mejor manera
Cristian Mora
44
Entiendo que piensas que esto es mejor; por eso lo publicaste. Pero no veo cómo esto es mejor. Por favor, dime cómo es esto mejor
Ben Leggiero
Estoy de acuerdo en que debería haber un método llamado "addValue" o "setValue", que "updateValue" debería usarse para ACTUALIZAR como su nombre lo dice
pkarc
La razón es que cuando el diccionario era init be tiene un valor [] que es diferente de nil, por lo que es necesario usar la propiedad updateValue porque estamos intentando cambiar el valor y no insertarlo.
Cristian Mora
16

Si su diccionario es Intpara Stringusted, puede hacer simplemente:

dict[3] = "efg"

Si te refieres a agregar elementos al valor del diccionario, una posible solución:

var dict = Dictionary<String, Array<Int>>()

dict["key"]! += [1]
dict["key"]!.append(1)
dict["key"]?.append(1)
Alex Gidan
fuente
16

Swift 3+

Ejemplo para asignar nuevos valores al Diccionario. Debe declararlo como NSMutableDictionary:

var myDictionary: NSMutableDictionary = [:]
let newValue = 1
myDictionary["newKey"] = newValue
print(myDictionary)
Dasoga
fuente
12

En Swift, si está usando NSDictionary , puede usar setValue:

dict.setValue("value", forKey: "key")
lojals
fuente
1
editó su respuesta, en el futuro considere agregar más información para evitar votos negativos.
Juan Boero
11

Dados dos diccionarios como a continuación:

var dic1 = ["a": 1, "c": 2]
var dic2 = ["e": 3, "f": 4]

Así es como puede agregar todos los elementos de dic2 a dic1 :

dic2.map {
   dic1[$0.0] = $0.1
}

Saludos A.

Amin Tavassolian
fuente
99
Es mejor usar en .forEachlugar de .mapya que no necesitamos ningún arreglo mapeado de retorno
haik.ampardjian
9

Dict.updateValue actualiza el valor de la clave existente del diccionario o agrega un nuevo par clave-valor nuevo si la clave no existe.

Ejemplo-

var caseStatusParams: [String: AnyObject] = ["userId" : UserDefault.userID ]
caseStatusParams.updateValue("Hello" as AnyObject, forKey: "otherNotes")

Resultado-

: 2 elements
    - key : "userId"
    - value : 866: 2 elements
    - key : "otherNotes"
    - value : "Hello"
Varsha Gaikwad
fuente
7

Para los becarios que usan en [String:Any]lugar de a Dictionarycontinuación es la extensión

extension Dictionary where Key == String, Value == Any {

    mutating func append(anotherDict:[String:Any]) {
        for (key, value) in anotherDict {
            self.updateValue(value, forKey: key)
        }
    }
}
Dhaval H. Nena
fuente
4

A partir de Swift 5, funciona la siguiente colección de códigos.

 // main dict to start with
 var myDict : Dictionary = [ 1 : "abc", 2 : "cde"]

 // dict(s) to be added to main dict
 let myDictToMergeWith : Dictionary = [ 5 : "l m n"]
 let myDictUpdated : Dictionary = [ 5 : "lmn"]
 let myDictToBeMapped : Dictionary = [ 6 : "opq"]

 myDict[3]="fgh"
 myDict.updateValue("ijk", forKey: 4)

 myDict.merge(myDictToMergeWith){(current, _) in current}
 print(myDict)

 myDict.merge(myDictUpdated){(_, new) in new}
 print(myDict)

 myDictToBeMapped.map {
     myDict[$0.0] = $0.1
 }
 print(myDict)
Lord Anubis
fuente
4

No hay función para agregar los datos en el diccionario. Simplemente asigna el valor a la nueva clave en el diccionario existente. automáticamente agregará valor al diccionario.

var param  = ["Name":"Aloha","user" : "Aloha 2"]
param["questions"] = "Are you mine?"
print(param)

La salida será como

["Nombre": "Aloha", "usuario": "Aloha 2", "preguntas": "" ¿Eres mío "?"]

Talha Rasool
fuente
3
For whoever reading this for swift 5.1+

  // 1. Using updateValue to update the given key or add new if doesn't exist


    var dictionary = [Int:String]()    
    dictionary.updateValue("egf", forKey: 3)



 // 2. Using a dictionary[key]

    var dictionary = [Int:String]()    
    dictionary[key] = "value"



 // 3. Using subscript and mutating append for the value

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

    dictionary[key, default: ["val"]].append("value")
Lalit Yadav
fuente
2
var dict = ["name": "Samira", "surname": "Sami"]
// Add a new enter code herekey with a value
dict["email"] = "[email protected]"
print(dict)
Reina Semiramis
fuente
1
Proporcione información sobre por qué esta respuesta resuelve el problema
Stephen Reindl
@StephenReindl Si lo ejecutas, verás;)
Ben Leggiero
1

Para agregar nuevos elementos simplemente configure:

listParrameters["your parrameter"] = value
Tung Tran
fuente
0

Hasta ahora, la mejor manera que he encontrado para agregar datos a un diccionario mediante el uso de una de las funciones de orden superior de Swift, es decir, "reducir". Siga el fragmento de código a continuación:

newDictionary = oldDictionary.reduce(*newDictionary*) { r, e in var r = r; r[e.0] = e.1; return r }

@ Dharmesh En su caso, será,

newDictionary = dict.reduce([3 : "efg"]) { r, e in var r = r; r[e.0] = e.1; return r }

Avíseme si encuentra algún problema al usar la sintaxis anterior.

Shobhit C
fuente
0

Swift 5 feliz codificación

var tempDicData = NSMutableDictionary()

for temp in answerList {
    tempDicData.setValue("your value", forKey: "your key")
}
Shakeel Ahmed
fuente
-1

Agregué la extensión del diccionario

extension Dictionary {   
  func cloneWith(_ dict: [Key: Value]) -> [Key: Value] {
    var result = self
    dict.forEach { key, value in result[key] = value }
    return result  
  }
}

puedes usar cloneWithasí

 newDictionary = dict.reduce([3 : "efg"]) { r, e in r.cloneWith(e) }
jimi
fuente
-10

si desea modificar o actualizar NSDictionary, primero escriba todo como NSMutableDictionary

let newdictionary = NSDictionary as NSMutableDictionary

entonces simplemente use

 newdictionary.setValue(value: AnyObject?, forKey: String)
Sonu Verma
fuente