macos - 如何为嵌套的 [NSObject : AnyObject] dictionaries? 赋值

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

控制台(不是 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"] 中的对象不同

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

关于macos - 如何为嵌套的 [NSObject : AnyObject] dictionaries? 赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32609002/

相关文章:

c++ - 是否可以迭代按值排序的 map ?

swift - 在两个文本字段中至少有一个字符之前,如何禁用按钮?

macos - XCode 4.4 问题 : 'mach_debug/mach_debug_types.h' file not found

macos - 如何在 NSDocument 加载之前拦截 openDocument 的结果?

macos - 如何以编程方式将 NSWindow 设置为全屏?

ios - 室内地图 - 如何使用 iBeacons 手动设置跟踪用户位置和方向?

ios - SCNNode在 anchor 坐标系内旋转

c# - 双重检查字典 "ContainsKey"上的锁定

list - 根据元素索引修改列表的元素

objective-c - 将 NSTitlebarAccessoryViewController 添加到 NSWindow 后出现延迟