একটি সুইচ স্টেটমেন্ট দিয়ে আপনি একটি মানকে একাধিক সম্ভাব্য মিলে যাওয়া মানের সাথে তুলনা করতে পারেন।
এটি একাধিক else-if স্টেটমেন্ট ব্যবহার করার চেয়ে বেশি সংক্ষিপ্ত কোড লিখতে দেয়।
একটি সুইচ স্টেটমেন্ট শুরু হয় switch কিওয়ার্ড দিয়ে, তারপরে থাকে যে মানটি তুলনা করা হবে।
এরপর আপনি case কিওয়ার্ড আর তারপরে যে মানের সাথে তুলনা করা হবে তা দিয়ে কেসগুলো ডিফাইন করতে পারেন।
কোনো কেস মিলে না গেলে ডিফল্ট কেস ডিফাইন করতে default কিওয়ার্ড ব্যবহার করা হয়।
else-if স্টেটমেন্টের মতোই, switch স্টেটমেন্ট শুধু প্রথম মিলে যাওয়া কেসের সাথে যুক্ত কোড ব্লকটিই চালায়।
switch value {
case 1:
print("One")
case 2:
print("Two")
default:
print("Other")
}
নিচের উদাহরণটি দেখুন:
if str == "apple" {
print("Let's bake an apple crumble")
} else if str == "lemon" {
print("Let's bake a lemon meringue pie!")
} else if str == "peach" {
print("Let's bake a peach pie!")
} else {
print("Let's buy ice cream.")
}
এটির বদলে এভাবে লেখা যেতে পারে:
switch str {
case "apple":
print("Let's bake an apple crumble")
case "lemon":
print("Let's bake a lemon meringue pie!")
case "peach":
print("Let's bake a peach pie!")
default:
print("Let's buy ice cream.")
}
একটি হোয়াইল লুপ হলো একটি কন্ট্রোল ফ্লো স্টেটমেন্ট, যা দিয়ে নির্দিষ্ট একটি শর্ত ট্রু থাকা পর্যন্ত কোড চালানো যায়। Swift দুই ধরনের হোয়াইল লুপ দেয়: while আর repeat-while লুপ। হোয়াইল লুপের শর্ত লুপ বডি চালানোর আগে যাচাই করা হয়; শর্তটি ফলস হলে লুপ বডি একেবারেই চালানো হবে না। Swift-এ হোয়াইল লুপের গঠনটি এরকম:
while <#condition#> {
<#code#>
}
এখানে count 0-এর চেয়ে বড় থাকা পর্যন্ত লুপটি চলবে এবং তাই 2, 1 আর "Liftoff!" প্রিন্ট করবে।
var count = 2
while count > 0 {
print("\(count)…")
count -= 1
}
print("Liftoff!")
// prints:
// 2…
// 1…
// Liftoff!
একটি repeat-while লুপ হোয়াইল লুপের মতোই, তবে শর্তটি লুপ বডি চালানোর পরে যাচাই করা হয়। এর মানে হলো লুপ বডি অন্তত একবার চালানো হবে, এমনকি শর্তটি ফলস হলেও। Swift-এ repeat-while লুপের গঠনটি এরকম:
repeat {
<#code#>
} while <#condition#>
এখানে শর্তটি ফলস হওয়ায় লুপটি শুধু একবারই চলবে। যেহেতু এটি একটি repeat-while লুপ, তাই শর্ত যাচাইয়ের আগে লুপ বডি একবার চলবে।
var count = 2
repeat {
print("\(count)…")
} while count < 0
print("Liftoff!")
Swift-এ এমন কিছু স্টেটমেন্ট আছে যা লুপের স্বাভাবিক কন্ট্রোল ফ্লো পরিবর্তন করতে ব্যবহার করা যায়।
এগুলোকে কন্ট্রোল ট্রান্সফার স্টেটমেন্ট বলা হয়।
আপনি ইতিমধ্যেই return দেখেছেন; এই কনসেপ্টে আরও কয়েকটি পরিচয় করানো হবে, যার মধ্যে আছে continue, break আর লেবেল।
এই কনসেপ্টে আমরা fallthrough নিয়ে আলোচনা করব না, তবে এটি সম্পর্কে Swift বই-তে পড়তে পারেন।
মাঝে মাঝে লুপের বর্তমান ইটারেশনের বাকি স্টেটমেন্টগুলো শেষ না করেই আগেভাগে পরের ইটারেশনে চলে যাওয়া দরকার হয়।
এর জন্য continue কিওয়ার্ড ব্যবহার করা যায়।
continue চালানো হলে লুপটি পরের যাচাইয়ে চলে যায়, অর্থাৎ লুপের পরের ইটারেশনটি চালানো যায় কি না তা দেখে, মানে হোয়াইল ও repeat-while লুপে while, আর for-in লুপে সিকোয়েন্সে আরেকটি এলিমেন্ট আছে কি না সেই যাচাই।
count = 1
while count < 6 {
count += 1
if count == 4 { continue }
print(count)
}
// prints:
// 2
// 3
// 5
লুপ থেকে আগেভাগে বেরিয়ে আসতে ব্রেক ব্যবহার করা হয়।
break চালানো হলে লুপটি সঙ্গে সঙ্গে বন্ধ হয়ে যায় এবং প্রোগ্রামটি লুপের পরে থাকা প্রথম স্টেটমেন্ট থেকে চালু থাকে।
for fruit in ["banana", "grapes", "apple", "strawberry", "kiwi", "lemon"] {
if !fruit.count.isMultiple(of: 2) { break }
print(fruit)
}
// prints:
// banana
// grapes
লুপগুলো নেস্টেড থাকলে কখনো কখনো break বা continue দিয়ে সেই লুপের 바াইরের লুপ থেকে বেরিয়ে আসতে বা সেটি আবার চালু করতে চাইতে পারেন, যে লুপের ভেতরে break বা continue ব্যবহার করা হচ্ছে।
এমন ক্ষেত্রে কোন লুপ থেকে বেরোতে হবে বা কোনটি আবার চালু করতে হবে তা নির্দিষ্ট করতে লেবেল ব্যবহার করা যায়।
লুপ শুরু করা while, repeat, বা for-এর আগে একটি নাম আর তারপর একটি কোলন বসিয়ে লুপে লেবেল দেওয়া যায়।
এভাবে লেবেল ব্যবহারের ফল কী হয় তা দেখতে নিচের লুপটি দেখুন।
outerLoop: for fruit in ["banana", "grapes", "apple", "strawberry", "kiwi", "lemon"] {
print("\n--- \(fruit) ---")
for letter in fruit {
guard letter != "n" else { break outerLoop }
print(letter)
}
}
// prints:
// --- banana ---
// b
// a
আপনি একজন বিশেষজ্ঞ মিক্সোলজিস্ট, যিনি মানুষ রাতে বাইরে বেরিয়ে সুস্বাদু পানীয় উপভোগ করার জন্য পানীয় তৈরি করেন। তবে আপনার মনে হলো, একটু কোড লিখে কাজে সাহায্য নিলে নিজের জীবন সহজ করে নিতে পারেন।
ভিন্ন ভিন্ন পানীয় প্রস্তুত করতে ভিন্ন ভিন্ন সময় লাগে:
"beer", "soda" এবং "water" প্রতিটির জন্য ০.৫ মিনিট লাগে।"shot" প্রতিটির জন্য ১.০ মিনিট, "mixed drink" প্রতিটির জন্য ১.৫ মিনিট,"fancy drink" প্রতিটির জন্য ২.৫ মিনিট,"frozen drink" প্রতিটির জন্য ৩.০ মিনিট।timeToPrepare(drinks:) ফাংশনটি লিখুন, যা drinks আর্গুমেন্ট নেয়। এই আর্গুমেন্টে স্ট্রিংয়ের একটি অ্যারে থাকে, যেখানে প্রস্তুত করতে হবে এমন পানীয়গুলো থাকে। অ্যারের সব পানীয় প্রস্তুত করতে মোট যত সময় লাগবে, ফাংশনটি তা রিটার্ন করবে।
timeToPrepare(drinks: ["beer", "frozen drink", "shot"])
// returns 4.5
শিফট শুরু করার সময় প্রথমেই যা করতে হয়, তার একটি হলো সামনের শিফটের জন্য লেবুর কোয়ার ছোট বাক্সটি ভর্তি আছে কি না তা নিশ্চিত করা। লেবুর আকার ভিন্ন ভিন্ন হলে কোয়ার সংখ্যাও ভিন্ন হয়: একটি "small" লেবু থেকে ৬টি কোয়া, একটি "medium" লেবু থেকে ৮টি কোয়া, আর একটি "large" লেবু থেকে ১০টি কোয়া পাওয়া যায়।
যতক্ষণ আরও কোয়া দরকার আর কাটার জন্য আরও লেবু বাকি থাকে, ততক্ষণ অ্যারে থেকে প্রথম লেবুটি নিন এবং আপনার প্রয়োজন অনুযায়ী সেই লেবু থেকে উপযুক্ত সংখ্যক কোয়া বিয়োগ করুন। যতক্ষণ আর কোয়া না লাগে বা লেবু শেষ না হয়ে যায়, ততক্ষণ এভাবে চালিয়ে যান।
makeWedges(needed:limes:) ফাংশনটি লিখুন, যা needed ও limes আর্গুমেন্ট নেয়। needed আর্গুমেন্টে আপনার কতগুলো কোয়া কাটা দরকার সেই সংখ্যা থাকে, আর limes আর্গুমেন্টে স্ট্রিংয়ের একটি অ্যারে থাকে, যেখানে আপনার কাছে কাটার জন্য থাকা লেবুগুলোর আকার থাকে। ফাংশনটি আপনার কতটি লেবু কেটেছেন তার সংখ্যা রিটার্ন করবে।
makeWedges(needed: 25, limes: ["small", "small", "large", "medium", "small"])
// returns 4
অভিনন্দন! আপনার দীর্ঘ কর্মদিবস প্রায় শেষ, আর আপনি শীঘ্রই বাড়ি ফিরে নতুন অ্যাপ নিয়ে কাজ করতে যাবেন। কিন্তু পরের শিফটের কাছে অর্ডার হস্তান্তর করে চলে যাওয়ার আগে আপনাকে একের পর এক পানীয়ের অর্ডার তৈরি করতে হবে।
যতক্ষণ আপনার শিফটে সময় বাকি থাকে, ততক্ষণ অ্যারের প্রথম অর্ডারটি তৈরি করুন এবং তারপর সেই অর্ডারটি অ্যারে থেকে সরিয়ে ফেলুন। এরপর আপনার timeToPrepare(drinks:) ফাংশন অনুযায়ী সেই অর্ডারটি প্রস্তুত করতে যত সময় লেগেছে, তা শিফটে বাকি সময় থেকে বিয়োগ করতে পারেন।
finishShift(minutesLeft:remainingOrders:) ফাংশনটি লিখুন, যা আপনার শিফটে বাকি মিনিটের সংখ্যা (যা ০-এর চেয়ে বড় হবে তা নিশ্চিত) এবং পানীয়ের অর্ডারের একটি খালি নয় এমন অ্যারে নেয়। শিফট শেষ হওয়ার আগে আপনি যে অর্ডারগুলোতে পৌঁছাতে পারেননি, সেগুলোর অ্যারে ফাংশনটি রিটার্ন করবে।
finishShift(minutesLeft: 5, remainingOrders: [["beer", "frozen drink", "shot"], ["fancy drink", "soda"], ["beer", "beer", "water"], ["mixed drink", "frozen drink"]])
// returns [["beer", "beer", "water"], ["mixed drink", "frozen drink"]]
beer আর soda টাটকা আছে কি না তা নিশ্চিত করতে, সেগুলোর অর্ডার এবং অর্ডারগুলো কখন দেওয়া হয়েছিল, তা আপনাকে ট্র্যাক করতে হবে।
orderTracker(orders: [(drink: String, time: String)]) -> (beer: (first: String, last: String, total: Int)?, soda: (first: String, last: String, total: Int)?) ফাংশনটি লিখুন; এটি অর্ডার ও সময়ের একটি তালিকা পেলে beer ও soda-এর প্রথম ও শেষ অর্ডারের সময় এবং প্রতিটির মোট অর্ডার সংখ্যা সম্বলিত একজোড়া অপশনাল টাপল রিটার্ন করে, আর ওই পানীয়গুলোর কোনো অর্ডার না থাকলে nil রিটার্ন করে। অন্য কোনো পানীয় আপনার ট্র্যাক করার দরকার নেই।
orderTracker(orders:) ফাংশনটি লিখুন, যা টাপলের একটি অ্যারে নেয়; প্রতিটি টাপলে অর্ডার করা পানীয় এবং অর্ডারটি দেওয়ার সময় থাকে। ফাংশনটি এমন একটি টাপল রিটার্ন করবে, যেখানে beer কখন প্রথম ও সর্বশেষ অর্ডার হয়েছিল, মোট beer অর্ডারের সংখ্যা, soda কখন প্রথম ও সর্বশেষ অর্ডার হয়েছিল এবং মোট soda অর্ডারের সংখ্যা থাকবে। এটি এই ফরম্যাটের একটি টাপল হিসেবে রিটার্ন করতে হবে: (beer: (first: String, last: String, total: Int)?, soda: (first: String, last: String, total: Int)?)।
let orders = [
(drink: "beer", time: "10:01"), (drink: "frozen drink", time: "10:02"),
(drink: "shot", time: "10:05"), (drink: "fancy drink", time: "10:06"),
(drink: "soda", time: "10:09"), (drink: "beer", time: "10:15"), (drink: "beer", time: "10:22"),
(drink: "water", time: "10:26"), (drink: "mixed drink", time: "10:28"),
(drink: "frozen drink", time: "10:33"),
]
orderTracker(orders: orders)
// returns (beer: (first "10:01", last "10:22", total 3), soda: (first "10:09", last "10:09", total 1))
Exercism-এ সাইন আপ করুন, Swift ট্র্যাকের 35টি কনসেপ্ট116টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।