সুইফ্টের কোনও অভিধানে মানচিত্র () প্রয়োগ করার সবচেয়ে সহজ উপায় কী?


154

আমি অভিধানের সমস্ত কীতে একটি ফাংশন মানচিত্র করতে চাই। আমি আশা করছিলাম যে নীচের মতো কিছু কাজ করবে তবে ফিল্টারটি অভিধানে সরাসরি প্রয়োগ করা যায় না। এটি অর্জনের সবচেয়ে পরিষ্কার উপায় কী?

এই উদাহরণে, আমি প্রতিটি মান 1 দিয়ে বাড়ানোর চেষ্টা করছি তবে এটি উদাহরণস্বরূপ - এটি একটি মূল অভিধানে কীভাবে মানচিত্র প্রয়োগ করতে হবে তা নির্ধারণ করা মূল উদ্দেশ্য।

var d = ["foo" : 1, "bar" : 2]

d.map() {
    $0.1 += 1
}

1
অভিধানের মানচিত্রের কার্যকারিতা নেই, তাই আপনি কী করতে চাইছেন তা পরিষ্কার নয়।
ডেভিড বেরি

7
হ্যাঁ - আমি জানি যে অভিধানের মানচিত্রের কার্যকারিতা নেই। পুরো অভিধানটিতে পুনরাবৃত্তি করার প্রয়োজন ছাড়াই কীভাবে ক্লোজার দিয়ে এটি সম্পন্ন করা যায় তা প্রশ্নটি পুনরায় জবাব দিতে পারে।
মারিয়া জভেরিনা

2
আপনার এখনও পুরো অভিধানটি পুনরাবৃত্তি করতে হবে যেহেতু এটিই mapকরে। আপনি যা চাইছেন তা হ'ল একটি এক্সটেনশন / বন্ধের পিছনে পুনরাবৃত্তিটি গোপন করার একটি উপায় যাতে আপনি এটি প্রতিবার ব্যবহার করার সময় এটির দিকে নজর দিতে হবে না।
জোসেফ মার্ক

1
সুইফ্ট 4 এর জন্য, আমার উত্তরটি দেখুন যা আপনার সমস্যা সমাধানের জন্য 5 টি বিভিন্ন উপায় দেখায়।
ইমানু পেটিট

উত্তর:


281

সুইফট 4+

ভাল খবর! সুইফট 4-তে একটি mapValues(_:)পদ্ধতি রয়েছে যা একই কীগুলির সাথে অভিধানের অনুলিপি তৈরি করে তবে বিভিন্ন মান। এটি একটি অন্তর্ভুক্ত filter(_:)জমিদার যা ফেরৎ Dictionary, এবং init(uniqueKeysWithValues:)এবং init(_:uniquingKeysWith:)initializers একটি তৈরি করতে Dictionarytuples এর একটি অবাধ ক্রম থেকে। এর অর্থ হ'ল, আপনি কী এবং মান উভয়ই পরিবর্তন করতে চাইলে আপনি এর মতো কিছু বলতে পারেন:

let newDict = Dictionary(uniqueKeysWithValues:
    oldDict.map { key, value in (key.uppercased(), value.lowercased()) })

এছাড়াও একত্রে অভিধানগুলিকে মার্জ করার জন্য, অনুপস্থিত উপাদানগুলির জন্য একটি ডিফল্ট মান প্রতিস্থাপনের জন্য, গোষ্ঠীকরণের মানগুলি (কিছু ফাংশনের মাধ্যমে সংগ্রহকে ম্যাপিংয়ের ফলে কী সংগ্রহকে অ্যারের অভিধানে রূপান্তর করা) এবং আরও অনেক কিছু রয়েছে।

এসই -0165 , প্রস্তাবটি আলোচনার সময়, এই বৈশিষ্ট্যগুলি প্রবর্তন করার সময়, আমি এই স্ট্যাক ওভারফ্লো উত্তরটি বেশ কয়েকবার নিয়ে এসেছি এবং আমি মনে করি যে সংক্ষিপ্ত সংখ্যক উর্ধ্বতন দাবিটি প্রদর্শনে সহায়তা করেছে। সুইফটকে আরও উন্নত করতে সাহায্য করার জন্য আপনাকে ধন্যবাদ!


