【问题标题】:How does one assign values to nested [NSObject: AnyObject] dictionaries?如何为嵌套的 [NSObject: AnyObject] 字典赋值?
【发布时间】:2015-09-16 12:45:14
【问题描述】:

我想要一本字典词典。我主要来自 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: { }]

我可以看到,在向下转换的可选结果展开到bar 的部分中,对bar 字典的分配是正确的。但是,当我后来打印foo 时,更改并没有发生。

看来 bar 不是对存储在 foo["bb_key"] 中的字典的正确引用。为什么不呢?

【问题讨论】:

    标签: macos swift dictionary xcode6 osx-yosemite


    【解决方案1】:

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

    【讨论】:

    • 谢谢。在讨论值类型与引用时,我错过了这种细微差别。这绝对与我在过去 10 年中使用的每一种语言都背道而驰。
    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多