Hello,
I wrote a Dictionary extension in Swift (2.0 Beta 2) that compare two Dictionaries and return a tuple with the modified, inserted and deleted values between them :
extension Dictionary where Key: Hashable, Value: Equatable {
func compareToOld (oldDictionary:[Key:Value]) -> (deleted: [Key: Value], modifiedOldValues: [Key: Value], modifiedNewValues: [Key: Value], inserted: [Key: Value]) {
if oldDictionary.count == 0 {
return ([Key: Value](), [Key: Value](), [Key: Value](), self)
}
if self.count == 0 {
return (oldDictionary, [Key: Value](), [Key: Value](), [Key: Value]())
}
var valuesToAdd = [Key: Value]()
var valuesToModifyNewValues = [Key: Value]()
var valuesToModifyOldValues = [Key: Value]()
var valuesToDelete = [Key: Value]()
for (k, v) in oldDictionary {
if self.keys.array.contains(k) == false {
valuesToDelete.updateValue(v, forKey: k)
}
}
for (k, v) in self {
if let obj = oldDictionary[k] {
if v != obj {
valuesToModifyNewValues.updateValue(v, forKey: k)
valuesToModifyOldValues.updateValue(obj, forKey: k)
}
} else {
valuesToAdd.updateValue(v, forKey: k)
}
}
return (valuesToDelete, valuesToModifyOldValues, valuesToModifyNewValues, valuesToAdd)
}
}It works perfectly with a [String: String] dictionary
var d = ["k1": "v1", "k2": "v2", "k3": "v3"]
var d1 = ["k1": "v1", "k2": "v2a", "k4": "v4"]
let r = d1.compareToOld(d)
r.deleted // Return ["k3": "v3"]
r.inserted // Return ["k4": "v4"]
r.modifiedNewValues // Return ["k2": "v2a"]
r.modifiedOldValues // Return ["k2": "v2"]But it's not working with a [String: [String]] dictionary :
var d = ["k1": ["v1"], "k2": ["v2"], "k3": ["v3"]]
var d1 = ["k1": ["v1"], "k2": ["v2a"], "k4": ["v4"]]
let r = d1.compareToOld(d)
r.deleted
r.inserted
r.modifiedNewValues
r.modifiedOldValuesI have the following error :
cannot invoke 'compareToOld' with an argument list of type '([String : Array<String>])'
let r = d1.compareToOld(d)
Or, as we can see in these lines before, [String] is conform to Equatable :
var a1 = ["v1"]
var a2 = ["v1"]
var a3 = ["v2"]
a1 == a2 // Return true
a1 == a3 // Return falseAm I missing something ?
Thanks in advance for your feedback,
Kind Regards,
Alexis.