如何为嵌套的 [NSObject: AnyObject] 字典赋值?
How does one assign values to nested [NSObject: AnyObject] dictionaries?
我想要一本词典中的词典。我主要来自 Python 背景,在那里我可以简单地分配和分配一个顶级键作为一个新字典,然后使用对该字典的引用来更新它,无论它嵌套有多深。
我正在尝试在 Swift 中做同样的事情。我正在使用 [NSObject: AnyObject]
因为它必须可以桥接到 NSDictionary
所以我可以将它存储在 NSUserDefaults
.
这是一个游乐场示例:
import Cocoa
var foo = [NSObject: AnyObject]()
foo["aa_key"] = "aa_value"
println(foo)
foo["bb_key"] = [NSObject: AnyObject]()
println(foo)
if var bar = foo["bb_key"] as? [NSObject: AnyObject] {
bar["cc_key"] = "cc_value"
println("bar: \(bar)")
} else {
println("Could not get bb dictionary")
}
// bb_key is still an _empty_ dictionary in foo!
println("foo: \(foo)")
控制台(不是 playground)中的结果输出是:
[aa_key: aa_value]
[aa_key: aa_value, bb_key: { }]
bar: [cc_key: cc_value]
foo: [aa_key: aa_value, bb_key: { }]
我可以看到在向下转换的可选结果被展开到 bar
的部分中,对 bar
字典的赋值是正确的。但是,当我稍后打印foo
时,更改并没有成功。
bar 似乎不是对存储在 foo["bb_key"]
中的词典的正确引用。为什么不呢?
在 Swift 中,所有集合类型都是值类型,这与 Objective-C 中的引用类型不同,这意味着 bar
中的对象与 foo["bb_key"]
[ 中的对象不同=14=]
您必须重新分配/更新 foo["bb_key"]
中的值
var foo = [NSObject: AnyObject]()
foo["aa_key"] = "aa_value"
println(foo)
foo["bb_key"] = [NSObject: AnyObject]()
println(foo)
if var bar = foo["bb_key"] as? [NSObject: AnyObject] {
bar["cc_key"] = "cc_value"
foo.updateValue(bar, forKey: "bb_key")
println("bar: \(bar)")
} else {
println("Could not get bb dictionary")
}
// bb_key is still an _empty_ dictionary in foo!
println("foo: \(foo)")
我想要一本词典中的词典。我主要来自 Python 背景,在那里我可以简单地分配和分配一个顶级键作为一个新字典,然后使用对该字典的引用来更新它,无论它嵌套有多深。
我正在尝试在 Swift 中做同样的事情。我正在使用 [NSObject: AnyObject]
因为它必须可以桥接到 NSDictionary
所以我可以将它存储在 NSUserDefaults
.
这是一个游乐场示例:
import Cocoa
var foo = [NSObject: AnyObject]()
foo["aa_key"] = "aa_value"
println(foo)
foo["bb_key"] = [NSObject: AnyObject]()
println(foo)
if var bar = foo["bb_key"] as? [NSObject: AnyObject] {
bar["cc_key"] = "cc_value"
println("bar: \(bar)")
} else {
println("Could not get bb dictionary")
}
// bb_key is still an _empty_ dictionary in foo!
println("foo: \(foo)")
控制台(不是 playground)中的结果输出是:
[aa_key: aa_value]
[aa_key: aa_value, bb_key: { }]
bar: [cc_key: cc_value]
foo: [aa_key: aa_value, bb_key: { }]
我可以看到在向下转换的可选结果被展开到 bar
的部分中,对 bar
字典的赋值是正确的。但是,当我稍后打印foo
时,更改并没有成功。
bar 似乎不是对存储在 foo["bb_key"]
中的词典的正确引用。为什么不呢?
在 Swift 中,所有集合类型都是值类型,这与 Objective-C 中的引用类型不同,这意味着 bar
中的对象与 foo["bb_key"]
[ 中的对象不同=14=]
您必须重新分配/更新 foo["bb_key"]
var foo = [NSObject: AnyObject]()
foo["aa_key"] = "aa_value"
println(foo)
foo["bb_key"] = [NSObject: AnyObject]()
println(foo)
if var bar = foo["bb_key"] as? [NSObject: AnyObject] {
bar["cc_key"] = "cc_value"
foo.updateValue(bar, forKey: "bb_key")
println("bar: \(bar)")
} else {
println("Could not get bb dictionary")
}
// bb_key is still an _empty_ dictionary in foo!
println("foo: \(foo)")