Как добавить элементы в словарь в 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"

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)

Спасибо! Я продолжал получать что-то об отсутствующем параметре по умолчанию, когда пытался добавить новые значения в 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)

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

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


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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.