আপনি কীভাবে অন্য অভিধানে আইটেমের একটি অভিধান যুক্ত করবেন


172

সুইফটে অ্যারেগুলি একটি অ্যারের সামগ্রী অন্যটিতে যুক্ত করতে + = অপারেটরকে সমর্থন করে। অভিধানের জন্য এটি করার সহজ উপায় কি আছে?

উদাহরণ:

var dict1 = ["a" : "foo"]
var dict2 = ["b" : "bar"]

var combinedDict = ... (some way of combining dict1 & dict2 without looping)


fromDict.forEach {intoDict[$0] = $1}
সাজ্জাদ হিশাইন খান

উত্তর:


171

আপনি এর +=জন্য অপারেটরটি সংজ্ঞায়িত করতে পারেন Dictionary, যেমন,

func += <K, V> (left: inout [K:V], right: [K:V]) { 
    for (k, v) in right { 
        left[k] = v
    } 
}

1
ওহ মানুষ, আমি এর জন্য যথাযথ জেনেরিক ঘোষণাটি খুঁজে পেয়ে অনেক লড়াই করেছি, আমি এগুলি বাদ দিয়ে সবকিছুই চেষ্টা করেছি। তবে আপনি @assignmentএবং ড্রপ করতে পারেন return, আপনি ইতিমধ্যে বাম পরিবর্তন করছেন। সম্পাদনা করুন: আসলে, যদিও আমি কোনও ত্রুটি না পেয়েও আমার মনে হয় @assignmentএটি থাকা উচিত।
রোল্যান্ড

14
আরও বাক্য গঠন চিনি: func +=<K, V> (inout left: [K : V], right: [K : V]) { for (k, v) in right { left[k] = v } }
ইভান ভ্যাভিলভ

48
@animal_chin কারণ আমাদের নিজের অর্ধেক ভাষা প্রয়োগ করতে হবে? হ্যাঁ. অঙ্কিত। আমাকে ভুল করবেন না আমি অপারেটর ওভারলোডিং পছন্দ করি। আমি শুধু মৌলিক বৈশিষ্ট্য যে সালে নির্মিত হবে জন্য এটি ব্যবহার না করতে থাকার ভালোবাসি।
devios1

2
@ দেভিওস হাহা তারপরে এটিকে সুইফ্ট রেপোর কাছে টানতে অনুরোধ করুন: ডি যেহেতু আপেলকে আর্স করা যায় না
CommaToast

6
সোয়েটার সুইফট লাইব্রেরি থেকে সোজা টানা :public static func +=(lhs: inout [Key: Value], rhs: [Key: Value]) { rhs.forEach({ lhs[$0] = $1}) }
জাস্টিন ওরজ

99

সুইফ্ট 4-এ, একটি ব্যবহার করা উচিত merging(_:uniquingKeysWith:):

উদাহরণ:

let dictA = ["x" : 1, "y": 2, "z": 3]
let dictB = ["x" : 11, "y": 22, "w": 0]

let resultA = dictA.merging(dictB, uniquingKeysWith: { (first, _) in first })
let resultB = dictA.merging(dictB, uniquingKeysWith: { (_, last) in last })

print(resultA) // ["x": 1, "y": 2, "z": 3, "w": 0]
print(resultB) // ["x": 11, "y": 22, "z": 3, "w": 0]

1
// পরিবর্তনযোগ্য: var ডিকোয়া = ["x": 1, "y": 2, "জেড": 3] ভার ডিকবি = ["x": 11, "y": 22, "ডাব্লু": 0] ডিকএ। মার্জ (ডিকবি, অনিকিংকিস উইথ: first (প্রথম, _) প্রথম}) মুদ্রণ (ডক্টা) // ["x": 1, "y": 2, "জেড": 3, "ডব্লু": 0]
মুথুকুমার

1
এই উত্তরে প্রদর্শিত দ্বিতীয় উদাহরণটির সমতুল্য [NSMutableDictionary addEntriesFromDictionary:]
orj

92

কেমন

dict2.forEach { (k,v) in dict1[k] = v }

এটি ডেট 2 এর সমস্ত কী এবং মানকে যুক্ত করে 1 1


