2015-11-03 29 views
4

我想解析一些JSON結構到內存映射使用swift 2.0 - 我一直運行這個問題。第一次發生時,我認爲這只是我做過的一件奇怪的事情,但它也是因爲同樣的原因再次發生的,所以顯然我沒有得到。Swift 2.0初始化嵌套字典不工作,因爲我預期

我創建了兩個演示單元測試。第一個(testFails)爲字典賦值,然後使用嵌套結構的句柄構建子值。第二個(testWorks)總是取消引用頂級字典的完整路徑並構建它。第二個版本總是有效,但第一個永遠不會。我能想到的唯一的事情是(1),字典正在複製引用到子映射(subMap),或者(2)與可選項發生的事情。

這對我來說都沒有什麼意義,XCode中的調試器很糟糕,它不會顯示結構的值。調試器說0鍵/對,但是當我打印計數時,我得到一個值,所以這是沒用的。 E.G.在testWorks中的XCTAssertEqual線上放置了一個斷點,調試器有時會說變量'map'包含0個鍵/值對,有時甚至不顯示任何內容 - 即使內部有一個鍵/值對。我發現自己在這個非常'現代'的環境中使用打印語句,因爲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"]); 
} 

回答

0

夫特CollectiontypesArraysDictionaries等)不對象,它們是結構。

所以當map["map"] = subMap;map將採取內部subMap所有信息,並把它放在關鍵"map",注意參考subMap沒有在關鍵"map"放。

因此,當您稍後在密鑰"1"下添加一個值時,您並未將其添加到map["map"]下的值,您只將其添加到subMap

因此,當您嘗試訪問"map"值時,它將包含什麼subMap包含在您的案件設置爲"map"爲空。

希望我沒有混淆你,術語不是我最聰明的一面。

+0

好的 - 我可能會理解你的觀點。所以這在NSDictionary中的聲明:'公共下標(鍵:NSCopying) - > AnyObject? {get}'意味着下標操作符執行深層複製而非分配? – absmiths

+0

你正在使用Dictionary而不是NSDictionary,它們不是一回事。 NSDictionary是一個對象,並將按照您期望的方式在testFails()中工作,但它們不支持泛型,並且始終將返回值作爲NSObject – Arbitur

+0

我不想從這個問題得到太遠的地方,但這是否意味着我不需要明確地初始化子樹? E.G.,如果它不存在,'map [「map」] [「key」] =「value」'是否會自動爲「map」創建子樹?如果是這樣,明確的分配會創建一個不必要的中間對象。我嘗試從testWorks中刪除第二行,它仍然有效,這意味着我的假設是真實的。 – absmiths