6
এটি অবশ্যই অসম্পূর্ণ, তবে আমাদের অবশ্যই নিখুঁতকে ভালদের শত্রু হতে দেওয়া উচিত নয়। একজন mapযে পরস্পরবিরোধী কী উত্পাদন পারে এখনও একটি দরকারী mapঅনেক পরিস্থিতিতে। (অন্যদিকে, আপনি তর্ক করতে পারেন যে কেবলমাত্র মানগুলির মানচিত্রকরণই অভিধানগুলিতে একটি প্রাকৃতিক ব্যাখ্যা mapthe মূল পোস্টারের উদাহরণ এবং আমার উভয়ই মানগুলিকে সংশোধন করে, এবং ধারণাগতভাবে, mapএকটি অ্যারেতে কেবল মূল্যবোধগুলি পরিবর্তিত হয়, সূচকগুলি নয়))
ব্রেন্ট রয়েল-গর্ডন

2
আপনার শেষ কোড ব্লকটি অনুপস্থিত বলে মনে হচ্ছে try:return Dictionary<Key, OutValue>(try map { (k, v) in (k, try transform(v)) })
জেপিএসিম

9
সুইফট ২.১-এর জন্য আপডেট হয়েছে? প্রাপ্তিDictionaryExtension.swift:13:16: Argument labels '(_:)' do not match any available overloads
এরিকসন

4
এই Argument labels '(_:)' do not match any available overloadsশেষ এক্সটেনশনটি প্রয়োগ করার সময় সুইফট ২.২ দিয়ে আমি পাচ্ছি । কীভাবে সমাধান করবেন তা সত্যই নিশ্চিত নন: /
এরকেন

2
@ অডিও এটি কোড স্নিপেট Dictionaryপূর্ববর্তী উদাহরণগুলির মধ্যে একটিতে যুক্ত ইনিশিয়ালাইজারের উপর নির্ভর করে । আপনি উভয়কে অন্তর্ভুক্ত করেছেন তা নিশ্চিত করুন।
ব্রেন্ট রয়েল-গর্ডন

65

সুইফট 5 এর সাহায্যে আপনার সমস্যা সমাধানের জন্য আপনি নীচের পাঁচটি স্নিপেট ব্যবহার করতে পারেন ।


# 1। Dictionary mapValues(_:)পদ্ধতি ব্যবহার

let dictionary = ["foo": 1, "bar": 2, "baz": 5]

let newDictionary = dictionary.mapValues { value in
    return value + 1
}
//let newDictionary = dictionary.mapValues { $0 + 1 } // also works

print(newDictionary) // prints: ["baz": 6, "foo": 2, "bar": 3]

# 2। Dictionary mapপদ্ধতি এবং init(uniqueKeysWithValues:)ইনিশিয়ালাইজার ব্যবহার করে

let dictionary = ["foo": 1, "bar": 2, "baz": 5]

let tupleArray = dictionary.map { (key: String, value: Int) in
    return (key, value + 1)
}
//let tupleArray = dictionary.map { ($0, $1 + 1) } // also works

let newDictionary = Dictionary(uniqueKeysWithValues: tupleArray)

print(newDictionary) // prints: ["baz": 6, "foo": 2, "bar": 3]

# 3। Dictionary reduce(_:_:)পদ্ধতি বা reduce(into:_:)পদ্ধতি ব্যবহার করে

let dictionary = ["foo": 1, "bar": 2, "baz": 5]

let newDictionary = dictionary.reduce([:]) { (partialResult: [String: Int], tuple: (key: String, value: Int)) in
    var result = partialResult
    result[tuple.key] = tuple.value + 1
    return result
}

print(newDictionary) // prints: ["baz": 6, "foo": 2, "bar": 3]
let dictionary = ["foo": 1, "bar": 2, "baz": 5]

let newDictionary = dictionary.reduce(into: [:]) { (result: inout [String: Int], tuple: (key: String, value: Int)) in
    result[tuple.key] = tuple.value + 1
}

print(newDictionary) // prints: ["baz": 6, "foo": 2, "bar": 3]

# 4। Dictionary subscript(_:default:)সাবস্ক্রিপ্ট ব্যবহার করা

let dictionary = ["foo": 1, "bar": 2, "baz": 5]

var newDictionary = [String: Int]()
for (key, value) in dictionary {
    newDictionary[key, default: value] += 1
}

print(newDictionary) // prints: ["baz": 6, "foo": 2, "bar": 3]

# 5। Dictionary subscript(_:)সাবস্ক্রিপ্ট ব্যবহার করা

let dictionary = ["foo": 1, "bar": 2, "baz": 5]

var newDictionary = [String: Int]()
for (key, value) in dictionary {
    newDictionary[key] = value + 1
}