43
সুন্দর সমাধান। সামান্য খাটো: dict2.forEach {dict1 [$ 0] = $ 1}
ব্রেট

1
এটি দুর্দান্ত সমাধান, তবে সুইফ্ট 4 এর জন্য, সম্ভবত আপনি উল্লেখ করে একটি ত্রুটি পাবেন Closure tuple parameter '(key: _, value: _)' does not support destructuring(কমপক্ষে এই লেখার সময়)। করুন [এই Stackoverflow উত্তর] (অনুযায়ী অবসান পুনর্বিন্যাস করতে হবে stackoverflow.com/questions/44945967/... :)
JonnyB

78

বর্তমানে, অভিধানের জন্য সুইফ্ট স্ট্যান্ডার্ড লাইব্রেরি রেফারেন্সের দিকে তাকানো, অন্য কোনওটির সাথে কোনও অভিধান সহজেই আপডেট করার উপায় নেই।

এটি করার জন্য আপনি একটি এক্সটেনশন লিখতে পারেন

var dict1 = ["a" : "foo"]
var dict2 = ["b" : "bar"]

extension Dictionary {
    mutating func update(other:Dictionary) {
        for (key,value) in other {
            self.updateValue(value, forKey:key)
        }
    }
}

dict1.update(dict2)
// dict1 is now ["a" : "foo", "b" : "bar]

3
এটি অভিধানের জন্য এক্সটেনশনের দুর্দান্ত ব্যবহার!
মার্ক অ্যাটিনিসি

76

সুইফট 4 সরবরাহ করে merging(_:uniquingKeysWith:), তাই আপনার ক্ষেত্রে:

let combinedDict = dict1.merging(dict2) { $1 }

শর্টহ্যান্ড $1ক্লোজারটি প্রত্যাবর্তন করে , তাই কীগুলির সাথে দ্বন্দ্ব থাকলে ডিক্ট 2 এর মান ব্যবহার করা হবে।


1
শুধু বাতলান যে এই সবচেয়ে সংক্ষিপ্ত এবং নিকটতম আমি কি অ্যাপল ডকুমেন্টেশন রাজ্যের পাওয়া যায় চেয়েছিলেন - (void)addEntriesFromDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;। সদৃশগুলির সাথে কী করবেন সে সম্পর্কে, এটি বলেছে যে: "যদি উভয় অভিধানই একই কী থাকে তবে সেই কীটির জন্য প্রাপ্ত অভিধানের পূর্ববর্তী মান অবজেক্টটি একটি রিলিজ বার্তা প্রেরণ করা হয় এবং নতুন মান বস্তুটি তার স্থান নেয় takes" সুতরাং সুইফট সংস্করণ বা মার্জটিতে (_: uniquingKeysWith :), দ্বিতীয় মানটি ফিরিয়ে দেওয়া $1, যা করে তা সমান addEntriesFromDictionary
টিম ফুকু 21

31

এটি সুইফট লাইব্রেরিতে নির্মিত হয়নি তবে আপনি অপারেটর ওভারলোডিংয়ের মাধ্যমে যা চান তা যোগ করতে পারেন, যেমন:

func + <K,V>(left: Dictionary<K,V>, right: Dictionary<K,V>) 
    -> Dictionary<K,V> 
{
    var map = Dictionary<K,V>()
    for (k, v) in left {
        map[k] = v
    }
    for (k, v) in right {
        map[k] = v
    }
    return map
}

এটি ডিকোরিয়ানের জন্য +অপারেটরটিকে ওভারলোড করে যা আপনি এখন +অপারেটরের সাথে অভিধান যুক্ত করতে ব্যবহার করতে পারেন , যেমন:

var dict1 = ["a" : "foo"]
var dict2 = ["b" : "bar"]

var dict3 = dict1 + dict2 // ["a": "foo", "b": "bar"]

1
আপনি এটি ++ জায়গায় ডিক (আপডেট প্রশ্নে) আপডেট করার জন্যও করতে পারেন।
রড

