Как вы можете создать объект 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. Есть ли другой вариант?
'json'! =' Wrapper.json' Вы изменяете одно в обертке, но затем вы тестируете одно в testMutatingJson. – Moritz
Точно. Точка, словарь и массив - это типы структур. Который вы не можете пройти по ссылке. – mdupls
Дело в том, чтобы проверить, изменен ли исходный объект JSON (я знаю, что этого не будет, но я пытался проиллюстрировать свои намерения). Я полагаю, что мой единственный вариант - написать эквивалент SwiftyJSON, который поддерживается NSMutableDictionary и NSMutableArray, а не строками Swift. – mdupls