জেনেরিকের মাধ্যমে আমরা এমন ফাংশন বা মেথড লিখতে পারি, যা যে কোন ধরণের টাইপের ডেটায় ব্যবহার করা যাবে। যেমন আমরা কম্পেয়ার করার জন্য একটা ফাংশন লিখলাম। যদি ফাংশনটি জেনেরিক না হয়, তাহলে ইন্টিজারের জন্য একটা ফাংশন, স্ট্রিং এর জন্য একটা ফাংশন আবার নিজেদের কাস্টম টাইপের জন্য আরেকটা ফাংশন লিখতে হবে। একই কাজ করে, এমন ফাংশন একাধিক বার না লিখে একটা জেনেরিক ফাংশন লিখতে পারি, যা যে কোন টাইপে কাজ করবে।
জেনেরিক ফাংশন
জেনেরিক ফাংশন সাধারণ ফাংশনের মতই। এখানে ফাংশনের নামের পর এঙ্গেল ব্র্যাকেট (<>
) এর ভেতরে একটা প্ল্যাসহোল্ডার ব্যবহার করা হয়। সাধারণত T ব্যবহার করা হয় প্লেস হোল্ডার হিসেবে। এখানে T দিয়ে বোঝানো হয় যে কোন টাইপ। এরপর কোন প্যারামিটার থাকলে ঐ প্যারামিটার গুলো লিখতে হয়। জেনেরিক ফাংশনের সিনট্যাক্সঃ
func functionName<T>(data: T){
...
}
নিচের ফাংশনটি দেখিঃ
func add(a: Int, b: Int) -> Int {
return a + b
}
print(add(a: 2, b: 2))
এটা শুধু মাত্র ইন্টিজার ইনপুট নিতে পারবে। এখন যদি ডাবল নাম্বার যোগ করতে চাই, তাহলে ফাংশনটি লিখতে হবে এভাবেঃ
func add(a: Double, b: Double) -> Double {
return a + b
}
print(add(a: 2.6, b: 2.4))
এভাবে একই কাজের জন্য একাধিক ফাংশন না লিখে একটা জেনেরিক ফাংশন লিখতে পারি এভাবেঃ
func add<T: Numeric>(a: T, b: T) -> T {
return a + b
}
print(add(a: 2, b: 2))
print(add(a: 2.6, b: 2.4))
এখন উপরের জেনেরিক ফাংশন ব্যবহার করে আমরা যে কোন ধরণের সংখ্যা যোগ করতে পারব।
উপরের জেনেরিক ফাংশন এভাবেও লিখতে পারি যেন ফাংশন কল করার সময় আলাদা করে প্লেসহোল্ডার না লিখতে হয়ঃ
func add<T: Numeric>(_ a: T, _ b: T) -> T {
return a + b
}
print(add(2, 2))
print(add(2.6, 2.4))
জেনেরিক টাইপ
জেনেরিক ফাংশনের মত আমরা ক্লাস, স্ট্র্যাকচার বা এনামের মাধ্যমে জেনেরিক টাইপও তৈরি করে নিতে পারি। এই ক্লাস, স্ট্র্যাকচারে বা এনামে যে কোন টাইপের ডেটা নিয়ে কাজ করা যাবে। যেমন নিচের সুইফটে স্ট্যাক ইমপ্লিমেন্টেশন কোডটি দেখিঃ
struct Stack<Element> {
private var elements = [Element]()
mutating func push(_ element: Element) {
elements.append(element)
}
mutating func pop() -> Element? {
return elements.popLast()
}
}
উপরের স্ট্যাক হচ্ছে একটা জেনেরিক স্ট্যাক। যেখানে আমরা যে কোন টাইপের ডেটা ব্যবহার করতে পারব। এখানে প্লেসহোল্ডার হিসেবে সাধারণত Element
ব্যবহার করা হয়, যা দিয়ে বোঝানো হয় যে কোন ধরণের ইলিম্যান্ট আমরা এই জেনেরিক টাইপে ব্যবহার করতে পারব। যেমন উপরের স্ট্যাকে আমরা এভাবে একের অধিক ডেটা টাইপ নিয়ে কাজ করতে পারিঃ
var intStack = Stack<Int>()
intStack.push(1)
intStack.push(2)
print(intStack.pop()) // Output: Optional(2)
var stringStack = Stack<String>()
stringStack.push("Swift")
stringStack.push("is")
stringStack.push("fun")
print(stringStack.pop()) // Output: Optional("fun")
সুইফট নিয়ে অন্যান্য লেখা গুলোঃ বাংলায় সুইফট প্রোগ্রামিং