Как добавить элементы в словарь в Swift?

217

У меня есть простой словарь, который определяется как:

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

Теперь я хочу добавить элемент в этот словарь: 3 : "efg"

Как я могу добавить 3 : "efg"в этот существующий словарь?

Дхармеш Хени
источник
использовать NSMutableDictionary
Праджапати
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".
Мед
@ Меньше, не то чтобы я знал ... но это простое добавление, если элемент уже существует
Антонио
113

Вы можете добавить, используя следующий способ и изменить DictionaryнаNSMutableDictionary

dict["key"] = "value"
yashwanth77
источник
2
Я получил ошибку, которая говоритCannot assign to the result of this expression
Dharmesh Kheni
добавьте этот способ для вашего вопроса dict [3] = "efg";
yashwanth77
проверьте мой отредактированный ответ, он работает для меня. Измените словарь на Mutable, он работает!
yashwanth77
1
dict["testval"] = "test".. Ошибкаfatal error: unexpectedly found nil while unwrapping an Optional value
jose920405
2
Это не будет работать с 2.2+, dict только для чтения в этом выражении
jeveloper
68

Я знаю, что это может произойти очень поздно, но это может оказаться полезным для кого-то. Поэтому для добавления пар ключ-значение в словари в swift вы можете использовать метод updateValue (value:, forKey:) следующим образом:

var dict = [ 1 : "abc", 2 : "cde"]
dict.updateValue("efg", forKey: 3)
print(dict)
HeadOnn
источник
Спасибо! Я продолжал получать что-то об отсутствующем параметре по умолчанию, когда пытался добавить новые значения в dict. Этот метод работал.
inmanl
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" должен использоваться для ОБНОВЛЕНИЯ, как его имя говорит
pkarc
Причина в том, что когда словарь был инициализирован, be имеет значение [], отличное от nil, поэтому необходимо использовать свойство 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)
Dasoga
источник
12

В Swift, если вы используете NSDictionary , вы можете использовать setValue:

dict.setValue("value", forKey: "key")
lojals
источник
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")

result-

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

Выход будет как

["Имя": "Алоха", "Пользователь": "Алоха 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
Пожалуйста, предоставьте некоторую информацию, почему этот ответ решает проблему
Стивен Рейндл
@StephenReindl Если вы запустите его, вы увидите;)
Бен Легжеро
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

Swift 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)
Сону Верма
источник