मेरी ज़रूरतें अलग थीं, मैं विलीन होना चाहता था और क्लोब नहीं करना चाहता था।
merging:
["b": [1, 2], "s": Set([5, 6]), "a": 1, "d": ["x": 2]]
with
["b": [3, 4], "s": Set([6, 7]), "a": 2, "d": ["y": 4]]
yields:
["b": [1, 2, 3, 4], "s": Set([5, 6, 7]), "a": 2, "d": ["y": 4, "x": 2]]
मैं एक सरल समाधान की उम्मीद कर रहा था, लेकिन यह वही है जो मैंने खत्म किया। यह चुनौती डायनेमिक टाइपिंग से स्टैटिक टाइपिंग तक पहुंचने में थी, और मैंने इसे हल करने के लिए प्रोटोकॉल का इस्तेमाल किया।
यह भी ध्यान देने योग्य है कि जब आप शाब्दिक वाक्य-विन्यास का उपयोग करते हैं, तो आपको वास्तव में नींव के प्रकार मिलते हैं, जो प्रोटोकॉल एक्सटेंशन को नहीं लेते हैं। मैंने संग्रह के तत्वों की एकरूपता को मान्य करने के लिए आसान नहीं होने के कारण उन लोगों के समर्थन के अपने प्रयासों को समाप्त कर दिया।
import UIKit
private protocol Mergable {
func mergeWithSame<T>(right: T) -> T?
}
public extension Dictionary {
func merge(right:Dictionary) -> Dictionary {
var merged = self
for (k, rv) in right {
if let lv = self[k] {
if let lv = lv as? Mergable where lv.dynamicType == rv.dynamicType {
let m = lv.mergeWithSame(rv)
merged[k] = m
}
else if lv is Mergable {
assert(false, "Expected common type for matching keys!")
}
else if !(lv is Mergable), let _ = lv as? NSArray {
assert(false, "Dictionary literals use incompatible Foundation Types")
}
else if !(lv is Mergable), let _ = lv as? NSDictionary {
assert(false, "Dictionary literals use incompatible Foundation Types")
}
else {
merged[k] = rv
}
}
else {
merged[k] = rv
}
}
return merged
}
}
extension Array: Mergable {
func mergeWithSame<T>(right: T) -> T? {
if let right = right as? Array {
return (self + right) as? T
}
assert(false)
return nil
}
}
extension Dictionary: Mergable {
func mergeWithSame<T>(right: T) -> T? {
if let right = right as? Dictionary {
return self.merge(right) as? T
}
assert(false)
return nil
}
}
extension Set: Mergable {
func mergeWithSame<T>(right: T) -> T? {
if let right = right as? Set {
return self.union(right) as? T
}
assert(false)
return nil
}
}
var dsa12 = Dictionary<String, Any>()
dsa12["a"] = 1
dsa12["b"] = [1, 2]
dsa12["s"] = Set([5, 6])
dsa12["d"] = ["c":5, "x": 2]
var dsa34 = Dictionary<String, Any>()
dsa34["a"] = 2
dsa34["b"] = [3, 4]
dsa34["s"] = Set([6, 7])
dsa34["d"] = ["c":-5, "y": 4]
let mdsa3 = dsa12.merge(dsa34)
print("merging:\n\t\(dsa12)\nwith\n\t\(dsa34) \nyields: \n\t\(mdsa3)")