2017-03-07 61 views
0

我有一個嵌套字典,其中深層節點是一個數組。當我嘗試追加一個元素到字典的數組元素時,我得到一個編譯錯誤。我試圖要取代如何將元素追加到嵌套字典中的數組中

[「000」:「OK」]

如果密鑰是相同的「000」或附加到現有的元素,如果關鍵是不同的,例如如在

[ 「001」: 「好」]

。欣賞一些指導或更新方法。我得到的錯誤是:

無法在類型的不可變的值使用可變成員「[[字符串: 字符串]」

B = [ "EA" : [ "status": [["000": "OK"]]]] 
B["EA"]?["status"] = [["000": "NOT OK"]] 
print(B) 

(B["EA"]?["status"])?.append(["001":"Good"]) 
+1

的可能的複製[如何追加到一個數組,它是一個值在Swift詞典中](http://stackoverflow.com/questions/28376067/how-to-append-to-an-array-that-is-a-value-in-a-swift-dictionary) – matt

+0

只需刪除括號 - 'b [「EA」]?[「status」]?。append([「001」:「Good」])'。雖然請注意這不是特別有效,因爲我相信數組和內部字典都將被複制。有關避免這種情況的方法,請參閱http://stackoverflow.com/q/41079687/2976878。 – Hamish

+0

但實際上,使用帶字典數組值的字典詞典幾乎肯定表明您應該使用其他數據結構。如果你的字典有靜態鍵,它們應該是結構。 – Hamish

回答

1

你做同樣的方式超人進入他的褲子 - 一次一條腿。拉出數組,然後再將其放回去:

var B = [ "EA" : [ "status": [["000": "OK"]]]] 
B["EA"]?["status"] = [["000": "NOT OK"]] 

print(B) // ["EA": ["status": [["000": "NOT OK"]]]] 

if var arr = B["EA"]?["status"] { 
    arr.append(["001":"Good"]) 
    B["EA"]?["status"] = arr 
} 

print(B) // ["EA": ["status": [["000": "NOT OK"], ["001": "Good"]]]] 
+0

Matt - 感謝您提供清晰的示例,並感謝您在IOS 10上的圖書,我一直試圖用它作爲我尋求答案的第一步。我想我應該更仔細地閱讀你的書,但其中有很多東西,對我來說很難跟上。 –

+0

不幸的是我的「超人的褲子」笑話也在書中某處!我可能需要更好的笑話。 – matt

1

因爲Swift中的字典和數組都是struct類型。
可以使B「S型explicit.Like:

var B:[String:[String:NSMutableArray]] = [ "EA" : [ "status": [["000": "OK"]]]] 
B["EA"]?["status"] = [["000": "NOT OK"]] 
print(B) 
//["EA": ["status":{ 
// 000 = "NOT OK"; 
// } 
// ]] 

然後你可以使用NSMutableArray的方法Add()

(B["EA"]?["status"])?.add(["001":"Good"]) 
print(B) 
//["EA": ["status":{ 
// 000 = "NOT OK"; 
// }, 
// { 
// 001 = Good; 
// } 
// ]] 
+0

這非常有用。謝謝(你的)信息。 –