ฉันมีพจนานุกรมง่ายๆที่กำหนดไว้เช่น:
var dict : NSDictionary = [ 1 : "abc", 2 : "cde"]
ตอนนี้ฉันต้องการเพิ่มองค์ประกอบลงในพจนานุกรมนี้: 3 : "efg"
ฉันจะต่อท้าย3 : "efg"
พจนานุกรมที่มีอยู่นี้ได้อย่างไร
ฉันมีพจนานุกรมง่ายๆที่กำหนดไว้เช่น:
var dict : NSDictionary = [ 1 : "abc", 2 : "cde"]
ตอนนี้ฉันต้องการเพิ่มองค์ประกอบลงในพจนานุกรมนี้: 3 : "efg"
ฉันจะต่อท้าย3 : "efg"
พจนานุกรมที่มีอยู่นี้ได้อย่างไร
คำตอบ:
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
ให้ส่งผ่านตามที่เป็นโดยไม่ต้องมีการร่ายหรือการแปลง
Dictionary
วัตถุแล้วแปลงมันให้NSDictionary
เป็นที่สุดหากคุณต้องการ ยอดเยี่ยม ขอบคุณ
คุณสามารถเพิ่มโดยใช้วิธีต่อไปนี้และเปลี่ยนDictionary
เป็นNSMutableDictionary
dict["key"] = "value"
Cannot assign to the result of this expression
dict["testval"] = "test"
.. Errorfatal error: unexpectedly found nil while unwrapping an Optional value
ฉันรู้ว่าสิ่งนี้อาจมาช้ามาก แต่อาจเป็นประโยชน์กับบางคน ดังนั้นสำหรับการผนวกคู่ของค่าคีย์กับพจนานุกรมใน swift คุณสามารถใช้เมธอด updateValue (value:, forKey:)ดังนี้:
var dict = [ 1 : "abc", 2 : "cde"]
dict.updateValue("efg", forKey: 3)
print(dict)
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]
dictionary[1] = "Hola"
อย่างไร?
ถ้าพจนานุกรมของคุณคือInt
การString
ที่คุณสามารถทำได้เพียง:
dict[3] = "efg"
หากคุณหมายถึงการเพิ่มองค์ประกอบให้กับมูลค่าของพจนานุกรมทางออกที่เป็นไปได้:
var dict = Dictionary<String, Array<Int>>()
dict["key"]! += [1]
dict["key"]!.append(1)
dict["key"]?.append(1)
Swift 3+
ตัวอย่างการกำหนดค่าใหม่ให้กับพจนานุกรม คุณต้องประกาศเป็น NSMutableDictionary:
var myDictionary: NSMutableDictionary = [:]
let newValue = 1
myDictionary["newKey"] = newValue
print(myDictionary)
ใน Swift หากคุณใช้NSDictionaryคุณสามารถใช้setValue
:
dict.setValue("value", forKey: "key")
ให้พจนานุกรมสองพจนานุกรมดังต่อไปนี้:
var dic1 = ["a": 1, "c": 2]
var dic2 = ["e": 3, "f": 4]
นี่คือวิธีที่คุณสามารถเพิ่มรายการทั้งหมดจากdic2ถึงdic1 :
dic2.map {
dic1[$0.0] = $0.1
}
ไชโย
.forEach
แทน.map
เนื่องจากเราไม่ต้องการอาร์เรย์ที่แมปคืนใด ๆ
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"
สำหรับเพื่อนที่ใช้[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)
}
}
}
ตั้งแต่ 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)
ไม่มีฟังก์ชั่นในการผนวกข้อมูลในพจนานุกรม คุณเพิ่งกำหนดค่ากับคีย์ใหม่ในพจนานุกรมที่มีอยู่ มันจะเพิ่มมูลค่าให้กับพจนานุกรมโดยอัตโนมัติ
var param = ["Name":"Aloha","user" : "Aloha 2"]
param["questions"] = "Are you mine?"
print(param)
ผลลัพธ์จะเป็นเช่นนั้น
["ชื่อ": "Aloha", "ผู้ใช้": "Aloha 2", "คำถาม": "" คุณเป็นของฉัน "หรือไม่"]
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")
var dict = ["name": "Samira", "surname": "Sami"]
// Add a new enter code herekey with a value
dict["email"] = "sample@email.com"
print(dict)
หากต้องการเพิ่มองค์ประกอบใหม่เพียงแค่ตั้งค่า:
listParrameters["your parrameter"] = value
จนถึงตอนนี้วิธีที่ดีที่สุดที่ฉันพบว่าผนวกข้อมูลลงในพจนานุกรมโดยใช้หนึ่งในฟังก์ชันลำดับสูงกว่าของ 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 }
โปรดแจ้งให้เราทราบหากคุณพบปัญหาใด ๆ ในการใช้ไวยากรณ์ข้างต้น
การเข้ารหัสที่มีความสุขอย่างรวดเร็ว 5
var tempDicData = NSMutableDictionary()
for temp in answerList {
tempDicData.setValue("your value", forKey: "your key")
}
ฉันเพิ่มส่วนขยายพจนานุกรม
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) }
ถ้าคุณต้องการแก้ไขหรืออัปเดต NSDictionary ก่อนอื่นให้พิมพ์ typecast เป็น NSMutableDictionary ทั้งหมด
let newdictionary = NSDictionary as NSMutableDictionary
จากนั้นก็ใช้
newdictionary.setValue(value: AnyObject?, forKey: String)