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


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.


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"

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)

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]


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)

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)

12

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

dict.setValue("value", forKey: "key")

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.


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"

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

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)

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 "?"]


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

2
var dict = ["name": "Samira", "surname": "Sami"]
// Add a new enter code herekey with a value
dict["email"] = "sample@email.com"
print(dict)

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

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.


0

Swift 5 feliz codificación

var tempDicData = NSMutableDictionary()

for temp in answerList {
    tempDicData.setValue("your value", forKey: "your key")
}

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

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