print(newDictionary) // prints: ["baz": 6, "foo": 2, "bar": 3]

দয়া করে উদাহরণস্বরূপ যে পরিবর্তন কীগুলি মান নয়। ধন্যবাদ এটি সহায়ক।
যোগেশ প্যাটেল

18

যদিও এখানে বেশিরভাগ উত্তরগুলি পুরো অভিধানটি কী (কী এবং মানগুলি) ম্যাপ করতে হয় সেদিকে দৃষ্টি নিবদ্ধ করে , প্রশ্নটি সত্যই কেবল মানগুলি মানচিত্র করতে চেয়েছিল। এটি একটি গুরুত্বপূর্ণ পার্থক্য যেহেতু মানচিত্র মানগুলি আপনাকে একই সংখ্যক এন্ট্রির গ্যারান্টি দিতে দেয়, যখন কী এবং মান উভয়ই ম্যাপিংয়ের ফলে ডুপ্লিকেট কীগুলি হতে পারে।

এখানে একটি এক্সটেনশন রয়েছে, mapValuesএটি আপনাকে কেবল মানগুলি মানচিত্র করতে দেয়। নোট করুন এটি initকী / মান জোড়ার ক্রম থেকে অভিধানকে প্রসারিত করে যা এটি অ্যারে থেকে আরম্ভ করার চেয়ে কিছুটা সাধারণ:

extension Dictionary {
    init<S: SequenceType where S.Generator.Element == Element>
      (_ seq: S) {
        self.init()
        for (k,v) in seq {
            self[k] = v
        }
    }

    func mapValues<T>(transform: Value->T) -> Dictionary<Key,T> {
        return Dictionary<Key,T>(zip(self.keys, self.values.map(transform)))
    }

}

.. এটি কিভাবে ব্যবহার করা হয়? আমি কি এখানে নতুন উদাহরণ রেখেছি?
ফ্লোইউআই সিম্পলআইটিস্টিং ডটকম

আমি যখন মাইডোর ডায়ামার্স.ম্যাপটি চেষ্টা করেছি, বন্ধের ভিতরে, আমাকে নিয়মিতভাবে অন্য মানচিত্রটি করতে হয়েছিল। এটি কাজ করে, তবে এটি কীভাবে ব্যবহার করার কথা?
ফ্লোইউআই সিম্পলআইটিস্টিং.কম

কোথাও কোথাও গ্যারান্টি আছে যে কীগুলি এবং মানগুলি পৃথকভাবে কল করার পরে ক্রমযুক্ত, এবং জিপের জন্য উপযুক্ত?
অ্যারন জিনম্যান 31'17

যখন আপনি কেবল ব্যবহার করতে পারেন তখন কেন একটি নতুন উদ্যোগ তৈরি করুন func mapValues<T>(_ transform: (_ value: Value) -> T) -> [Key: T] { var result = [Key: T]() for (key, val) in self { result[key] = transform(val) } return result }। আমি এটি আরও ভাল পড়তে পাই। একটি পারফরম্যান্স সমস্যা আছে?
মার্সেল

12

সবচেয়ে পরিষ্কার উপায় হ'ল অভিধানে যুক্ত mapকরা:

extension Dictionary {
    mutating func map(transform: (key:KeyType, value:ValueType) -> (newValue:ValueType)) {
        for key in self.keys {
            var newValue = transform(key: key, value: self[key]!)
            self.updateValue(newValue, forKey: key)
        }
    }
}

এটি কাজ করে তা পরীক্ষা করা হচ্ছে:

var dic = ["a": 50, "b": 60, "c": 70]

dic.map { $0.1 + 1 }

println(dic)

dic.map { (key, value) in
    if key == "a" {
        return value
    } else {
        return value * 2
    }
}

println(dic)

আউটপুট:

[c: 71, a: 51, b: 61]
[c: 142, a: 51, b: 122]

1
এই পদ্ধতির সাথে আমি যে সমস্যাটি দেখছি তা SequenceType.mapহ'ল এটি কোনও রূপান্তরকারী ফাংশন নয়। বিদ্যমান উদাহরণটি অনুসরণ করার জন্য আপনার উদাহরণটি আবারও লেখা যেতে পারে mapতবে এটি গৃহীত উত্তরের মতো the
ক্রিস্টোফার পিক্সলে

7

আপনি reduceমানচিত্রের পরিবর্তে ব্যবহার করতে পারেন । reduceকিছু mapকরতে সক্ষম এবং আরও কিছু করতে সক্ষম !

