Передача объектов JSON при их изменении

Как вы можете создать объект JSON, который может передаваться и изменяться несколькими обработчиками, пока исходная ссылка обновляется?

JSON поддерживается Dictionary и Array в Swift, которые являются 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. Есть ли другой вариант?


person mdupls    schedule 20.06.2016    source источник
comment
json != wrapper.json Вы изменяете объект в оболочке, но затем тестируете вариант в testMutatingJson.   -  person Eric Aya    schedule 20.06.2016
comment
Точно. Дело в том, что Dictionary и Array являются структурными типами. Который вы не можете пройти по ссылке.   -  person mdupls    schedule 20.06.2016
comment
Дело в том, чтобы проверить, изменен ли исходный объект JSON (я знаю, что не будет, но я пытался проиллюстрировать свои намерения). Я предполагаю, что мой единственный вариант - написать эквивалент SwiftyJSON, поддерживаемый NSMutableDictionary и NSMutableArray, вместо структур Swift.   -  person mdupls    schedule 20.06.2016
comment
Да, это именно то, что я имел в виду своим вторым комментарием. У вас не может быть такого эталонного поведения с SwiftyJSON по тем же причинам, которые вы указали в своем вопросе. Таким образом, вы должны либо протестировать измененную копию, либо изменить свою стратегию и вместо этого использовать классы.   -  person Eric Aya    schedule 20.06.2016


Ответы (1)


По сути, у вас уже есть решение — создайте объект-оболочку, который предоставляет ссылочную семантику для вложенной структуры JSON. Вы также можете реорганизовать свой код, чтобы не хранить лишние копии объекта JSON.

person Mark Bessey    schedule 20.06.2016
comment
Я бы не смог использовать структуру для JSON, так как тогда я столкнулся бы с той же проблемой, если бы какие-либо дочерние элементы были переданы и изменены. Я пытаюсь портировать большую библиотеку JS, которая злоупотребляет тем фактом, что json передается по ссылке. - person mdupls; 24.06.2016