我试图使用 swift 2.0将一些 JSON结构解析为内存映射 – 我一直在运行这个问题.它第一次发生时,我认为这只是我做过的一些奇怪的事情,但它只是因为同样的原因再次发生,所以很明显我得
我已经创建了两个单元测试来演示.第一个(testFails)为字典赋值,然后使用嵌套结构的句柄构建子值.第二个(testWorks)总是取消引用顶级字典的完整路径并构建它.第二个版本总是有效,但第一个版本永远不会.我能想到的唯一的事情是(1),字典正在复制对子地图(subMap)的引用,或者(2)正在发生与可选项有关的东西.
对我来说都没有意义,而XCode中的调试器糟透了,它没有显示结构的值.调试器说0键/对,但当我打印计数时,我得到一个值,所以这是没用的. E.G.,在testWorks中的XCTAssertEqual行上设置断点,调试器有时会说变量’map’包含0个键/值对,有时只显示任何内容 – 即使那里显然有一个键/值对.
在一个方面(新手)注意,我发现自己在这个非常“现代”的环境中使用print语句,因为XCode调试器失败很多 – 它向我显示没有数据或完全是外来的东西. E.G.,在Java中我可以检查不同变量的引用地址并清除代理/副本的时间,但我不能在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 Collectiontypes(数组,字典等)不是对象,它们是结构.
所以当map [“map”] = subMap时; map将获取subMap中的所有信息并将其放在键“map”下,注意对subMap的引用不会放在键“map”下.
因此,当您稍后在键“1”下添加值时,您不会将其添加到map [“map”]下的值,而是仅将其添加到subMap.
那么当你尝试访问“map”值时,它将包含在你的情况下设置为“map”时所包含的subMap为空.
希望我没有混淆你,术语不是我最聪明的一面.