let oldDict = ["old1": 1, "old2":2]

let newDict = reduce(oldDict, [String:Int]()) { dict, pair in
    var d = dict
    d["new\(pair.1)"] = pair.1
    return d
}

println(newDict)   //  ["new1": 1, "new2": 2]

এটি কোনও এক্সটেনশনে গুটিয়ে রাখা মোটামুটি সহজ হবে, তবে এমনকি এক্সটেনশন ছাড়াই এটি আপনাকে একটি ফাংশন কল দিয়ে যা করতে চায় তা করতে দেয়।


10
এই পদ্ধতির খারাপ দিকটি হ'ল প্রতিবার আপনি একটি নতুন কী যুক্ত করলে অভিধানের ব্র্যান্ডের নতুন অনুলিপি তৈরি হয়, সুতরাং এই ফাংশনটি মারাত্মকভাবে অক্ষম (অপটিমাইজার আপনাকে সংরক্ষণ করতে পারে )।
এয়ারস্পিড বেধে

এটি একটি ভাল বিষয় ... একটি জিনিস যা আমি খুব ভাল বুঝতে পারি না তা হ'ল সুইফ্টের স্মৃতি পরিচালনার অভ্যন্তরীণ। আমি এই জাতীয় মন্তব্যের প্রশংসা করি যা আমাকে এটি সম্পর্কে ভাবতে বাধ্য করে :)
অ্যারন রাসমুসেন

1
টেম্প ভার এবং let newDict = oldDict.reduce([String:Int]()) { (var dict, pair) in dict["new\(pair.1)"] = pair.1; return dict }
কমার

4

দেখা যাচ্ছে আপনি এটি করতে পারেন। আপনাকে যা করতে হবে তা হল MapCollectionView<Dictionary<KeyType, ValueType>, KeyType>অভিধান keysপদ্ধতি থেকে ফিরে আসা থেকে একটি অ্যারে তৈরি করা । ( এখানে তথ্য ) আপনি তারপরে এই অ্যারেটি ম্যাপ করতে পারেন এবং আপডেট হওয়া মানগুলি অভিধানে ফেরত দিতে পারেন।

var dictionary = ["foo" : 1, "bar" : 2]

Array(dictionary.keys).map() {
    dictionary.updateValue(dictionary[$0]! + 1, forKey: $0)
}

dictionary

আপনি কীভাবে ["foo": 1, "বার": 2] কে [("foo", 1), ("বার", 2)] তে রূপান্তর করবেন তার ব্যাখ্যাটি যুক্ত করতে পারেন
মারিয়া জেভারিনা

@ মারিয়াজভেরিনা আপনি কী বলতে চাইছেন তা আমি নিশ্চিত নই।
মিক ম্যাককালাম

আপনি যদি উপরে রূপান্তরটি সম্পাদন করতে পারেন তবে ফিল্টারটি ফলাফলের অ্যারেটিতে সরাসরি প্রয়োগ করা যেতে পারে
মারিয়া জাভেরিনা

নিবন্ধন করুন হ্যাঁ দুর্ভাগ্যক্রমে আমি এটি করার কোনও উপায় সম্পর্কে অবগত নই।
মিক ম্যাককালাম

3

সুইফট স্ট্যান্ডার্ড লাইব্রেরি রেফারেন্স অনুসারে মানচিত্রটি অ্যারেগুলির একটি ফাংশন। অভিধানের জন্য নয়।

তবে আপনি কীগুলি সংশোধন করতে আপনার অভিধানটি পুনরাবৃত্তি করতে পারেন:

var d = ["foo" : 1, "bar" : 2]

for (name, key) in d {
    d[name] = d[name]! + 1
}

3

আমি কাস্টম অবজেক্টস সহ টাইপ করা অ্যারেতে অভিধানকে ম্যাপ করার একটি উপায় খুঁজছিলাম। এই এক্সটেনশনে সমাধানটি খুঁজে পেয়েছি:

extension Dictionary {
    func mapKeys<U> (transform: Key -> U) -> Array<U> {
        var results: Array<U> = []
        for k in self.keys {
            results.append(transform(k))
        }
        return results
    }

    func mapValues<U> (transform: Value -> U) -> Array<U> {
        var results: Array<U> = []
        for v in self.values {
            results.append(transform(v))
        }
        return results
    }

    func map<U> (transform: Value -> U) -> Array<U> {
        return self.mapValues(transform)
    }

