ডিকশনারি হলো Swift-এর প্রধান কালেকশন টাইপগুলোর একটি। ডিকশনারি স্বতন্ত্র কী (key) ও সংশ্লিষ্ট মানের মধ্যে ক্রমহীন সম্পর্ক সংরক্ষণ করে। ডিকশনারির সব কী (key) একই টাইপের হতে হবে, আর সব মানও একই টাইপের হতে হবে।
ডিকশনারি লিটারেল লেখা হয় কমা দিয়ে আলাদা করা 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]।
খালি ডিকশনারি তৈরি করতে চাইলে তার কী (key) ও মানের টাইপ স্পষ্টভাবে উল্লেখ করুন:
var emptyDict1: [Int: Int] = [:]
var emptyDict2 = [Character: String]()
var emptyDict3 = Dictionary<Int, Double>()
সাবস্ক্রিপ্ট নোটেশন ব্যবহার করে আপনি মান অ্যাক্সেস করতে পারেন: ডিকশনারির নামের পরে তৃতীয় বন্ধনীর ভেতরে কী (key) বসিয়ে দিন।
যেহেতু কোনো কী (key) ডিকশনারিতে নাও থাকতে পারে, তাই সাবস্ক্রিপ্ট অ্যাক্সেস একটি অপশনাল (Value?) রিটার্ন করে।
কী (key) উপস্থিত থাকলে 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 দিয়ে ডিক্লেয়ার করা পরিবর্তনযোগ্য ডিকশনারির ক্ষেত্রে আপনি সাবস্ক্রিপ্ট অ্যাসাইনমেন্ট দিয়ে কী (key) ও মানের জোড়া যোগ বা হালনাগাদ করতে পারেন:
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) ও মানের জোড়ার উপর দিয়ে ইটারেশন করতে পারেন।
প্রতিটি আইটেম দেওয়া হয় একটি (key, value) টাপল হিসেবে:
for (name, address) in addresses {
print("\(name) lives at \(address)")
}
ডিকশনারি ক্রমহীন হওয়ায়, সেগুলো সাজালে কী (key) ও মানের জোড়ার একটি অ্যারে তৈরি হয়।
আপনি 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)
এই অনুশীলনীতে আপনি আপনার এলাকার আর্কেড হলের সবচেয়ে জনপ্রিয় গেমটির হাই স্কোর হিসাব রাখার একটি উপায় তৈরি করবেন।
এখানে আপনার তৈরি করার জন্য ৭টি ফাংশন আছে, যেগুলোর সবগুলোই হাই স্কোরের ডেটার একটি ডিকশনারি রিটার্ন করা ও পরিবর্তন করার সাথে সম্পর্কিত।
এমন একটি ফাংশন newScoreBoard() তৈরি করুন যা কোনো প্যারামিটার নেয় না এবং একটি নতুন হাই স্কোর ডিকশনারি রিটার্ন করে, যেটি কী (key)-এর জন্য String টাইপের মান আর ভ্যালু হিসেবে Int টাইপের মান ব্যবহার করে।
হাই স্কোর ডিকশনারিতে একজন খেলোয়াড় যোগ করতে addPlayer(_:_:_:) ডিফাইন করুন, যা একটি ফাংশন এবং ৩টি প্যারামিটার নেয়:
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(_:_:) ডিফাইন করুন, যা ২টি প্যারামিটার নেয়:
খেলোয়াড়টি ডিকশনারিতে থাকলে এই ফাংশনটি তাকে সরিয়ে দেবে, আর না থাকলে কিছুই করবে না।
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(_:_:) ডিফাইন করুন, যা ২টি প্যারামিটার নেয়:
ফাংশনটি খেলোয়াড়ের স্কোর 0 করে দেবে। খেলোয়াড়টি ডিকশনারিতে না থাকলে কিছুই হওয়া উচিত নয়।
var highScores = ["Dave Thomas": 486_373, "José Valim": 10]
resetScore(&highScores, "Dave Thomas")
// Returns ["Dave Thomas": 0, "José Valim": 10]
আগের স্কোরের সাথে যোগ করে একজন খেলোয়াড়ের স্কোর আপডেট করতে updateScore ডিফাইন করুন, যা ৩টি প্যারামিটার নেয়:
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 ফাংশনটি ডিফাইন করুন, যা ১টি প্যারামিটার নেয়:
ফাংশনটি (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 ডিফাইন করুন, যা ১টি প্যারামিটার নেয়:
ফাংশনটি (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টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।