Як додати елементи до словника 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в кінці, якщо вам потрібно. Чудовий. Дякую.
Джошуа Пінтер

Чи все-таки я можу додати той самий ключ за допомогою роздільника (подібний до addValue ). Я маю в виду , як додати"Antonio" до ключу 1так dic[1]повернуся "abc, Antonio".
Мед

@honey не те, про що я знаю ... але це просто додаток, якщо елемент вже існує
Антоніо

113

ви можете додати за допомогою наступного способу та змінити DictionaryнаNSMutableDictionary

dict["key"] = "value"

2
Я отримав помилку, яка говоритьCannot assign to the result of this expression
Дхармеш Хені

додайте цей спосіб до свого запитання dict [3] = "efg";
yashwanth77

перевірити мою відредаговану відповідь, що вона працює для мене.change словник на мутабельний, він працює!
yashwanth77

1
dict["testval"] = "test".. Помилкаfatal error: unexpectedly found nil while unwrapping an Optional value
jose920405

2
Він не працюватиме з версією 2.2+,
диктат читається лише

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"?
Бен Леджієро

Це просто інший спосіб зробити це. Все залежить від того, що вам потрібно робити! У моєму випадку, це найкращий спосіб
Крістіан Мора

4
Я розумію, що ти вважаєш, що це краще; ось чому ви і розмістили його. Але я не бачу, як це краще. Скажіть, будь ласка, як це краще
Бен Леджіеро

Я погоджуюся, що має бути метод, який називається "addValue" або "setValue", щоб "updateValue" використовувався для оновлення, як
видно з

Причина полягає в тому, що коли словник init be має значення [], яке відрізняється від нуля, тому необхідно використовувати властивість updateValue, оскільки ми намагаємось змінити значення, а не вставляти його.
Крістіан Мора

16

Якщо ваш словник Intдля Stringвас, ви можете зробити просто:

dict[3] = "efg"

Якщо ви маєте на увазі додавання елементів до значення словника, можливе рішення:

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

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

16

Швидкий 3+

Приклад призначення нових значень словнику. Вам потрібно оголосити його як NSMutableDictionary:

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

12

У Swift, якщо ви використовуєте NSDictionary , ви можете використовувати setValue:

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

1
Ви відредагували свою відповідь, надалі розгляньте можливість додавати більше інформації, щоб уникнути повторного голосування.
Хуан Боеро

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", "user": "Aloha 2", "questions": "" Ти моя "?"]


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")


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 }

Будь ласка, повідомте мене, якщо ви знайшли якісь проблеми у використанні вище синтаксису.


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, то насамперед введіть його як NSMutableDictionary

let newdictionary = NSDictionary as NSMutableDictionary

то просто використовувати

 newdictionary.setValue(value: AnyObject?, forKey: String)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.