在斯卡拉,+ (k -> v)
運營商immutable.Map
返回一個新的immutable.Map
與原來的內容,再加上新的鍵/值對。同樣,在C#中,ImmutableDictionary.add(k, v)
返回一個新的更新的ImmutableDictionary
。如何「附加」到Swift中的不可變字典?
但是,在Swift中,Dictionary
似乎只有變異的updateValue(v, forKey: k)
函數和變異的[k:v]
運算符。
我想也許我可以玩一些把戲與flatten()
,但沒有運氣:
let updated = [original, [newKey: newValue]].flatten()
讓我
Cannot convert value of type '() -> FlattenCollection<[[String : AnyObject]]>'
to specified type '[String : AnyObject]'
如何創建一個新的,從一個內容修改不可改變Dictionary
現有的?
更新:基於this answer的注意,斯威夫特的字典是值類型,並this answer的可變版本,我想出了下面的擴展操作,但我並不感到興奮 - 似乎必須有一個更清潔的替代方案。
func + <K, V>(left: [K:V], right: [K:V]) -> [K:V] {
var union = left
for (k, v) in right {
union[k] = v
}
return union
}
但也許事實(如果我理解正確)是斯威夫特字典的不變性是let
編譯器檢查,而不是不同的實現類的問題意味着這是可以做的最好?
更新#2:如Jules's answer指出,修改未具體優化以拷貝之間共享狀態不變的詞典(如夫特字典都沒有)呈現性能問題。對於我目前的用例(AttributedString
屬性字典,它往往很小),它仍然可以簡化某些足以值得做的事情,但直到Swift實現共享狀態不可變字典之前,它可能不是一個好主意案例 - 這是一個不把它作爲內置功能的好理由。
看起來像某人正在建立一個圖書館來做到這一點https://github.com/tLewisII/ImStructures(免責聲明:我沒有審查過它。) –
* Swift詞典的不變性是編譯器檢查[。 ..]不同的實現類*這是錯誤的。字典是作爲結構實現的,意味着它們(基本上)是通過複製傳遞的。存儲在'let'變量中的任何結構值都是不可變的,因此您不能在其上調用'mutating'方法,因爲它們會更改值。如果將一個字典(任何結構)賦值給一個'var'變量,它就會被複制!然後你有一個新的內存位置不同的字典。 – idmean