डिक्शनरी Swift के प्रमुख संग्रह प्रकारों में से एक हैं। एक डिक्शनरी अलग-अलग की और उनसे जुड़ी वैल्यू के बीच क्रम-रहित संबंध संग्रहीत करती है। डिक्शनरी में हर की का टाइप एक ही होना चाहिए, और हर वैल्यू का टाइप भी एक ही होना चाहिए।
डिक्शनरी लिटरल को कॉमा से अलग किए गए key: value जोड़ों के रूप में लिखा जाता है, जिन्हें चौकोर ब्रैकेट में बंद किया जाता है:
var addresses: Dictionary<String, String> = [
"The Munsters": "1313 Mockingbird Lane",
"The Simpsons": "742 Evergreen Terrace",
"Buffy Summers": "1630 Revello Drive"
]
var sequences: [String: [Int]] = [
"Euler's totient": [1, 1, 2, 2, 4, 2, 6, 4],
"Lazy caterer": [1, 2, 4, 7, 11, 16, 22, 29, 37],
"Carmichael": [561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841]
]
let constants = [
"pi": 3.14159,
"e": 2.71828,
"phi": 1.618033,
"avogadro": 6.02214076e23
]
डिक्शनरी टाइप को स्पष्ट रूप से दो तरह से लिखा जा सकता है: Dictionary<Key, Value> या संक्षिप्त रूप [Key: Value]।
खाली डिक्शनरी बनाने के लिए उसके की और वैल्यू के टाइप स्पष्ट रूप से बताइए:
var emptyDict1: [Int: Int] = [:]
var emptyDict2 = [Character: String]()
var emptyDict3 = Dictionary<Int, Double>()
आप सबस्क्रिप्ट नोटेशन की मदद से वैल्यू पढ़ सकते हैं: डिक्शनरी के नाम के बाद चौकोर ब्रैकेट में की लिखिए।
क्योंकि हो सकता है कि कोई की डिक्शनरी में मौजूद न हो, इसलिए सबस्क्रिप्ट से पढ़ने पर एक ऑप्शनल (Value?) लौटता है।
अगर की मौजूद है, तो Swift उससे जुड़ी वैल्यू लौटाता है; अगर नहीं, तो nil लौटाता है:
let munster: String? = addresses["The Munsters"]
// Returns Optional("1313 Mockingbird Lane")
let carmichael = sequences["Carmichael"]
// Returns Optional([561, 1105, 1729, 2465, 2821, 6601, 8911, 10585, 15841])
let planck = constants["planck"]
// Returns nil
ऑप्शनल के साथ काम करने से बचने के लिए आप default पैरामीटर की मदद से एक डिफॉल्ट वैल्यू दे सकते हैं:
let e: Double = constants["e", default: 0]
// Returns 2.71828
let hoagie: [Int] = sequences["Hoagie", default: []]
// Returns []
let betty = addresses["Betty Cooper", default: "Address unknown"]
// Returns "Address unknown"
var से घोषित बदलने योग्य डिक्शनरी में आप सबस्क्रिप्ट असाइनमेंट की मदद से की-वैल्यू जोड़े जोड़ या बदल सकते हैं:
sequences["Euler's totient"]?.append(contentsOf: [6, 4])
// sequences["Euler's totient"] is now [1, 1, 2, 2, 4, 2, 6, 4, 6, 4]
addresses["Betty Cooper"] = "111 Queens Ave."
addresses["Betty Cooper", default: "Address unknown"]
// Returns "111 Queens Ave."
constants["Gelfond's"] = 23.140692
// Compiler error: Cannot assign through subscript: 'constants' is a 'let' constant
आप for-in लूप की मदद से डिक्शनरी के हर की-वैल्यू जोड़े पर इटरेशन कर सकते हैं।
हर जोड़ा एक (key, value) ट्यूपल के रूप में मिलता है:
for (name, address) in addresses {
print("\(name) lives at \(address)")
}
क्योंकि डिक्शनरी क्रम-रहित होती है, उसे क्रमबद्ध करने पर की-वैल्यू जोड़ों का एक ऐरे मिलता है।
आप sorted(by:) मेथड को एक क्लोज़र दे सकते हैं, जो दो (key, value) ट्यूपल की तुलना करता है और true लौटाता है अगर पहला ट्यूपल दूसरे से पहले आना चाहिए:
func sortByNameLengthThenValue(_ lhs: (key: String, value: Double), _ rhs: (key: String, value: Double)) -> Bool {
let left = lhs.value + Double(lhs.key.count)
let right = rhs.value + Double(rhs.key.count)
return left < right
}
let sortedConstants = constants.sorted(by: sortByNameLengthThenValue)
इस अभ्यास में आपको अपने नज़दीकी आर्केड हॉल के सबसे लोकप्रिय गेम के हाई स्कोर का हिसाब रखने का एक तरीका बनाना है।
आपको 7 फंक्शन बनाने हैं, जो सब हाई स्कोर के डेटा की एक डिक्शनरी लौटाने और उसमें बदलाव करने से जुड़े हैं।
एक फंक्शन newScoreBoard() बनाइए जो कोई पैरामीटर नहीं लेता और एक नई हाई स्कोर डिक्शनरी लौटाता है। इस डिक्शनरी में की String टाइप की होती हैं और वैल्यू Int टाइप की।
हाई स्कोर डिक्शनरी में एक खिलाड़ी जोड़ने के लिए addPlayer(_:_:_:) बनाइए। यह एक फंक्शन है जो 3 पैरामीटर लेता है:
var highScores = newScoreBoard()
addPlayer(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0]
addPlayer(&highScores, "José Valim", 486_373)
// Returns ["Dave Thomas": 0, "José Valim": 486_373]
हाई स्कोर डिक्शनरी से किसी खिलाड़ी को हटाने के लिए removePlayer(_:_:) बनाइए, जो 2 पैरामीटर लेता है:
अगर खिलाड़ी डिक्शनरी में है, तो यह फंक्शन उसे डिक्शनरी से हटा दे। अगर नहीं है, तो कुछ नहीं होना चाहिए।
var highScores = ["Dave Thomas": 0, "José Valim": 486_373]
removePlayer(&highScores, "Dave Thomas")
// Returns ["José Valim": 486_373]
removePlayer(&highScores, "Rose Fanaras")
// Returns ["José Valim": 486_373]
किसी खिलाड़ी का स्कोर रीसेट करने के लिए resetPlayer(_:_:) बनाइए, जो 2 पैरामीटर लेता है:
यह फंक्शन खिलाड़ी का स्कोर 0 कर देता है। अगर खिलाड़ी डिक्शनरी में नहीं है, तो कुछ नहीं होना चाहिए।
var highScores = ["Dave Thomas": 486_373, "José Valim": 10]
resetScore(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0, "José Valim": 10]
किसी खिलाड़ी का स्कोर उसके पिछले स्कोर में जोड़कर अपडेट करने के लिए updateScore बनाइए, जो 3 पैरामीटर लेता है:
var highScores = ["Dave Thomas": 0, "José Valim": 486_373]
addPlayer(&highScores, "Freyja Ćirić", 12_771_008)
updateScore(&highScores, "Freyja Ćirić", 73)
// Returns ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_081]
orderByPlayers फंक्शन बनाइए, जो 1 पैरामीटर लेता है:
यह फंक्शन (String, Int) टपल का एक ऐरे लौटाता है, जिनमें खिलाड़ी और उनके हाई स्कोर होते हैं और जो खिलाड़ी के नाम के अनुसार बढ़ते क्रम में लगे होते हैं।
var highScores = ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_091]
orderByPlayers(highScores)
// Returns [("Dave Thomas", 0), ("Freyja Ćirić", 12_771_091), ("José Valim", 486_373)]
खिलाड़ियों की सूची स्कोर के अनुसार घटते क्रम में पाने के लिए orderByScores बनाइए, जो 1 पैरामीटर लेता है:
यह फंक्शन (String, Int) टपल का एक ऐरे लौटाता है, जिनमें खिलाड़ी और उनके हाई स्कोर होते हैं और जो खिलाड़ी के स्कोर के अनुसार घटते क्रम में लगे होते हैं।
var highScores = ["Dave Thomas": 0, "José Valim": 486_373, "Freyja Ćirić": 12_771_091]
orderByScores(highScores)
// Returns [("Freyja Ćirić", 12_771_091), ("José Valim", 486_373), ("Dave Thomas", 0)]
Exercism पर साइन अप कीजिए और Swift को 35 कॉन्सेप्ट116 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।