3
আপনি যদি প্যারামিটার হিসাবে ঘোষনা করেন এবং তারপরে মানগুলি অনুলিপি করেন তবে আপনি mapপ্রথম for (k, v)...লুপটি সরিয়ে ফেলতে পারেন। leftvarright
নেট কুক

2
@ নেটকুক যে অভিধানটি রূপান্তর করবে যা +ইনফিক্স অপারেটরের জন্য প্রত্যাশিত আচরণ নয় ।
পৌরাণিক

তার জন্য ধন্যবাদ. আপনার উত্তরটি আমি পোস্ট করা নমুনা কোডটির সাথে সম্ভবত আরও সঠিক ছিল, অন্যটি আমার প্রশ্নের ভিত্তিতে আমি যা চেয়েছিলাম তার চেয়ে বেশি ছিল। আমার খারাপ, যাইহোক আপনাকে উভয়ই একটি
উজ্জীবিত উপহার

2
@ মাইথজ এটি সত্যই পরিবর্তন করছে না, যেহেতু +অপারেটর ওভারলোড কোনও একটি পদ্ধতি নয় Dictionary, এটি একটি সাধারণ কাজ। আপনি একটি পরিবর্তনশীল leftপ্যারামিটারে পরিবর্তনগুলি ফাংশনের বাইরে দৃশ্যমান হবে না।
নেট কুক

28

সুইফট 3:

extension Dictionary {

    mutating func merge(with dictionary: Dictionary) {
        dictionary.forEach { updateValue($1, forKey: $0) }
    }

    func merged(with dictionary: Dictionary) -> Dictionary {
        var dict = self
        dict.merge(with: dictionary)
        return dict
    }
}

let a = ["a":"b"]
let b = ["1":"2"]
let c = a.merged(with: b)

print(c) //["a": "b", "1": "2"]

6
কিছুটা ভালfunc merged(with dictionary: Dictionary<Key,Value>) -> Dictionary<Key,Value> { var copy = self dictionary.forEach { copy.updateValue($1, forKey: $0) } return copy }
আলেকজান্ডার ভ্যাসেনিন

16

সুইফট ২.০

extension Dictionary {

    mutating func unionInPlace(dictionary: Dictionary) {
        dictionary.forEach { self.updateValue($1, forKey: $0) }
    }

    func union(var dictionary: Dictionary) -> Dictionary {
        dictionary.unionInPlace(self)
        return dictionary
    }
}

এর মতো একটি নন-
মিউটেশন

unionফাংশন মান সেটিকে একটি হতে অতিবাহিত হয়েছে var, কপি অভিধান অর্থ ভাবে পরিবর্তিত করা যেতে পারে। এটি func union(dictionary: Dictionary) -> Dictionary { var dict2 = dictionary; dict2.unionInPlace(self); return dict2 }কেবলমাত্র এক লাইনের চেয়ে কিছুটা পরিষ্কার clean
ম্যাডডেসনে

2
Var প্যারাম অবচিত এবং সুইফট 3. সরিয়ে ফেলা হবে এই কাজ করার পছন্দসই উপায় এখন শরীরে Var ঘোষণা করা: var dictionary = dictionary। এখান থেকে: github.com/apple/swift-evolution/blob/master/proposals/…
ড্যানিয়েল উড

জিনিসগুলিকে আরও টাইপ-নিরাপদ <Key, Value>করতে, Dictionaryসেগুলিতে যুক্ত করুন।
রাফেল

12

অপরিবর্তনীয়

আমি +অপারেটরের সাথে অপরিবর্তনীয় অভিধানগুলি একত্রিত / একত্রিত করতে পছন্দ করি তাই আমি এটির মতো প্রয়োগ করেছি:

// Swift 2
func + <K,V> (left: Dictionary<K,V>, right: Dictionary<K,V>?) -> Dictionary<K,V> {
    guard let right = right else { return left }
    return left.reduce(right) {
        var new = $0 as [K:V]
        new.updateValue($1.1, forKey: $1.0)
        return new
    }
}

let moreAttributes: [String:AnyObject] = ["Function":"authenticate"]
let attributes: [String:AnyObject] = ["File":"Auth.swift"]

