Swift 2.0 初始化嵌套字典没有像我预期的那样工作

Swift 2.0 initializing nested dictionaries doesn't work as I expected

我正在尝试使用 swift 2.0 将一些 JSON 结构解析为内存映射 - 我一直 运行 解决这个问题。第一次发生时,我认为这只是我做的一些奇怪的事情,但出于同样的原因再次发生,所以显然我不明白。

我创建了两个单元测试来演示。第一个 (testFails) 为字典分配一个值,然后使用嵌套结构的句柄构建子值。第二个(testWorks)总是从顶级字典中取消引用完整路径并构建它。第二个版本总是有效,但第一个永远不会。我唯一能想到的是 (1),字典正在复制对子映射 (subMap) 的引用,或者 (2) 正在发生一些带有可选值的时髦事情。

对我来说都没有意义,而且 XCode 中的调试器非常糟糕,它永远不会显示结构的值。调试器说 0 keys/pairs 但是当我打印计数时我得到一个值,所以这是无用的。例如,在 testWorks 的 XCTAssertEqual 行上放置一个断点,调试器有时会说变量 'map' 包含 0 个 key/value 对,有时什么都不显示 - 即使显然有一个 key/value对在那里。

附带一提(新手),我发现自己在这个非常 'modern' 的环境中求助于 print 语句,因为 XCode 调试器经常失败 - 它没有显示任何数据或完全陌生的东西.例如,在 Java 中我可以检查不同变量的引用地址并在 proxies/copies 被创建时清除,但我不能在 XCode.

中这样做
func testFails()
{
    var map = [String: [String: String]]();
    var subMap = [String: String]();
    map["map"] = subMap;
    subMap["1"] = "2";
    XCTAssertEqual(1,  map.count);
    XCTAssertEqual(1,  map["map"]!.count);  // << Fails
    XCTAssertEqual("2", map["map"]!["1"]);  // << Fails
}

func testWorks()
{
    var map = [String: [String: String]]();
    map["map"] = [String: String]();
    map["map"]!["1"] = "2";
    XCTAssertEqual(1,  map["map"]!.count);
    XCTAssertEqual("2", map["map"]!["1"]);
}

Swift CollectiontypesArraysDictionaries 等)不是对象,它们是结构。

所以当 map["map"] = subMap; map 将获取 subMap 中的所有信息并将其放在键 "map" 下时,请注意对 subMap 的引用不是放在键 "map".

因此,当您稍后在键 "1" 下添加一个值时,您不会将它添加到 map["map"] 下的值,您只是将它添加到 subMap

因此,当您尝试访问 "map" 值时,它将包含 subMap 在您的情况下设置为 "map" 时所包含的内容为空。

希望我没有让您感到困惑,术语不是我最聪明的一面。