如何为嵌套的[NSObject:AnyObject]字典赋值?

时间:2015-09-16 12:45:15

标签: macos swift dictionary xcode6 osx-yosemite

我想要一本字典词典。我来自大多数Python背景,我可以简单地分配和分配顶级键作为新词典,然后使用对该词典的引用来更新它,无论它嵌套的深度如何。

我试图在Swift中做同样的事情。我使用的是[NSObject: AnyObject],因为它必须可以与NSDictionary相关联,因此我可以将其存储在NSUserDefaults中。

以下是Playground示例:

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

控制台(不是游乐场)的结果输出是:

[aa_key: aa_value]
[aa_key: aa_value, bb_key: { }]
bar: [cc_key: cc_value]
foo: [aa_key: aa_value, bb_key: { }]

我可以看到,在将{* 1}}中的向下转换的可选结果展开的部分中,bar字典的分配是正确的。但是,当我稍后打印bar时,更改没有成功。

bar似乎不是foo中存储的字典的正确引用。为什么不呢?

1 个答案:

答案 0 :(得分:2)

在Swift中,所有集合类型都是值类型,与Objective-C中的引用类型不同,这意味着bar中的对象与foo["bb_key"]

中的对象不同

您必须重新分配/更新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)")