    func map<U> (transform: (Key, Value) -> U) -> Array<U> {
        var results: Array<U> = []
        for k in self.keys {
            results.append(transform(k as Key, self[ k ]! as Value))
        }
        return results
    }

    func map<K: Hashable, V> (transform: (Key, Value) -> (K, V)) -> Dictionary<K, V> {
        var results: Dictionary<K, V> = [:]
        for k in self.keys {
            if let value = self[ k ] {
                let (u, w) = transform(k, value)
                results.updateValue(w, forKey: u)
            }
        }
        return results
    }
}

নিম্নলিখিত হিসাবে এটি ব্যবহার:

self.values = values.map({ (key:String, value:NSNumber) -> VDLFilterValue in
    return VDLFilterValue(name: key, amount: value)
})

3

সুইফট 3

আমি সুইফট 3 এ একটি সহজ উপায় চেষ্টা করি।

আমি [স্ট্রিং: স্ট্রিং?] থেকে [স্ট্রিং: স্ট্রিং] ম্যাপ করতে চাই, আমি মানচিত্র বা ফ্ল্যাট মানচিত্রের পরিবর্তে প্রতিটি জন্য ব্যবহার করি।

    let oldDict = ["key0": "val0", "key1": nil, "key1": "val2","key2": nil]
    var newDict = [String: String]()
    oldDict.forEach { (source: (key: String, value: String?)) in
        if let value = source.value{
            newDict[source.key] = value
        }
    }

এটি অনাকাঙ্ক্ষিত কারণ এটি একটি নতুন অ্যারে তৈরি করে এবং এতে যুক্ত হয়
স্টিভ কুও

2

সুইফট 5

অভিধানের মানচিত্রের ফাংশনটি এই সিনট্যাক্সের সাথে আসে।

dictData.map(transform: ((key: String, value: String)) throws -> T)

আপনি এটিতে ক্লোজারের মানগুলি সেট করতে পারেন

var dictData: [String: String] = [
    "key_1": "test 1",
    "key_2": "test 2",
    "key_3": "test 3",
    "key_4": "test 4",
    "key_5": "test 5",
]

dictData.map { (key, value) in
    print("Key :: \(key), Value :: \(value)")
}

আউটপুট হবে ::

Key :: key_5, Value :: test 5
Key :: key_1, Value :: test 1
Key :: key_3, Value :: test 3
Key :: key_2, Value :: test 2
Key :: key_4, Value :: test 4

এটি এই সতর্কতা দেওয়া হতে পারে Result of call to 'map' is unused

তারপরে কেবল _ =ভেরিয়েবলের আগে সেট করুন ।

এটি হতে পারে আপনাকে ধন্যবাদ আপনাকে ধন্যবাদ।


1

আমি ধরে নিই যে সমস্যাটি হ'ল আমাদের মূল অভিধানের কীগুলি রাখা এবং এর মানগুলি কোনও উপায়ে মানচিত্র করা।

আমাদের সাধারণের এবং বলে যে, আমরা সব মান ম্যাপ করতে পারেন যাক আরেক ধরনের থেকে

সুতরাং আমরা যেটি দিয়ে শুরু করতে চাই তা হল একটি অভিধান এবং একটি ক্লোজার (একটি ফাংশন) এবং একটি নতুন অভিধানের সমাপ্তি। সমস্যাটি অবশ্যই সুইফটের কঠোর টাইপিংয়ের পথে চলে যায়। কোন বন্ধনে কোন প্রকারটি চলে এবং কোন প্রকারটি বেরিয়ে আসে তা নির্দিষ্ট করা দরকার এবং জেনেরিকের প্রেক্ষাপট ব্যতীত আমরা কোনও পদ্ধতি বন্ধ করতে পারি না যা সাধারণ বন্ধ করে takes সুতরাং আমাদের একটি জেনেরিক ফাংশন প্রয়োজন।

অন্যান্য সমাধানগুলি অভিধান জেনেরিক কাঠামোর নিজেই জেনেরিক বিশ্বে এটি করার দিকে মনোনিবেশ করেছে, তবে শীর্ষ স্তরের কোনও ক্রিয়াকলাপের বিবেচনায় আমার পক্ষে এটি সহজ মনে হয়। উদাহরণস্বরূপ, আমরা এটি লিখতে পারি, যেখানে কে মূল ধরণ, ভি 1 হ'ল শুরুর অভিধানের মান ধরণ এবং ভি 2 সমাপ্ত অভিধানের মান প্রকার:

func mapValues<K,V1,V2>(d1:[K:V1], closure:(V1)->V2) -> [K:V2] {
    var d2 = [K:V2]()
    for (key,value) in zip(d1.keys, d1.values.map(closure)) {
        d2.updateValue(value, forKey: key)
    }
    return d2
}

এখানে এটি কল করার একটি সাধারণ উদাহরণ রয়েছে, জেনেরিকটি সত্যই সংকলন সময়ে নিজেকে সমাধান করে তা প্রমাণ করার জন্য:

let d : [String:Int] = ["one":1, "two":2]
let result = mapValues(d) { (i : Int) -> String in String(i) }

আমরা একটি অভিধান দিয়ে শুরু করেছি এবং একটি অভিধান দিয়ে [String:Int]শেষ করেছি একটি [String:String]অভিধানের মাধ্যমে প্রথম অভিধানের মানগুলিকে রূপান্তর করে।

(সম্পাদনা: আমি এখন দেখতে পাচ্ছি যে এটি কার্যকরভাবে আয়ারস্পিডভেলসিটির সমাধান হিসাবে একই, আমি অভিধান অভিধানের একটি প্রাথমিক সূচক অতিরিক্ত কমনীয়তা যোগ করি নি যা অভিধানকে একটি জিপ ক্রম থেকে বের করে দেয়))


1

সুইফট 3

ব্যবহার:

let bob = ["a": "AAA", "b": "BBB", "c": "CCC"]
bob.mapDictionary { ($1, $0) } // ["BBB": "b", "CCC": "c", "AAA": "a"]

এক্সটেনশান:

extension Dictionary {
    func mapDictionary(transform: (Key, Value) -> (Key, Value)?) -> Dictionary<Key, Value> {
        var dict = [Key: Value]()
        for key in keys {
            guard let value = self[key], let keyValue = transform(key, value) else {
                continue
            }

            dict[keyValue.0] = keyValue.1
        }
        return dict
    }
}

1

আমি কেবল মানগুলি মান্য করার চেষ্টা করছি (সম্ভাব্যভাবে তাদের ধরণের পরিবর্তন করা), এই এক্সটেনশনটি অন্তর্ভুক্ত করুন:

extension Dictionary {
    func valuesMapped<T>(_ transform: (Value) -> T) -> [Key: T] {
        var newDict = [Key: T]()
        for (key, value) in self {
            newDict[key] = transform(value)
        }
        return newDict
    }
}

আপনার কাছে এই অভিধান রয়েছে:

let intsDict = ["One": 1, "Two": 2, "Three": 3]

একক-রেখার মান রূপান্তরটি এর পরে দেখায়:

let stringsDict = intsDict.valuesMapped { String($0 * 2) }
// => ["One": "2", "Three": "6", "Two": "4"]

মাল্টি-লাইন মান রূপান্তরটি এর পরে দেখায়:

let complexStringsDict = intsDict.valuesMapped { (value: Int) -> String in
    let calculationResult = (value * 3 + 7) % 5
    return String("Complex number #\(calculationResult)")
}
// => ["One": "Complex number #0", "Three": ...

0

অন্য পদ্ধতির mapএকটি অভিধান এবং reduceযেখানে কার্যকরী হয় keyTransformএবং valueTransformহয়।

let dictionary = ["a": 1, "b": 2, "c": 3]

func keyTransform(key: String) -> Int {
    return Int(key.unicodeScalars.first!.value)
}

func valueTransform(value: Int) -> String {
    return String(value)
}

dictionary.map { (key, value) in
     [keyTransform(key): valueTransform(value)]
}.reduce([Int:String]()) { memo, element in
    var m = memo
    for (k, v) in element {
        m.updateValue(v, forKey: k)
    }
    return m
}

এটি তখন আসল কোডের চেয়ে বেশি ধারণা ছিল তবে তবুও, আমি এটিকে চলমান কোডে প্রসারিত করেছি।
নেবুলাফক্স

0

সুইফট 3 আমি এটি ব্যবহার করেছি,

func mapDict(dict:[String:Any])->[String:String]{
    var updatedDict:[String:String] = [:]
    for key in dict.keys{
        if let value = dict[key]{
            updatedDict[key] = String(describing: value)
        }
    }

   return updatedDict
}

ব্যবহার:

let dict:[String:Any] = ["MyKey":1]
let mappedDict:[String:String] = mapDict(dict: dict)

সূত্র

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