attributes + moreAttributes + nil //["Function": "authenticate", "File": "Auth.swift"]    
attributes + moreAttributes //["Function": "authenticate", "File": "Auth.swift"]
attributes + nil //["File": "Auth.swift"]

চপল

// Swift 2
func += <K,V> (inout left: Dictionary<K,V>, right: Dictionary<K,V>?) {
    guard let right = right else { return }
    right.forEach { key, value in
        left.updateValue(value, forKey: key)
    }
}

let moreAttributes: [String:AnyObject] = ["Function":"authenticate"]
var attributes: [String:AnyObject] = ["File":"Auth.swift"]

attributes += nil //["File": "Auth.swift"]
attributes += moreAttributes //["File": "Auth.swift", "Function": "authenticate"]

5
আমি বুঝতে পারি না কেন এটি ডিফল্টরূপে দ্রুত রূপে তৈরি হয় না?
ioquatix

1
আপনি কি "অপরিবর্তনীয়" সমাধানটিতে ডানদিকে ওভাররাইড করতে বাম থেকে মানগুলি চান? আমি মনে করি আপনার বোঝাতে চাইছেন right.reduce(left), কমপক্ষে এটি প্রত্যাশিত আচরণ ইমো (এবং এটি আপনার দ্বিতীয় উদাহরণের আচরণ) - অর্থাৎ ie ["A":1] + ["A":2]আউটপুট করা উচিত["A":2]
ccwasden

আউটপুট কোডের সাথে মিলে যায়। আমি চাই যে প্রাথমিক মানটি এখনই ঠিক ডান দিকের হতে হবে।
রিচার্ডোপেরির

12

এখন কোনও অভিধান এক্সটেনশন থাকার দরকার নেই। সুইফ্ট (এক্সকোড 9.0+) অভিধান এর জন্য কার্যকারিতা পেয়েছে। এখানে দেখুন । নীচে এটি কীভাবে ব্যবহার করতে হয় তার একটি উদাহরণ দেওয়া আছে

  var oldDictionary = ["a": 1, "b": 2]
  var newDictionary = ["a": 10000, "b": 10000, "c": 4]

  oldDictionary.merge(newDictionary) { (oldValue, newValue) -> Int in
        // This closure return what value to consider if repeated keys are found
        return newValue 
  }
  print(oldDictionary) // Prints ["b": 10000, "a": 10000, "c": 4]

2
আমি উপরের উদাহরণের জন্য একটি কার্যকরী শৈলী যুক্ত করছি:oldDictionary.merge(newDictionary) { $1 }
আন্দ্রেজ

11

একটি এক্সটেনশন ব্যবহার করে আরও পঠনযোগ্য বৈকল্পিক।

extension Dictionary {    
    func merge(dict: Dictionary<Key,Value>) -> Dictionary<Key,Value> {
        var mutableCopy = self        
        for (key, value) in dict {
            // If both dictionaries have a value for same key, the value of the other dictionary is used.           
            mutableCopy[key] = value 
        }        
        return mutableCopy
    }    
}

3
খুব সুন্দর এবং পরিষ্কার সমাধান!
ব্যবহারকারী 3441734

11

আপনি এটি চেষ্টা করতে পারেন

var dict1 = ["a" : "foo"]
var dict2 = ["b" : "bar"]

var temp = NSMutableDictionary(dictionary: dict1);
temp.addEntriesFromDictionary(dict2)

10

এগুলি মার্জ করার জন্য আপনি হ্রাসও ব্যবহার করতে পারেন। খেলার মাঠে এটি চেষ্টা করুন

let d1 = ["a":"foo","b":"bar"]
let d2 = ["c":"car","d":"door"]

let d3 = d1.reduce(d2) { (var d, p) in
   d[p.0] = p.1
   return d
}

এটি আকর্ষণীয় দেখাচ্ছে, কিন্তু কি dএবং কি p?
ছিনতাই

1
d হ্রাস ব্লকের প্রতিটি পুনরাবৃত্তির অবিরাম ফলাফল এবং p হ্রাস হ্রাসের সংগ্রহের উপাদান।
ফরহাদফ

