Como acrescentar elementos em um dicionário no Swift?

216

Eu tenho um dicionário simples que é definido como:

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

Agora eu quero adicionar um elemento neste dicionário: 3 : "efg"

Como posso acrescentar 3 : "efg"a este dicionário existente?

Dharmesh Kheni
fonte
use NSMutableDictionary
Saurabh Prajapati
1
Tem certeza de que deseja um dicionário e não uma matriz, pois suas chaves parecem ser os números 1, 2 e 3?
precisa saber é o seguinte

Respostas:

239

Você está usando NSDictionary. A menos que você precise explicitamente desse tipo por algum motivo, recomendo o uso de um dicionário Swift.

Você pode passar um dicionário Swift para qualquer função esperando NSDictionarysem qualquer trabalho extra, porque Dictionary<>e NSDictionaryperfeitamente colmatar um ao outro. A vantagem da maneira Swift nativa é que o dicionário usa tipos genéricos; portanto, se você o definir Intcomo chave e Stringcomo valor, não poderá usar por engano chaves e valores de tipos diferentes. (O compilador verifica os tipos em seu nome.)

Com base no que vejo no seu código, seu dicionário usa Intcomo chave e Stringcomo valor. Para criar uma instância e adicionar um item posteriormente, você pode usar este código:

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

Se você precisar atribuí-lo posteriormente a uma variável do NSDictionarytipo, basta fazer uma conversão explícita:

let nsDict = dict as! NSDictionary

E, como mencionado anteriormente, se você deseja passá-lo para uma função que está esperando NSDictionary, passe-o como está sem qualquer conversão ou conversão.

Antonio
fonte
Obrigado por uma explicação adequada do que uma pessoa deve realmente fazer. Utilizando a conveniência do Swift para criar e manipular um Dictionaryobjeto e, em seguida, convertê-lo NSDictionaryno final, se necessário. Maravilhoso. Obrigado.
Joshua Pinter
Existe alguma maneira que eu possa acrescentar à mesma chave usando um delimitador (semelhante ao addValue ). Quero dizer, como adicionar uma "Antonio"chave 1para dic[1]retornar "abc, Antonio".
Mel
@honey não que eu estou ciente de ... mas é um acréscimo simples se o elemento já existe
Antonio
113

você pode adicionar usando da seguinte maneira e alterar DictionaryparaNSMutableDictionary

dict["key"] = "value"
yashwanth77
fonte
2
Eu recebi um erro que dizCannot assign to the result of this expression
Dharmesh Kheni
adicione este caminho para sua pergunta dict [3] = "efg";
precisa saber é o seguinte
verifique minha resposta editada está funcionando para o dicionário me.change para Mutable one works!
precisa saber é o seguinte
1
dict["testval"] = "test".. Errofatal error: unexpectedly found nil while unwrapping an Optional value
jose920405 24/07
2
Não vai funcionar com 2.2 +, dict é somente leitura em que a expressão
jeveloper
67

Eu sei que isso pode estar chegando muito tarde, mas pode ser útil para alguém. Portanto, para anexar pares de valores-chave a dicionários no swift, você pode usar o método updateValue (value:, forKey:) da seguinte maneira:

var dict = [ 1 : "abc", 2 : "cde"]
dict.updateValue("efg", forKey: 3)
print(dict)
HeadOnn
fonte
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)

Portanto, seu dicionário contém:

dicionário [1: Hola, 2: Olá, 3: Aloha]

Cristian Mora
fonte
3
Como isso é melhor do que dictionary[1] = "Hola"?
Ben leggiero
É simplesmente outra maneira de fazê-lo. Tudo depende do que você precisa fazer! Eu meu caso, esta é a melhor maneira #
Cristian Mora
4
Eu entendo que você acha que isso é melhor; foi por isso que você postou. Mas não vejo como isso é melhor. Por favor, me diga como isso é melhor
Ben leggiero
Concordo que deve haver um método chamado "AddValue" ou "setValue", que "UpdateValue" deve ser usado para atualizar como o próprio nome diz
pkarc
O motivo é que, quando o dicionário foi iniciado, possui um valor [] diferente de zero, portanto, é necessário usar a propriedade updateValue porque estamos tentando alterar o valor e não inseri-lo.
Cristian Mora
16

Se o seu dicionário é Intpara Stringvocê, basta:

dict[3] = "efg"

Se você quer adicionar elementos ao valor do dicionário, uma possível solução:

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

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

Swift 3+

Exemplo para atribuir novos valores ao Dicionário. Você precisa declará-lo como NSMutableDictionary:

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

No Swift, se você estiver usando o NSDictionary , poderá usar setValue:

dict.setValue("value", forKey: "key")
lojals
fonte
1
editou sua resposta, no futuro, considere adicionar mais informações para evitar votos negativos.
Juan Boero
11

Dados dois dicionários, como abaixo:

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

Aqui está como você pode adicionar todos os itens de dic2 a dic1 :

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

Saúde A.

Amin Tavassolian
fonte
9
É melhor usar .forEachem vez de .mapcomo nós não precisa de nenhum retorno variedade mapeados
haik.ampardjian
9

Dict.updateValue atualiza o valor da chave existente do dicionário ou adiciona um novo par de valores-chave se a chave não existir.

Exemplo-

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

Para os bolsistas que usam em [String:Any]vez de Dictionaryabaixo está a extensão

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
fonte
4

A partir do Swift 5, a seguinte coleção de códigos funciona.

 // 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)
Lorde Anúbis
fonte
4

Não há função para acrescentar os dados no dicionário. Você acabou de atribuir o valor à nova chave no dicionário existente. agregará automaticamente valor ao dicionário.

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

A saída será como

["Nome": "Aloha", "usuário": "Aloha 2", "perguntas": "" Você é meu "?"]

Talha Rasool
fonte
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
fonte
2
var dict = ["name": "Samira", "surname": "Sami"]
// Add a new enter code herekey with a value
dict["email"] = "[email protected]"
print(dict)
Rainha Semiramis
fonte
1
Por favor, forneça alguma informação porque esta resposta resolve o problema
Stephen Reindl
@StephenReindl Se você executá-lo, você verá;)
Ben leggiero
1

Para adicionar novos elementos, basta definir:

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

Até agora, a melhor maneira que encontrei de anexar dados a um dicionário usando uma das funções de ordem superior do Swift, ou seja, "reduzir". Siga o trecho de código abaixo:

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

@ Dharmesh No seu caso, será,

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

Entre em contato se encontrar algum problema ao usar a sintaxe acima.

Shobhit C
fonte
0

Codificação feliz do Swift 5

var tempDicData = NSMutableDictionary()

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

Eu adicionei extensão Dictionary

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

você pode usar cloneWithassim

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

se você deseja modificar ou atualizar o NSDictionary, primeiro digite-o como NSMutableDictionary

let newdictionary = NSDictionary as NSMutableDictionary

então simplesmente use

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