2016-05-27 16 views
0

[[String:[String:String]辞書が宣言され、初期化されました。最初は空ですが、親キーの下に複数の値を追加しようとしています。多次元辞書に 'Key:Value'を追加すると、

var dictionary = [String:[String:String] 

// some checks 

dictionary[i] = ["name" : name] 
dictionary[i] = ["from" : country] 
dictionary[i] = ["age" : age] 

私は、私は[key: [String:String]下の子としてのみ年齢のキーを持つことに終わるん。このアプローチを使用すると上書きされます。

答えて

2

あなたのコードを行うための適切な方法は、各ライン上の新しい辞書を作成し、キーiためdictionaryでこれを割り当てること、あなたは最後の辞書["age" : age]

で終わるように、あなたが必要とされている何

内部辞書を作成し、これに値を割り当てて、これを外部辞書に割り当てます。

var innerDict = [String:String]() 
innerDict["name"] = name 
innerDict["from"] = from 
innerDict["age"] = age 

dictionary[i] = innerDict 

私はあなたが構造体の作成を見て、あなたの外側の辞書ではなく辞書

+0

これは私の場合のための最良のアプローチでした。ありがとう! – senty

0
func insert(key:String, value:String, at k:String) { 
    var d = dictionary[k] ?? [String:String]() 
    d[key] = value 
    dictionary[k] = d 
} 

の辞書を使用して、ここではそれをテストする方法だと置くこと、しかし、お勧めします:

insert("name", value: name, at: i) 
insert("from", value: country, at: i) 
insert("age", value: age, at: i) 
0

オプションの連鎖を使用して内部ディクショナリに割り当てることができますが、内部ディクショナリを最初に作成する必要があります。

// create the dictionary of dictionaries 
var dictionary = [String:[String:String]]() 

// some example constants to make your code work  
let i = "abc" 
let name = "Fred" 
let country = "USA" 
let age = "28" 

// Use nil coalescing operator ?? to create  
// dictionary[i] if it doesn't already exist 
dictionary[i] = dictionary[i] ?? [:] 

// Use optional chaining to assign to inner dictionary 
dictionary[i]?["name"] = name 
dictionary[i]?["from"] = country 
dictionary[i]?["age"] = age 

print(dictionary) 

出力:これらの技術を用い

["abc": ["age": "28", "from": "USA", "name": "Fred"]] 

、ここではマットのinsert(_:value:at:)機能@の私のバージョンがあります:

func insert(key:String, value:String, at k:String) { 
    dictionary[k] = dictionary[k] ?? [:] 
    dictionary[k]?[key] = value 
}