Swiftで要素を辞書に追加する方法は?


216

私は次のように定義されている簡単な辞書を持っています:

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

次に、この辞書に要素を追加します。 3 : "efg"

3 : "efg"この既存の辞書にどのように追加できますか?


NSMutableDictionaryを使用してください
Saurabh Prajapati

1
キーは数字の1、2、3のように見えるので、配列ではなく、辞書が必要ですか?
gnasher729

回答:


239

を使用してい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必要に応じて最後に変換します。素晴らしい。ありがとう。
Joshua Pinter 2016年

とにかく、区切り文字を使用して同じキーに追加できるものはありますか(addValueと同様)。ように私は意味追加"Antonio"キーには1そう dic[1]返します"abc, Antonio"
ハニー、

@ハニー、私が気づいているわけではありません...しかし、要素がすでに存在する場合、それは簡単な追加です
Antonio

113

あなたは次のような方法と変更使用して追加することができますDictionaryへのNSMutableDictionary

dict["key"] = "value"

2
私が言うエラーましたCannot assign to the result of this expression
Dharmesh Kheni

この方法をあなたの質問に追加してくださいdict [3] = "efg";
yashwanth77 2014

編集済みの回答を確認して、動作することを確認してください。辞書をミュータブルなものに変更してください。
yashwanth77 14

1
dict["testval"] = "test"..エラーfatal error: unexpectedly found nil while unwrapping an Optional value
jose920405 2015

2
これは、2.2以降では動作しません、辞書はその式に読み取り専用である
jeveloper

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:Hola、2:Hello、3:Aloha]


3
これはどうdictionary[1] = "Hola"ですか?
Ben Leggiero 2016

それは単に別の方法です。すべてはあなたが何をする必要があるかに依存します!I私の場合、これが最善の方法である
クリスティアン・モラ

4
私はあなたがこれがより良いと思っていることを理解しています。それがあなたがそれを投稿した理由です。しかし、これがどのように優れているかはわかりません。これがもっと良い方法を教えてください
Ben Leggiero

「addValue」または「setValue」と呼ばれるメソッドがあるはずであることに同意します。「updateValue」はその名前が示すように
更新に

その理由は、ディクショナリが初期化されている場合、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

Swift 3以上

辞書に新しい値を割り当てる例。NSMutableDictionaryとして宣言する必要があります。

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

12

Swiftでは、使用している場合 NSDictionary、以下を使用できますsetValue

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

1
回答を編集しました。今後、反対投票を避けるために、さらに情報を追加することを検討してください。
ファンボエロ16

11

次の2つの辞書があるとします。

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

dic2からdic1にすべてのアイテムを追加する方法は次のとおりです。

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

乾杯A


9
戻り値のマッピングされた配列は必要ないため、.forEach代わりに使用することをお.map
勧めします

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)

出力は次のようになります

["名前": "アロハ"、 "ユーザー": "アロハ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あなたはそれを実行した場合、あなたが表示されます。)
ベン・Leggiero


0

これまでのところ、Swiftの高次関数の1つ、つまり「reduce」を使用して、データを辞書に追加するための最良の方法を見つけました。以下のコードスニペットに従ってください。

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.