Làm cách nào để nối các phần tử vào từ điển trong Swift?


216

Tôi có một từ điển đơn giản được định nghĩa như sau:

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

Bây giờ tôi muốn thêm một yếu tố vào từ điển này: 3 : "efg"

Làm thế nào tôi có thể nối 3 : "efg"vào từ điển hiện có này?


sử dụng NSMutableDixi
Saurabh Prajapati

1
Bạn có chắc chắn muốn có một từ điển chứ không phải một mảng, vì các khóa của bạn dường như là các số 1, 2 và 3?
gnasher729

Câu trả lời:


239

Bạn đang sử dụng NSDictionary. Trừ khi bạn rõ ràng cần loại đó vì một số lý do, tôi khuyên bạn nên sử dụng từ điển Swift.

Bạn có thể chuyển từ điển Swift cho bất kỳ chức năng NSDictionarynào mà không cần bất kỳ công việc bổ sung nào, bởi vì Dictionary<>NSDictionaryliên tục kết nối với nhau. Ưu điểm của cách Swift gốc là từ điển sử dụng các loại chung, vì vậy nếu bạn xác định nó Intlà khóa và Stringlà giá trị, bạn không thể sử dụng nhầm các khóa và giá trị của các loại khác nhau. (Trình biên dịch kiểm tra các loại thay mặt bạn.)

Dựa trên những gì tôi thấy trong mã của bạn, từ điển của bạn sử dụng Intlàm khóa và Stringlàm giá trị. Để tạo một thể hiện và thêm một mục sau đó, bạn có thể sử dụng mã này:

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

Nếu sau này bạn cần gán nó cho một biến NSDictionarykiểu, chỉ cần thực hiện một biểu diễn rõ ràng:

let nsDict = dict as! NSDictionary

Và, như đã đề cập trước đó, nếu bạn muốn chuyển nó đến một chức năng mong đợi NSDictionary, hãy chuyển nó như hiện tại mà không có bất kỳ chuyển đổi hoặc chuyển đổi nào.


Cảm ơn cho một lời giải thích thích hợp về những gì một người thực sự nên làm. Sử dụng sự tiện lợi của Swift để tạo và thao tác một Dictionaryđối tượng và sau đó chuyển đổi nó thành NSDictionarycuối nếu bạn cần. Tuyệt vời. Cảm ơn.
Joshua Pinter

Có cách nào để tôi có thể thêm vào cùng một khóa bằng cách sử dụng một dấu phân cách (tương tự như addValue ). Tôi có nghĩa là như thêm một "Antonio"khóa 1để dic[1]trở lại "abc, Antonio".
Mật ong

@honey không phải là tôi biết ... nhưng đó là một phần bổ sung đơn giản nếu phần tử đã tồn tại
Antonio

113

bạn có thể thêm bằng cách sử dụng và thay đổi DictionarythànhNSMutableDictionary

dict["key"] = "value"

2
Tôi đã gặp một lỗi thông báoCannot assign to the result of this expression
Dharmesh Kheni

thêm cách này cho câu hỏi của bạn dict [3] = "efg";
yashwanth77

kiểm tra câu trả lời đã chỉnh sửa của tôi, nó hoạt động cho tôi. Trao đổi từ điển thành Mutable một từ mà nó hoạt động!
yashwanth77

1
dict["testval"] = "test".. Lỗifatal error: unexpectedly found nil while unwrapping an Optional value
jose920405 24/07/2015

2
Nó sẽ không hoạt động với 2.2+, dict chỉ đọc trong biểu thức đó
triển

67

Tôi biết điều này có thể đến rất muộn, nhưng nó có thể hữu ích với ai đó. Vì vậy, để nối các cặp giá trị khóa vào từ điển trong swift, bạn có thể sử dụng phương thức updateValue (value :, forKey :) như sau:

var dict = [ 1 : "abc", 2 : "cde"]
dict.updateValue("efg", forKey: 3)
print(dict)

49

Chuyển 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)

Vì vậy, từ điển của bạn chứa:

từ điển [1: Hola, 2: Xin chào, 3: Aloha]


3
Làm thế nào là tốt hơn dictionary[1] = "Hola"?
Bến Leggiero