1
এই দ্রুত বিপর্যস্ত বলে মনে হয় 3.0 বিটা
possen

var পরামিতিগুলি দ্রুত 3
অবহিত করা হয়

এখানে উল্লিখিত বিষয়গুলির মধ্যে এটি আমার প্রিয় সমাধান। দুর্দান্ত সংক্ষিপ্ত সমাধানের জন্য ফিল্টার / মানচিত্র / পুনরায় জয় হ্রাস করুন।
gokeji

7

আমি সুইফটার সুইফট লাইব্রেরিটি সুপারিশ করি । তবে, আপনি যদি পুরো লাইব্রেরি এবং এর সমস্ত দুর্দান্ত সংযোজনগুলি ব্যবহার করতে না চান তবে আপনি কেবল তাদের অভিধানের প্রসারকে ব্যবহার করতে পারেন:

সুইফট 3+

public extension Dictionary {
    public static func +=(lhs: inout [Key: Value], rhs: [Key: Value]) {
        rhs.forEach({ lhs[$0] = $1})
    }
}

প্রকৃতপক্ষে, এসই -1101 উল্টানো হয়েছে, তাই সুইফট 4 সংস্করণটি সুইফট 3 সংস্করণের মতো হওয়া উচিত।
বলপয়েন্টবেন 16

5

আপনি কী মান সংমিশ্রণগুলির ওপরে পুনরুক্তি করতে পারেন মানটি যা আপনি মার্জ করতে চান এবং আপডেটভ্যালু (ফোরকি :) পদ্ধতির মাধ্যমে এগুলি যুক্ত করতে চান:

dictionaryTwo.forEach {
    dictionaryOne.updateValue($1, forKey: $0)
}

এখন অভিধানের সমস্ত মান দুটি অভিধানে যুক্ত হয়েছে।


4

@ ফরহাদফের উত্তর হিসাবে একই তবে সুইফট 3 এর জন্য গৃহীত:

let sourceDict1 = [1: "one", 2: "two"]
let sourceDict2 = [3: "three", 4: "four"]

let result = sourceDict1.reduce(sourceDict2) { (partialResult , pair) in
    var partialResult = partialResult //without this line we could not modify the dictionary
    partialResult[pair.0] = pair.1
    return partialResult
}

4

সুইফট 3, অভিধান এক্সটেনশন:

public extension Dictionary {

    public static func +=(lhs: inout Dictionary, rhs: Dictionary) {
        for (k, v) in rhs {
            lhs[k] = v
        }
    }

}

4

সুইফট 4 এর জন্য আরও কিছু প্রবাহিত ওভারলোডগুলি:

extension Dictionary {
    static func += (lhs: inout [Key:Value], rhs: [Key:Value]) {
        lhs.merge(rhs){$1}
    }
    static func + (lhs: [Key:Value], rhs: [Key:Value]) -> [Key:Value] {
        return lhs.merging(rhs){$1}
    }
}

3

আপনি Dictionaryএটির মতো একটি এক্সটেনশন যুক্ত করতে পারেন :

extension Dictionary {
    func mergedWith(otherDictionary: [Key: Value]) -> [Key: Value] {
        var mergedDict: [Key: Value] = [:]
        [self, otherDictionary].forEach { dict in
            for (key, value) in dict {
                mergedDict[key] = value
            }
        }
        return mergedDict
    }
}

তারপরে ব্যবহারগুলি নিম্নলিখিতগুলির মতো সহজ :

var dict1 = ["a" : "foo"]
var dict2 = ["b" : "bar"]

var combinedDict = dict1.mergedWith(dict2)
// => ["a": "foo", "b": "bar"]

আপনি যদি এমন কোনও কাঠামো পছন্দ করেন যা এতে আরও কিছু সুবিধাজনক বৈশিষ্ট্য অন্তর্ভুক্ত করে তবে হ্যান্ডি সুইফট চেকআউট করুন । কেবল এটি আপনার প্রকল্পে আমদানি করুন এবং আপনি নিজে প্রকল্পের কোনও এক্সটেনশান যুক্ত না করে উপরের কোডটি ব্যবহার করতে পারেন ।


