Swift-এ ক্লোজার হলো ফাংশনের মতো একটি স্বাধীন কোড ব্লক যা এক বা একাধিক ইনপুট গ্রহণ করে, এবং আউটপুট রিটার্ন করতে পারে। ক্লোজার ফাংশনের মতোই কাজ করে, কিন্তু ফাংশনের মতো নাম বা
funcকীওয়ার্ড ব্যবহার না করে কোডের ভিতরেই ডিক্লেয়ার করা যায়। ক্লোজার সাধারণত কমপ্যাক্ট এবং সংক্ষিপ্ত হয় এবং উচ্চ-অর্ডার ফাংশন (যেমনmap,filter, এবংreduce) এর সাথে ব্যবহৃত হয়।
Swift-এ ক্লোজার (Closures)
ক্লোজার গঠন
{ (parameters) -> returnType in
// ক্লোজারের কোড
}
parameters: ক্লোজারের ইনপুট প্যারামিটার।returnType: ক্লোজার থেকে রিটার্ন করা মানের টাইপ।in: প্যারামিটার এবং রিটার্ন টাইপের শেষেinব্যবহার করে কোড ব্লক শুরু হয়।
ক্লোজার উদাহরণ
let greeting = { (name: String) -> String in
return "Hello, \(name)!"
}
print(greeting("Alice")) // আউটপুট: "Hello, Alice!"
ক্লোজার সংক্ষেপ করা
Swift-এ ক্লোজার শর্টহ্যান্ড আর্গুমেন্ট ব্যবহার করে আরও সংক্ষিপ্ত করা যায়। উদাহরণস্বরূপ:
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
print(doubled) // আউটপুট: [2, 4, 6, 8, 10]
- এখানে,
$0প্রথম প্যারামিটার নির্দেশ করে।
ক্লোজার ট্রেইলিং
Swift-এ ক্লোজার ট্রেইলিং ব্যবহার করে কোডের পড়াশুনা সহজ করা যায়, বিশেষ করে যখন ফাংশন শেষে ক্লোজার পাস করা হয়:
func performOperation(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
return operation(a, b)
}
let result = performOperation(a: 5, b: 3) { $0 + $1 }
print(result) // আউটপুট: 8
অটো-ক্লোজার
Swift-এ ক্লোজার @autoclosure ব্যবহার করে ডিফাইন করা যায়, যাতে এটি কোনো আর্গুমেন্ট ছাড়াই বিলম্বিত কোড এক্সিকিউশন করতে পারে। উদাহরণ:
func logIfTrue(_ predicate: @autoclosure () -> Bool) {
if predicate() {
print("The condition is true!")
}
}
logIfTrue(5 > 3) // আউটপুট: "The condition is true!"
সংক্ষেপে
Swift-এ ক্লোজার একটি সংক্ষিপ্ত এবং পুনঃব্যবহারযোগ্য কোড ব্লক যা ফাংশনের বিকল্প হিসেবে কাজ করতে পারে। ক্লোজারগুলি ফাংশনের মতোই কাজ করে কিন্তু কমপ্যাক্ট এবং সংক্ষিপ্ত হওয়ার কারণে কোডকে আরও সুগঠিত এবং পড়ার সহজ করে।
Swift-এ ক্লোজার হলো কোড ব্লকের একটি বিশেষ ফর্ম যা একটি ফাংশনের মতো কাজ করে, কিন্তু এটি নামহীন বা অ্যানোনিমাস হতে পারে। ক্লোজার প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ অংশ, যা প্রোগ্রামারদের কোডকে সংক্ষিপ্ত, পুনঃব্যবহারযোগ্য, এবং ফাংশনাল প্রোগ্রামিংয়ের মতো স্টাইলে লিখতে সাহায্য করে। ক্লোজার Swift-এ প্রথম শ্রেণির সিটিজেন, অর্থাৎ ফাংশনের মতোই এদের পাস করা, রিটার্ন করা, বা ভেরিয়েবলে সংরক্ষণ করা যায়।
ক্লোজারের প্রকারভেদ
Swift-এ ক্লোজার তিন ধরনের হতে পারে:
- Global Function: এরা সাধারণত নাম সহ কোড ব্লক।
- Nested Function: ফাংশনের ভিতরে ফাংশন।
- Closure Expressions: অ্যানোনিমাস ক্লোজার যা কোডের ভিতরেই লেখা হয়, এবং সাধারণত সরল ও সংক্ষিপ্ত হয়।
ক্লোজারের সাধারণ গঠন
{ (parameters) -> ReturnType in
// কোড ব্লক
}
parameters: ক্লোজারের ইনপুট প্যারামিটার।ReturnType: ক্লোজারের আউটপুটের টাইপ।in: ক্লোজারের প্যারামিটার লিস্ট এবং কোড ব্লকের মাঝে ব্যবহৃত কীওয়ার্ড।- কোড ব্লক: ক্লোজারের কার্যক্রম বা কাজ যা এক্সিকিউট হবে।
একটি ক্লোজারের উদাহরণ
let greet = { (name: String) -> String in
return "Hello, \(name)!"
}
// ক্লোজার কল করা
let message = greet("Alice")
print(message) // Output: "Hello, Alice!"
- এখানে
greetএকটি ক্লোজার, যা একটিStringপ্যারামিটার গ্রহণ করে এবং একটিStringরিটার্ন করে। - ক্লোজারটি
"Hello, Alice!"আউটপুট দেয়, কারণ আমরাgreet("Alice")কল করেছি।
ক্লোজারের সংক্ষিপ্ত রূপ (Shorthand Syntax)
Swift-এ ক্লোজারকে আরও সংক্ষিপ্তভাবে লেখা যায়। যদি ক্লোজারের প্যারামিটারের টাইপ এবং রিটার্ন টাইপ জানা থাকে, তাহলে সেগুলি বাদ দেয়া যায়।
let greet = { name in
"Hello, \(name)!"
}
// ক্লোজার কল করা
let message = greet("Bob")
print(message) // Output: "Hello, Bob!"
- এখানে আমরা টাইপ ডিক্লেয়ার এবং
returnকীওয়ার্ড বাদ দিয়েছি, কারণ Swift এগুলো অনুমান করতে পারে।
ক্লোজার ব্যবহার করা: ফাংশনের প্যারামিটার হিসেবে
Swift-এ ক্লোজার প্রায়শই ফাংশনের প্যারামিটার হিসেবে ব্যবহার করা হয়। এটি কোডকে আরও সংক্ষিপ্ত এবং ফ্লেক্সিবল করে তোলে।
func performOperation(_ operation: (Int, Int) -> Int) {
let result = operation(5, 3)
print("Result: \(result)")
}
// অ্যাডিশন ক্লোজার পাস করা
performOperation({ (a, b) in a + b }) // Output: "Result: 8"
// মাল্টিপ্লিকেশন ক্লোজার পাস করা
performOperation({ (a, b) in a * b }) // Output: "Result: 15"
- এখানে
performOperationফাংশনটি একটি ক্লোজার গ্রহণ করে, যা দুটি ইন্টিজার ইনপুট নিয়ে একটি ইন্টিজার আউটপুট দেয়। - আমরা এই ফাংশনে দুটি আলাদা ক্লোজার পাস করেছি: একটি অ্যাডিশন এবং একটি মাল্টিপ্লিকেশন অপারেশনের জন্য।
ট্রেইলিং ক্লোজার (Trailing Closure)
যখন একটি ক্লোজার ফাংশনের শেষ প্যারামিটার হিসেবে ব্যবহৃত হয়, তখন আমরা সেটিকে ট্রেইলিং ক্লোজার হিসেবে লিখতে পারি, যা কোডকে আরও পরিষ্কার করে।
performOperation { (a, b) in
a - b
} // Output: "Result: 2"
- এখানে আমরা ট্রেইলিং ক্লোজার ব্যবহার করেছি, যা
performOperationফাংশনের শেষে এসেছে। এটি কোডকে আরও সরল ও পড়তে সহজ করে তোলে।
স্বয়ংক্রিয়ভাবে নির্ধারিত প্যারামিটার (Shorthand Argument Names)
Swift-এ ক্লোজারে প্যারামিটারগুলিকে সরাসরি $0, $1, $2 ইত্যাদি দিয়ে রেফার করা যায়, যখন প্যারামিটারের নাম উল্লেখ না করে কাজ করা যায়। এটি কোডকে আরও সংক্ষিপ্ত করে।
performOperation {
$0 * $1
} // Output: "Result: 15"
- এখানে
$0প্রথম প্যারামিটার এবং$1দ্বিতীয় প্যারামিটার হিসেবে ব্যবহার করা হয়েছে।
ক্লোজার ব্যবহার: Sort, Map, এবং Filter ফাংশনের সাথে
Swift-এ ক্লোজার প্রায়ই বিল্ট-ইন ফাংশন যেমন sort, map, এবং filter এর সাথে ব্যবহৃত হয়।
১. sort ফাংশন
let numbers = [5, 2, 8, 1, 3]
let sortedNumbers = numbers.sorted { $0 < $1 }
print(sortedNumbers) // Output: [1, 2, 3, 5, 8]
- এখানে, ক্লোজারটি ব্যবহার করে অ্যারে
numbersএর ভ্যালুগুলি ছোট থেকে বড় সাজানো হয়েছে।
২. map ফাংশন
let numbers = [1, 2, 3, 4]
let squaredNumbers = numbers.map { $0 * $0 }
print(squaredNumbers) // Output: [1, 4, 9, 16]
mapফাংশন প্রতিটি উপাদানকে ক্লোজারে উল্লেখিত কাজ অনুযায়ী পরিবর্তন করে একটি নতুন অ্যারে তৈরি করে।
৩. filter ফাংশন
let numbers = [1, 2, 3, 4, 5, 6]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // Output: [2, 4, 6]
filterফাংশন একটি ক্লোজার ব্যবহার করে অ্যারের সেই উপাদানগুলো ফিল্টার করে যেগুলি শর্ত পূরণ করে (যেমন, জোড় সংখ্যা)।
উপসংহার
Swift-এ ক্লোজার হলো একটি শক্তিশালী টুল, যা প্রোগ্রামের কোডকে সংক্ষিপ্ত, পুনঃব্যবহারযোগ্য, এবং ফাংশনাল প্রোগ্রামিংয়ের মতো স্টাইলে লিখতে সহায়ক। ক্লোজারের ব্যবহার কোডকে আরও মডিউলার এবং সহজপাঠ্য করতে সহায়ক।
- ফাংশনের প্যারামিটার হিসেবে ক্লোজার ব্যবহার, ট্রেইলিং ক্লোজার, এবং শর্তসাপেক্ষ লজিক বা অ্যারে প্রসেসিংয়ের জন্য ক্লোজার Swift প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ অংশ।
Swift-এ ক্লোজার একটি শক্তিশালী ফিচার, যা একটি কোড ব্লককে ভেরিয়েবল হিসেবে সংরক্ষণ করে পরবর্তীতে ব্যবহার করা যায়। ট্রেইলিং ক্লোজার (Trailing Closure) সিনট্যাক্স Swift-এর ক্লোজারের একটি বিশেষ সিনট্যাক্স, যা কোডকে আরও সংক্ষিপ্ত ও পাঠযোগ্য করে। এটি ব্যবহার করা হয় যখন একটি ফাংশনের শেষ প্যারামিটার একটি ক্লোজার হয়।
Swift-এ ট্রেইলিং ক্লোজার সিনট্যাক্স
ট্রেইলিং ক্লোজার সিনট্যাক্স কীভাবে কাজ করে?
যখন একটি ফাংশনের শেষ প্যারামিটার একটি ক্লোজার হয়, তখন আপনি ক্লোজার ব্লকটিকে সরাসরি ফাংশন কলের পর বন্ধনী ({ }) দিয়ে রাইট করতে পারেন। এটি কোডকে পরিষ্কার ও সংক্ষিপ্ত করে তোলে, বিশেষ করে যখন ক্লোজার বড় হয়।
সাধারণ সিনট্যাক্স:
functionName(parameter1: value1, parameter2: value2) {
// ক্লোজারের কোড
}
উদাহরণ ১: ট্রেইলিং ক্লোজার ব্যবহার করা
প্রথমে, একটি সাধারণ ফাংশন যেখানে একটি ক্লোজার প্যারামিটার আছে:
func performOperation(number: Int, operation: (Int) -> Int) {
let result = operation(number)
print("Result: \(result)")
}
এই ফাংশনটি একটি সংখ্যা (number) গ্রহণ করে এবং একটি ক্লোজার (operation) কল করে, যা সংখ্যা নিয়ে কিছু কাজ করে।
এখন, আমরা ফাংশনটি সাধারণভাবে এবং ট্রেইলিং ক্লোজার ব্যবহার করে কল করবো:
// সাধারণভাবে ফাংশন কল করা (ট্রেইলিং ক্লোজার ছাড়া)
performOperation(number: 5, operation: { (num: Int) -> Int in
return num * num
})
// ট্রেইলিং ক্লোজার সিনট্যাক্স ব্যবহার করা
performOperation(number: 5) { num in
return num * num
}
উপরের কোডে, আমরা performOperation ফাংশনটি দুটি পদ্ধতিতে কল করেছি। দ্বিতীয় পদ্ধতিতে, আমরা ট্রেইলিং ক্লোজার সিনট্যাক্স ব্যবহার করেছি, যেখানে ক্লোজারটিকে সরাসরি ফাংশন কলের পরে {} বন্ধনী দিয়ে লেখা হয়েছে। এটি কোডকে আরও সংক্ষিপ্ত করেছে এবং পড়তে সহজ করেছে।
উদাহরণ ২: আরও সরল করা ট্রেইলিং ক্লোজার
Swift-এ ক্লোজার সিনট্যাক্স আরও সরল করা যায়। যেমন, যদি ক্লোজারে শুধুমাত্র একটি এক্সপ্রেশন থাকে এবং প্যারামিটারের টাইপ বা রিটার্ন টাইপ ইনফার করা যায়, তাহলে আমরা return কীওয়ার্ডটি এবং প্যারামিটারগুলির নামও বাদ দিতে পারি:
performOperation(number: 5) {
$0 * $0
}
এখানে $0 হচ্ছে ক্লোজারের প্রথম প্যারামিটার, যা num হিসাবে ব্যবহৃত হয়। এই কোডটি আরও সংক্ষিপ্ত এবং সহজ হয়েছে।
উদাহরণ ৩: sort ফাংশনে ট্রেইলিং ক্লোজার ব্যবহার
Swift-এ বিল্ট-ইন ফাংশন যেমন sort ফাংশনে ট্রেইলিং ক্লোজার প্রায়ই ব্যবহৃত হয়। নিচে একটি উদাহরণ দেওয়া হলো:
let numbers = [3, 1, 4, 2, 5]
// সাধারণভাবে `sort` ফাংশন ব্যবহার করা
let sortedNumbers = numbers.sorted(by: { (a: Int, b: Int) -> Bool in
return a < b
})
// ট্রেইলিং ক্লোজার ব্যবহার করে `sort` ফাংশন
let sortedNumbersTrailing = numbers.sorted { $0 < $1 }
print(sortedNumbersTrailing)
এখানে sorted ফাংশনে আমরা ট্রেইলিং ক্লোজার ব্যবহার করেছি, যা a < b লজিকটি $0 < $1 হিসাবে সরাসরি নির্ধারণ করে।
উপসংহার
Swift-এ ট্রেইলিং ক্লোজার সিনট্যাক্স:
- কোডকে সংক্ষিপ্ত, পাঠযোগ্য, এবং সহজ করে তোলে।
- যখন ফাংশনের শেষ প্যারামিটার একটি ক্লোজার হয়, তখন এটি ব্যবহার করতে সুবিধা হয়।
- কোডের জটিলতা কমাতে এবং পুনঃব্যবহারযোগ্যতা বাড়াতে সাহায্য করে।
Swift-এ ট্রেইলিং ক্লোজার একটি শক্তিশালী টুল, যা আপনি ফাংশন এবং ক্লোজার নিয়ে কাজ করার সময় দক্ষতার সাথে ব্যবহার করতে পারেন।
Swift-এ ক্লোজার এক্সপ্রেশন হলো এমন একটি ফাংশনাল কোড ব্লক যা ইনলাইনভাবে সংজ্ঞায়িত করা হয় এবং কোনো নির্দিষ্ট নাম ছাড়াই কাজ করতে পারে। এটি ফাংশনের মতো কাজ করে এবং উচ্চ-অর্ডার ফাংশনগুলির (যেমন map, filter, এবং reduce) সাথে ব্যবহার করা হয়। ক্লোজার এক্সপ্রেশন ফাংশনের সংক্ষিপ্ত এবং ইনলাইন ভার্সন হিসেবে কাজ করে, যা কোডকে আরও কমপ্যাক্ট ও সহজপাঠ্য করে তোলে।
ক্লোজার এক্সপ্রেশন উদাহরণ
let greeting = { (name: String) -> String in
return "Hello, \(name)!"
}
print(greeting("Alice")) // আউটপুট: "Hello, Alice!"
ইনলাইন ফাংশন উদাহরণ
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
print(doubled) // আউটপুট: [2, 4, 6, 8, 10]
- এখানে,
{ $0 * 2 }একটি ইনলাইন ক্লোজার যা প্রতিটি উপাদানের গুণফল প্রদান করে।
ক্লোজার এক্সপ্রেশন সংক্ষেপ করা
Swift ক্লোজার এক্সপ্রেশনকে সংক্ষিপ্ত করার জন্য নিম্নলিখিত শর্তগুলো মেনে চলে:
- ইনলাইন প্যারামিটার নাম ব্যবহার: যেমন
$0,$1ইত্যাদি। - ইনফার টাইপ: Swift প্যারামিটারের টাইপ এবং রিটার্ন টাইপ স্বয়ংক্রিয়ভাবে নির্ধারণ করতে পারে, ফলে এগুলো বাদ দেয়া যায়।
- ইনফার রিটার্ন স্টেটমেন্ট: যদি ক্লোজারে একটি মাত্র এক্সপ্রেশন থাকে, তাহলে
returnবাদ দেয়া যায়।
সংক্ষেপিত উদাহরণ:
let numbers = [1, 2, 3, 4, 5]
let tripled = numbers.map { $0 * 3 }
print(tripled) // আউটপুট: [3, 6, 9, 12, 15]
ক্লোজার এক্সপ্রেশন বনাম ইনলাইন ফাংশন
- ক্লোজার এক্সপ্রেশন: নামহীন এবং ইনলাইন কোড ব্লক যা নির্দিষ্ট প্যারামিটার গ্রহণ করে এবং ফলাফল প্রদান করে।
- ইনলাইন ফাংশন: নামকৃত ফাংশনের বিকল্প হিসেবে ব্যবহৃত সংক্ষিপ্ত ফর্ম, যা কোডকে সহজপাঠ্য এবং ম্যানেজ করা সহজ করে।
ক্লোজার এক্সপ্রেশন এবং ইনলাইন ফাংশন Swift-এ প্রোগ্রামিং করার সময় কোড সংক্ষিপ্ত এবং কার্যকর রাখতে সহায়ক।
Read more