Chỉ đơn giản là một cách khác để làm điều đó. Tất cả phụ thuộc vào những gì bạn cần làm! Tôi là trường hợp của tôi, đây là cách tốt nhất
Cristian Mora

4
Tôi hiểu rằng bạn nghĩ rằng điều này là tốt hơn; đó là lý do tại sao bạn đăng nó Nhưng tôi không thấy làm thế nào là tốt hơn. Xin vui lòng, cho tôi biết làm thế nào là tốt hơn
Ben Leggiero

Tôi đồng ý nên có một phương thức gọi là "addValue" hoặc "setValue", rằng "updateValue" nên được sử dụng để CẬP NHẬT như tên gọi của nó
pkarc

Lý do là khi từ điển là init có giá trị [] khác với nil, vì vậy cần sử dụng updateValue vì chúng tôi đang cố gắng thay đổi giá trị và không chèn nó.
Cristian Mora

16

Nếu từ điển của bạn là Intđể Stringbạn có thể làm chỉ đơn giản là:

dict[3] = "efg"

Nếu bạn muốn thêm các yếu tố vào giá trị của từ điển thì một giải pháp khả thi:

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

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

16

Swift 3+

Ví dụ để gán giá trị mới cho Từ điển. Bạn cần khai báo nó là NSMutableDixi:

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

12

Trong Swift, nếu bạn đang sử dụng NSDipedia , bạn có thể sử dụng setValue:

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

1
chỉnh sửa câu trả lời của bạn, trong tương lai hãy xem xét thêm thông tin để tránh downvote.
Juan Boero

11

Cho hai từ điển như sau:

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

Đây là cách bạn có thể thêm tất cả các mục từ dic2 đến dic1 :

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

Chúc mừng A.


9
Tốt hơn là sử dụng .forEachthay vì .mapchúng ta không cần bất kỳ mảng ánh xạ trả lại nào
haik.ampardjian

9

Dict.updateValue cập nhật giá trị cho khóa hiện tại từ từ điển hoặc thêm cặp khóa-giá trị mới nếu khóa không tồn tại.

Thí dụ-

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

Kết quả-

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

7

Đối với các nghiên cứu sinh sử dụng [String:Any]thay vì Dictionarydưới đây là phần mở rộng

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

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

4

Kể từ Swift 5, bộ sưu tập mã sau hoạt động.

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

Không có chức năng nối thêm dữ liệu trong từ điển. Bạn chỉ cần gán giá trị cho khóa mới trong từ điển hiện có. nó sẽ tự động thêm giá trị vào từ điển.

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

Đầu ra sẽ như thế nào

["Tên": "Aloha", "người dùng": "Aloha 2", "câu hỏi": "" Bạn có phải là của tôi "không?"]


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
Vui lòng cung cấp một số thông tin tại sao câu trả lời này giải quyết vấn đề
Stephen Reindl

@StephenReindl Nếu bạn chạy nó, bạn sẽ thấy;)
Ben Leggiero

1

Để thêm các yếu tố mới, chỉ cần đặt:

listParrameters["your parrameter"] = value

0

Cho đến nay, cách tốt nhất mà tôi đã tìm thấy để nối dữ liệu vào từ điển bằng cách sử dụng một trong các chức năng bậc cao hơn của Swift tức là "giảm". Thực hiện theo đoạn mã dưới đây:

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

@ Dharmesh Trong trường hợp của bạn, nó sẽ là,

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

Xin vui lòng cho tôi biết nếu bạn tìm thấy bất kỳ vấn đề trong việc sử dụng cú pháp trên.


0

Swift 5 mã hóa hạnh phúc

var tempDicData = NSMutableDictionary()

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

-1

Tôi đã thêm phần mở rộng từ điển

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

bạn có thể sử dụng cloneWithnhư thế này

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

-10

nếu bạn muốn sửa đổi hoặc cập nhật NSDipedia thì trước hết hãy gõ nó dưới dạng NSMutableDipedia

let newdictionary = NSDictionary as NSMutableDictionary

sau đó chỉ cần sử dụng

 newdictionary.setValue(value: AnyObject?, forKey: String)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.