একটি একক ফাংশন ব্যবহারের জন্য একটি লাইব্রেরি ইনস্টল করা খারাপ অভ্যাস
হ্যাকাজ্যাচ

@ হ্যাকাজাচ: কেবলমাত্র এই সামান্য অংশের প্রয়োজন হলে পুরো লাইব্রেরির অন্তর্ভুক্তি রোধ করার জন্য কাঠামোর উপযুক্ত অংশটি অন্তর্ভুক্ত করার জন্য আমি আমার উত্তরটি আপডেট করেছি। আমি এর বৈশিষ্ট্যগুলির একাধিকটি ব্যবহার করতে চাই এমন লোকদের জন্য কাঠামোর প্রতি ইঙ্গিতটি রাখছি। আমি আশা করি এটি ভাল অনুশীলন রাখতে সহায়তা করে!
জিহুত

3

আর কোনও এক্সটেনশন বা কোনও অতিরিক্ত ফানকের প্রয়োজন নেই। আপনি এটি লিখতে পারেন:

firstDictionary.merge(secondDictionary) { (value1, value2) -> AnyObject in
        return object2 // what you want to return if keys same.
    }


1

অভিধানকে এনএসডিকোরিয়ায় পরিণত করতে আপনি ব্রিজটিওবজেক্টিভ () ফাংশনটি ব্যবহার করতে পারেন।

নিম্নলিখিতগুলির মতো হবে:

var dict1 = ["a":"Foo"]
var dict2 = ["b":"Boo"]

var combinedDict = dict1.bridgeToObjectiveC()
var mutiDict1 : NSMutableDictionary! = combinedDict.mutableCopy() as NSMutableDictionary

var combineDict2 = dict2.bridgeToObjectiveC()

var combine = mutiDict1.addEntriesFromDictionary(combineDict2)

তারপরে আপনি এনএসডেটরিয় (সংযুক্ত) ফিরে রূপান্তর করতে পারেন বা যা কিছু করতে পারেন।


দুঃখিত তুমি ঠিক কী বোঝাতে চাও?
আন্তন

শুধু একটি পছন্দ। ভাষার মধ্যে সেতুবন্ধিত বলে মনে হচ্ছে। একক ভাষার সীমানার মধ্যে থাকা আরও ভাল, একই সাথে আপত্তি-সি দ্রুত মারা যায়।
TruMan1

2
হ্যাঁ, সুইফট ঘোষণার দিন আমি আক্ষরিকভাবে এই উত্তরটি পোস্ট করেছি ....... সুতরাং একটি কারণ ছিল
আন্তন

1
import Foundation

let x = ["a":1]
let y = ["b":2]

let out = NSMutableDictionary(dictionary: x)
out.addEntriesFromDictionary(y)

ফলাফলটি একটি এনএস পরিবর্তনযোগ্য ডিকশনারিটি একটি সুইফ্ট টাইপড অভিধান নয়, তবে এটির ব্যবহারের বাক্য গঠন একই ( out["a"] == 1এই ক্ষেত্রে) তাই আপনি যদি কেবল তৃতীয় পক্ষের কোড ব্যবহার করেন যা কোনও সুইফট অভিধানের প্রত্যাশা করে তবেই আপনার সমস্যা হবে or টাইপ চেকিং প্রয়োজন।

এখানে সংক্ষিপ্ত উত্তরটি হ'ল আপনাকে লুপ করতে হবে। এমনকি আপনি যদি এটিকে স্পষ্টভাবে প্রবেশ না করে থাকেন তবে, আপনি যে পদ্ধতিটি কল করছেন সেটিই (addEntriesFromD शब्दकोष: এখানে) করবে। আমি আপনাকে পরামর্শ দিচ্ছি যদি আপনি কেন কিছুটা অস্পষ্ট হন তবে কেন আপনি কেন দুটি বি-গাছের পাতার নোডগুলিকে মার্জ করবেন তা বিবেচনা করা উচিত।

যদি সত্যিকার অর্থে আপনার কাছে কোনও সুইফ্ট নেটিভ ডিকশনারি টাইপের দরকার হয় তবে আমি প্রস্তাব দেব:

let x = ["a":1]
let y = ["b":2]

var out = x
for (k, v) in y {
    out[k] = v
}

এই পদ্ধতির খারাপ দিকটি হ'ল অভিধান সূচকটি - তবে এটি শেষ হয়ে গেছে - লুপটিতে বেশ কয়েকবার পুনর্নির্মাণ করা যেতে পারে, সুতরাং অনুশীলনে এটি NSMutableD অভিধান পদ্ধতির চেয়ে প্রায় 10x ধীর।


1

এই প্রতিক্রিয়াগুলির সমস্ত জটিল। এটি সুইফট ২.২ এর জন্য আমার সমাধান:

    //get first dictionnary
    let finalDictionnary : NSMutableDictionary = self.getBasicDict()
    //cast second dictionnary as [NSObject : AnyObject]
    let secondDictionnary : [NSObject : AnyObject] = self.getOtherDict() as [NSObject : AnyObject]
    //merge dictionnary into the first one
    finalDictionnary.addEntriesFromDictionary(secondDictionnary) 

দুর্ভাগ্যক্রমে এটি কেবল এনএসগত পরিবর্তনশীল অভিধানে এবং নেটিভ সুইফট অভিধানে কাজ করে না। আমি ইচ্ছা করি এটি স্থানীয়ভাবে সুইফটে যুক্ত হত।
ক্রিস প্যাভগ্লিও 18

0

আমার চাহিদাগুলি আলাদা ছিল, আমার ক্লোবারবারিং ছাড়াই অসম্পূর্ণ নেস্টেড ডেটা সেটগুলিকে একীভূত করতে হবে।

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 {

    /**
    Merge Dictionaries

    - Parameter left: Dictionary to update
    - Parameter right:  Source dictionary with values to be merged

    - Returns: Merged dictionay
    */


    func merge(right:Dictionary) -> Dictionary {
        var merged = self
        for (k, rv) in right {

            // case of existing left value
            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
                }
            }

                // case of no existing value
            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 dsa2 = ["a": 1, "b":a34]
let mdsa3 = dsa12.merge(dsa34)
print("merging:\n\t\(dsa12)\nwith\n\t\(dsa34) \nyields: \n\t\(mdsa3)")

0

সুইফট 2.2

func + <K,V>(left: [K : V], right: [K : V]) -> [K : V] {
    var result = [K:V]()

    for (key,value) in left {
        result[key] = value
    }

    for (key,value) in right {
        result[key] = value
    }
    return result
}

আপনি যদি এটি রাখেন তবে আপনি প্রথম লুপটি সরিয়ে ফেলতে পারবেন: `var ফলাফল = বাম`
নাইকাইলাইভ

0

আমি শুধু ডলার লাইব্রেরি ব্যবহার করব ।

https://github.com/ankurp/Dollar/#merge---merge-1

সমস্ত অভিধান একত্রে একত্রিত করে এবং পরবর্তী অভিধানটি প্রদত্ত কীতে মানটিকে ওভাররাইড করে

let dict: Dictionary<String, Int> = ["Dog": 1, "Cat": 2]
let dict2: Dictionary<String, Int> = ["Cow": 3]
let dict3: Dictionary<String, Int> = ["Sheep": 4]
$.merge(dict, dict2, dict3)
=> ["Dog": 1, "Cat": 2, "Cow": 3, "Sheep": 4]

5
jQuery ফিরে এসেছে ইয়ে!
বেন সিনক্লেয়ার

0

আমি লিখেছিলাম একটি চমৎকার এক্সটেনশন এখানে ...

extension Dictionary where Value: Any {
    public func mergeOnto(target: [Key: Value]?) -> [Key: Value] {
        guard let target = target else { return self }
        return self.merging(target) { current, _ in current }
    }
}

ব্যবহার করা:

var dict1 = ["cat": 5, "dog": 6]
var dict2 = ["dog": 9, "rodent": 10]

dict1 = dict1.mergeOnto(target: dict2)

তারপরে, ডিক্ট 1 এ পরিবর্তিত হবে

["cat": 5, "dog": 6, "rodent": 10]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.