स्विफ्ट 4 के बाद से आप इसे बहुत आसानी से कर सकते हैं। कर रहे हैं दो नए initializers कि tuples के अनुक्रम से (कुंजी और मान के जोड़े) एक शब्दकोश का निर्माण। यदि कुंजियों को विशिष्ट होने की गारंटी दी जाती है, तो आप निम्न कार्य कर सकते हैं:
let persons = [Person(name: "Franz", position: 1),
Person(name: "Heinz", position: 2),
Person(name: "Hans", position: 3)]
Dictionary(uniqueKeysWithValues: persons.map { ($0.position, $0.name) })
=> [1: "Franz", 2: "Heinz", 3: "Hans"]
यदि कोई कुंजी डुप्लिकेट है, तो यह रनटाइम त्रुटि के साथ विफल हो जाएगा। उस स्थिति में आप इस संस्करण का उपयोग कर सकते हैं:
let persons = [Person(name: "Franz", position: 1),
Person(name: "Heinz", position: 2),
Person(name: "Hans", position: 1)]
Dictionary(persons.map { ($0.position, $0.name) }) { _, last in last }
=> [1: "Hans", 2: "Heinz"]
यह लूप के लिए आपका व्यवहार करता है। यदि आप मानों को "अधिलेखित" नहीं करना चाहते हैं और पहले मानचित्रण से चिपके रहते हैं, तो आप इसका उपयोग कर सकते हैं:
Dictionary(persons.map { ($0.position, $0.name) }) { first, _ in first }
=> [1: "Franz", 2: "Heinz"]
स्विफ्ट 4.2 एक तीसरा इनिशियलाइज़र जोड़ता है जो तत्वों को एक शब्दकोश में अनुक्रमित करता है। शब्दकोश कुंजियाँ एक बंद से ली गई हैं। उसी कुंजी वाले तत्वों को उसी क्रम में एक सरणी में रखा जाता है जैसे कि अनुक्रम में। यह आपको ऊपर दिए गए समान परिणाम प्राप्त करने की अनुमति देता है। उदाहरण के लिए:
Dictionary(grouping: persons, by: { $0.position }).mapValues { $0.last! }
=> [1: Person(name: "Hans", position: 1), 2: Person(name: "Heinz", position: 2)]
Dictionary(grouping: persons, by: { $0.position }).mapValues { $0.first! }
=> [1: Person(name: "Franz", position: 1), 2: Person(name: "Heinz", position: 2)]
[position:name]
या[position:[name]]
? यदि आपके पास एक ही स्थिति में दो लोग हैं, तो आपका शब्दकोश केवल आपके पाश में पिछले एक को सामने रखेगा .... मेरे पास एक समान प्रश्न है जिसके लिए मैं एक समाधान खोजने की कोशिश कर रहा हूं, लेकिन मैं चाहता हूं कि परिणाम जैसा हो[1: [p1, p3], 2: [p2]]