2016-06-20 4 views
1

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

JSON опирается на словарь и массив в 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. Есть ли другой вариант?

+1

'json'! =' Wrapper.json' Вы изменяете одно в обертке, но затем вы тестируете одно в testMutatingJson. – Moritz

+0

Точно. Точка, словарь и массив - это типы структур. Который вы не можете пройти по ссылке. – mdupls

+0

Дело в том, чтобы проверить, изменен ли исходный объект JSON (я знаю, что этого не будет, но я пытался проиллюстрировать свои намерения). Я полагаю, что мой единственный вариант - написать эквивалент SwiftyJSON, который поддерживается NSMutableDictionary и NSMutableArray, а не строками Swift. – mdupls

ответ

0

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

+0

Я бы не смог использовать структуру для JSON, так как тогда я столкнулся бы с той же проблемой, если бы какие-либо дети проходили и мутировали. Я пытаюсь перенести большую библиотеку JS, которая злоупотребляет фактом, что json является передачей по ссылке. – mdupls