当前位置 : 主页 > 手机开发 > 其它 >

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

来源:互联网 收集:自由互联 发布时间:2021-06-11
我试图使用 swift 2.0将一些 JSON结构解析为内存映射 – 我一直在运行这个问题.它第一次发生时,我认为这只是我做过的一些奇怪的事情,但它只是因为同样的原因再次发生,所以很明显我得
我试图使用 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为空.

希望我没有混淆你,术语不是我最聪明的一面.

网友评论