จะผนวกองค์ประกอบเข้ากับพจนานุกรมใน Swift ได้อย่างไร


217

ฉันมีพจนานุกรมง่ายๆที่กำหนดไว้เช่น:

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

ตอนนี้ฉันต้องการเพิ่มองค์ประกอบลงในพจนานุกรมนี้: 3 : "efg"

ฉันจะต่อท้าย3 : "efg"พจนานุกรมที่มีอยู่นี้ได้อย่างไร


ใช้ NSMutableDictionary
Saurabh Prajapati

1
คุณแน่ใจหรือไม่ว่าต้องการพจนานุกรมไม่ใช่อาร์เรย์เนื่องจากคีย์ของคุณดูเหมือนจะเป็นหมายเลข 1, 2 และ 3
gnasher729

คำตอบ:


240

NSDictionaryคุณกำลังใช้ หากคุณไม่ต้องการให้เป็นประเภทนั้นอย่างชัดแจ้งฉันขอแนะนำให้ใช้พจนานุกรม Swift

คุณสามารถส่งพจนานุกรม 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

และตามที่กล่าวไว้ก่อนหน้านี้หากคุณต้องการส่งผ่านไปยังฟังก์ชั่นที่คาดหวังNSDictionaryให้ส่งผ่านตามที่เป็นโดยไม่ต้องมีการร่ายหรือการแปลง


ขอบคุณสำหรับคำอธิบายที่ถูกต้องเกี่ยวกับสิ่งที่คนควรทำจริง ๆ ใช้ความสะดวกสบายของ Swift ในการสร้างและจัดการDictionaryวัตถุแล้วแปลงมันให้NSDictionaryเป็นที่สุดหากคุณต้องการ ยอดเยี่ยม ขอบคุณ
Joshua Pinter

มีอยู่แล้วที่ฉันสามารถผนวกไปยังคีย์เดียวกันโดยใช้ตัวคั่น (คล้ายกับaddValue ) ผมหมายถึงเช่นเพิ่ม"Antonio"คีย์1เพื่อ จะกลับมาdic[1] "abc, Antonio"
ฮันนี่

@honey ไม่ใช่ว่าฉันรู้ ... แต่มันเป็นผนวกง่ายถ้าองค์ประกอบที่มีอยู่แล้ว
อันโตนิโอ

113

คุณสามารถเพิ่มโดยใช้วิธีต่อไปนี้และเปลี่ยนDictionaryเป็นNSMutableDictionary

dict["key"] = "value"

2
ฉันได้รับข้อผิดพลาดซึ่งบอกว่าCannot assign to the result of this expression
Dharmesh Kheni

เพิ่มวิธีนี้สำหรับคำถาม dict ของคุณ [3] = "efg";
yashwanth77

ตรวจสอบคำตอบที่แก้ไขของฉันมันทำงานให้ฉันเปลี่ยนพจนานุกรมเป็น Mutable อันที่ใช้ได้!
yashwanth77

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

2
มันจะใช้งานไม่ได้กับ 2.2+ ซึ่ง dict อ่านได้อย่างเดียวในนิพจน์นั้น
jeveloper

67

ฉันรู้ว่าสิ่งนี้อาจมาช้ามาก แต่อาจเป็นประโยชน์กับบางคน ดังนั้นสำหรับการผนวกคู่ของค่าคีย์กับพจนานุกรมใน swift คุณสามารถใช้เมธอด 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: Hola, 2: สวัสดี, 3: Aloha]


3
ดีกว่านี้dictionary[1] = "Hola"อย่างไร?
Ben Leggiero

เป็นเพียงอีกวิธีในการทำ ทุกอย่างขึ้นอยู่กับสิ่งที่คุณต้องทำ! ฉันกรณีของฉันนี่คือวิธีที่ดีที่สุด
Cristian Mora

4
ฉันเข้าใจว่าคุณคิดว่านี่ดีกว่า นั่นเป็นเหตุผลที่คุณโพสต์ แต่ฉันไม่เห็นว่ามันจะดีกว่า โปรดบอกฉันว่ามันดีกว่ากัน
เบ็กเลกเจเอโร่

ฉันเห็นด้วยควรมีวิธีการที่เรียกว่า "addValue" หรือ "setValue" ว่าควรใช้ "updateValue" เพื่ออัปเดตตามชื่อของมัน
pkarc

เหตุผลก็คือเมื่อดิกชันนารีเริ่มต้นมีค่า [] ที่แตกต่างจากศูนย์ดังนั้นจำเป็นต้องใช้คุณสมบัติ updateValue เนื่องจากเราพยายามเปลี่ยนค่าและไม่แทรก
Cristian Mora

16

ถ้าพจนานุกรมของคุณคือIntการStringที่คุณสามารถทำได้เพียง:

dict[3] = "efg"

หากคุณหมายถึงการเพิ่มองค์ประกอบให้กับมูลค่าของพจนานุกรมทางออกที่เป็นไปได้:

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

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

16

Swift 3+

ตัวอย่างการกำหนดค่าใหม่ให้กับพจนานุกรม คุณต้องประกาศเป็น NSMutableDictionary:

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

12

ใน Swift หากคุณใช้NSDictionaryคุณสามารถใช้setValue:

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

1
แก้ไขคำตอบของคุณในอนาคตพิจารณาเพิ่มข้อมูลเพิ่มเติมเพื่อหลีกเลี่ยงการ downvotes
Juan Boero

11

ให้พจนานุกรมสองพจนานุกรมดังต่อไปนี้:

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

นี่คือวิธีที่คุณสามารถเพิ่มรายการทั้งหมดจากdic2ถึงdic1 :

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

ไชโย


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


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 }

โปรดแจ้งให้เราทราบหากคุณพบปัญหาใด ๆ ในการใช้ไวยากรณ์ข้างต้น


0

การเข้ารหัสที่มีความสุขอย่างรวดเร็ว 5

var tempDicData = NSMutableDictionary()

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

-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 ก่อนอื่นให้พิมพ์ typecast เป็น NSMutableDictionary ทั้งหมด

let newdictionary = NSDictionary as NSMutableDictionary

จากนั้นก็ใช้

 newdictionary.setValue(value: AnyObject?, forKey: String)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.