在改变它们的同时传递JSON对象

时间:2016-06-20 14:45:07

标签: ios json swift swifty-json

如何在原始引用更新的同时构建一个可以由多个处理程序传递和变异的JSON对象?

JSON由Swift中的Dictionary和Array支持,它们都是Struct数据结构。根据定义,结构是逐个复制的。

这是我编写的一个简单的单元测试

func testMutatingJson() {
    // Test
    var json: JSON = [
        "dict": [String: AnyObject]()
    ]

    json["dict"]["A"] = JSON(["key1": "value1"])
    json["dict"]["A"]["B"] = JSON(["key2": "value2"])

    XCTAssertEqual(json["dict"]["A"]["B"], JSON(["key2": "value2"]))

    let wrapper = Wrapper(json: json["dict"])
    wrapper.doSomething()

    // FAIL: This will fail since json["dict"]["A"]["B"] was copied into `Wrapper`
    XCTAssertEqual(json["dict"]["A"]["B"]["C"], JSON(["key3": "value3"]))
}

class Wrapper {

    var json: JSON

    init(json: JSON) {
        self.json = json["A"]["B"]
    }

    func doSomething() {
        self.json["C"] = JSON(["key3", "value3"])
    }

}

我需要修改原始JSON对象,然后在doSomething()之后再次处理。

我认为我最好的选择是编写自己的JSON类,该类由NSMutableDictionary和NSMutableArray支持。还有其他选择吗?

1 个答案:

答案 0 :(得分:0)

你已经有了解决方案,基本上 - 创建一个包装器对象,它为所包含的JSON结构提供引用语义。您也可以重构代码,这样就不会保留JSON对象的额外副本。