如何在Swift中将元素追加到字典中?


Answers:


239

您正在使用NSDictionary。除非出于某些原因明确需要将其设为该类型,否则我建议使用Swift字典。

您可以通过迅捷的字典任何期望的功能NSDictionary而无需任何额外的工作,因为Dictionary<>NSDictionary无缝地弥合彼此。Swift的本机方式的优点是字典使用泛型类型,因此,如果将其定义Int为键和String值,就不会错误地使用不同类型的键和值。(编译器代表您检查类型。)

根据我在您的代码中看到的内容,字典将Int用作键和String值。要创建实例并在以后添加项目,可以使用以下代码:

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

如果以后需要将其分配给NSDictionary类型变量,则只需执行显式转换即可:

let nsDict = dict as! NSDictionary

并且,如前所述,如果您要将其传递给Expecting函数NSDictionary,则应按原样传递它,而无需任何强制转换或转换。


感谢您对一个人应该做什么的正确解释。利用Swift的便利性来创建和操作Dictionary对象,然后NSDictionary根据需要将其转换为结尾。精彩。谢谢。
约书亚·品特

无论如何,我可以使用定界符(类似于addValue)附加到同一键上。我的意思是,像添加一个"Antonio"1dic[1]将返回"abc, Antonio"
Honey

@honey并不是我知道的...但是如果元素已经存在,这是一个简单的追加
Antonio

113

您可以使用以下方式添加并更改DictionaryNSMutableDictionary

dict["key"] = "value"

2
我收到一个错误消息,说Cannot assign to the result of this expression
Dharmesh Kheni 2014年

为您的问题dict [3] =“ efg”添加这种方式;
yashwanth77 2014年

检查我编辑的答案是否对我有用。将字典更改为Mutable one即可!
yashwanth77 2014年

1
dict["testval"] = "test"..错误fatal error: unexpectedly found nil while unwrapping an Optional value
jose920405

2
它不适用于2.2+,dict在该表达式中为只读
jeveloper

67

我知道这可能来得很晚,但是对某人可能有用。因此,为了将键值对快速添加到字典中,可以使用updateValue(value:,forKey:)方法,如下所示:

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)

因此,您的字典包含:

字典[1:荷拉,2:你好,3:阿罗哈]


3
有什么比这更好的dictionary[1] = "Hola"呢?
Ben Leggiero

仅仅是另一种方式。一切都取决于您需要做什么!就我而言,这是最好的方法
Cristian Mora

4
我了解您认为这样做更好;这就是您发布它的原因。但是我看不出有什么更好的办法。请告诉我这是怎么更好
奔Leggiero

我同意应该使用一种名为“ addValue”或“ setValue”的方法,正如其名称所说,“ updateValue”应用于UPDATING
pkarc

原因是当字典init处于be时,其值[]不同于nil,因此必须使用属性updateValue,因为我们试图更改该值而不插入它。
克里斯蒂安·莫拉

16

如果您要使用字典IntString您可以执行以下操作:

dict[3] = "efg"

如果您要在字典的中添加元素,则可能的解决方案是:

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

dict["key"]! += [1]
dict["key"]!.append(1)
dict["key"]?.append(1)

16

迅捷3+

将新值分配给Dictionary的示例。您需要将其声明为NSMutableDictionary:

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

12

在Swift中,如果使用NSDictionary,则可以使用setValue

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

1
编辑了您的答案,以后考虑添加更多信息以避免投票不足。
Juan Boero'2

11

给定两个字典,如下所示:

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

这是将dic2的所有项目添加到dic1的方法

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

干杯A.


9
最好使用.forEach代替,.map因为我们不需要任何返回的映射数组
haik.ampardjian

9

Dict.updateValue 更新字典中现有键的值,或者如果键不存在,则添加新的新键值对。

例-

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

结果-

: 2 elements
    - key : "userId"
    - value : 866: 2 elements
    - key : "otherNotes"
    - value : "Hello"

7

对于使用[String:Any]而不是Dictionary下面的家伙是扩展

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

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

4

从Swift 5开始,以下代码集合起作用。

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

没有将数据追加到字典中的功能。您只需在现有字典中为新键分配值即可。它将自动为字典添加值。

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

输出将像

[“名称”:“ Aloha”,“用户”:“ Aloha 2”,“问题”:“”你是我的吗?“”]


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
请提供一些信息,为什么这个答案可以解决问题
Stephen Reindl

@StephenReindl如果运行它,您会看到;)
Ben Leggiero

1

要添加新元素,只需设置:

listParrameters["your parrameter"] = value

0

到目前为止,我发现通过使用Swift的高阶函数之一(即“减少”)将数据追加到字典的最佳方法。请遵循以下代码段:

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

@ Dharmesh就您而言,

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

如果您在使用上述语法时发现任何问题,请告诉我。



-1

我添加了字典扩展

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

你可以使用cloneWith这样的

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

-10

如果您想修改或更新NSDictionary,则首先将其类型转换为NSMutableDictionary

let newdictionary = NSDictionary as NSMutableDictionary

然后简单地使用

 newdictionary.setValue(value: AnyObject?, forKey: String)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.