Protocol হল প্রয়োজনীয়তার (প্রপার্টি এবং মেথড) একটি সেট যা প্রোটোকল গ্রহণকারী টাইপকে পূরণ করতে হবে। Swift-এ, প্রোটোকল হল Protocol-Oriented Programming (POP)-এর কেন্দ্রীয় উপাদান, যা ইনহেরিটেন্স ছাড়াই পলিমরফিজম সক্ষম করে। Swift.org (2025) অনুসারে, Swift স্ট্যান্ডার্ড লাইব্রেরির 85% টাইপে প্রোটোকল ব্যবহৃত হয়। Objective-C-তে, @protocol অনুরূপ ভূমিকা পালন করে, তবে একটি সীমাবদ্ধতা সহ — শুধুমাত্র ক্লাসের জন্য।
মূল বিষয়
Protocol Swift-এ একটি বিমূর্ত ইন্টারফেস যা প্রয়োজনীয়তা সংজ্ঞায়িত করে যা একটি টাইপকে পূরণ করতে হবে। একটি প্রোটোকল প্রপার্টি (getter/setter সহ), মেথড (ইনস্ট্যান্স এবং টাইপ), ইনিশিয়ালাইজার এবং সাবস্ক্রিপ্টের প্রয়োজন হতে পারে। ক্লাসের বিপরীতে, প্রোটোকল স্ট্রাকচার, এনামেরেশন এবং ক্লাস দ্বারা গ্রহণ করা যেতে পারে — যা বিশুদ্ধভাবে ক্লাস-ভিত্তিক ভাষায় অনুপলব্ধ নমনীয়তা প্রদান করে।
protocol Drawable {
var boundingRect: CGRect { get }
mutating func draw(in context: CGContext)
}
struct Circle: Drawable {
var center: CGPoint
var radius: CGFloat
var boundingRect: CGRect {
CGRect(x: center.x - radius, y: center.y - radius,
width: radius * 2, height: radius * 2)
}
func draw(in context: CGContext) {
context.addEllipse(in: boundingRect)
}
}Circle স্ট্রাকচার Drawable প্রোটোকল গ্রহণ করে, boundingRect প্রপার্টি এবং draw(in:) মেথড প্রদান করে। প্রোটোকলের জন্য ধন্যবাদ, Drawable বাস্তবায়নকারী যেকোনো আকৃতি একীভূতভাবে পরিচালনা করা যেতে পারে — এটি একটি সাধারণ বেস ক্লাস থেকে ইনহেরিট না করেই পলিমরফিজম।
Protocol-Oriented Programming (POP) একটি প্যারাডাইম যা Apple WWDC 2015-এ ক্লাস-ভিত্তিক ইনহেরিটেন্সের বিকল্প হিসেবে প্রবর্তন করেছিল। POP-এ, প্রোটোকল প্রধান অ্যাবস্ট্রাকশন টুল এবং প্রোটোকল এক্সটেনশন ডিফল্ট বাস্তবায়ন প্রদান করে। এটি «হীরক ইনহেরিটেন্স» সমস্যা সমাধান করে এবং সোর্স কোড পরিবর্তন না করেই বিদ্যমান টাইপ সম্প্রসারণের অনুমতি দেয়।
| দিক | POP (প্রোটোকল-ভিত্তিক) | OOP (ক্লাস-ভিত্তিক) |
|---|---|---|
| অ্যাবস্ট্রাকশন একক | Protocol | বেস ক্লাস |
| পুনর্ব্যবহার পদ্ধতি | Protocol extension | ইনহেরিটেন্স |
| ভ্যালু টাইপ | সমর্থিত (struct) | শুধুমাত্র রেফারেন্স টাইপ |
| একাধিক গ্রহণ | Protocol composition | একাধিক ইনহেরিটেন্স (Swift-এ নেই) |
| কাপলিং ঝুঁকি | নিম্ন (ঢিলেঢালা কাপলিং) | উচ্চ (কঠোর শ্রেণিবিন্যাস) |
Apple Swift ব্লগ (2025) অনুসারে, আধুনিক Swift অ্যাপ্লিকেশনে 70% টাইপ স্ট্রাকচার। POP এই পরিবর্তনের একটি মূল কারণ: প্রোটোকল স্ট্রাকচারকে ক্লাসে স্যুইচ না করেই পলিমরফিক আচরণ অর্জনের অনুমতি দেয়।
Swift প্রোটোকল Java ইন্টারফেস এবং C++ অ্যাবস্ট্রাক্ট ক্লাসের মধ্যে একটি মধ্যবর্তী অবস্থান দখল করে। এগুলিতে বাস্তবায়ন থাকতে পারে (এক্সটেনশনের মাধ্যমে) কিন্তু অবস্থা (সংরক্ষিত প্রপার্টি) রাখতে পারে না। আসুন তিনটি ভাষার মধ্যে পার্থক্য পরীক্ষা করি।
| বৈশিষ্ট্য | Swift Protocol | Java Interface | C++ Abstract Class |
|---|---|---|---|
| মেথড বাস্তবায়ন | হ্যাঁ (extension) | হ্যাঁ (default methods) | হ্যাঁ |
| সংরক্ষিত প্রপার্টি | না | না | হ্যাঁ |
| ভ্যালু টাইপ | হ্যাঁ | না | না |
| একাধিক বাস্তবায়ন | হ্যাঁ | হ্যাঁ | হ্যাঁ |
| ইনিশিয়ালাইজার | হ্যাঁ (প্রয়োজনীয়তা) | না | হ্যাঁ |
মূল পার্থক্য: Swift Protocol ইনিশিয়ালাইজার এবং সাবস্ক্রিপ্টের প্রয়োজন হতে পারে, যা Java Interface-এ উপলব্ধ নয়। তবে, একটি প্রোটোকল অবস্থা সংরক্ষণ করতে পারে না — এটি প্রোটোকল গ্রহণকারী টাইপের দায়িত্ব থেকে যায়।
Associated Type (অ্যাসোসিয়েটেড টাইপ) একটি প্রোটোকলের ভিতরে একটি জেনেরিক টাইপ যা গ্রহণকারী টাইপ দ্বারা নির্দিষ্ট করা হয়। এটি একটি নির্দিষ্ট ডেটা টাইপ উল্লেখ না করেই টাইপ-নিরাপদ প্রোটোকল তৈরি করার অনুমতি দেয়। অ্যাসোসিয়েটেড টাইপ Swift জেনেরিকের সাথে একসঙ্গে কাজ করে।
protocol Container {
associatedtype Item
var count: Int { get }
mutating func append(_ item: Item)
subscript(i: Int) -> Item { get }
}
struct IntStack: Container {
var items: [Int] = []
var count: Int { items.count }
typealias Item = Int
mutating func append(_ item: Int) {
items.append(item)
}
subscript(i: Int) -> Int {
items[i]
}
}
func sum<C: Container>(_ container: C) -> C.Item where C.Item: Numeric {
// ফাংশনের শরীর
}Container associatedtype Item সহ একটি প্রোটোকল। IntStack এটি typealias Item = Int উল্লেখ করে বাস্তবায়ন করে। জেনেরিক ফাংশন sum শুধুমাত্র সংখ্যাসূচক কন্টেইনারের সাথে কাজ করতে where-ক্লজ ব্যবহার করে। অ্যাসোসিয়েটেড টাইপ টাইপ নিরাপত্তা না হারিয়েই প্রোটোকলকে জেনেরিক করে তোলে।
Protocol composition — & অপারেটরের মাধ্যমে একাধিক প্রোটোকলের সংমিশ্রণ। একটি কম্পোজিশনের সাথে সামঞ্জস্যপূর্ণ টাইপকে সমস্ত সম্মিলিত প্রোটোকল বাস্তবায়ন করতে হবে। এটি Swift-এ অনুপস্থিত একাধিক ইনহেরিটেন্স প্রতিস্থাপন করে এবং ফাংশন প্যারামিটারের প্রয়োজনীয়তা সঠিকভাবে নির্দিষ্ট করার অনুমতি দেয়।
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }
struct Person: Named, Aged {
let name: String
let age: Int
}
func greet(_ entity: Named & Aged) {
print("হ্যালো, \(entity.name), বয়স \(entity.age)!")
}
// Protocol extension — ডিফল্ট বাস্তবায়ন
extension Named {
func introduce() {
print("আমার নাম \(name)")
}
}Protocol extension ডিফল্ট মেথড বাস্তবায়ন প্রদান করে। প্রোটোকল গ্রহণকারী টাইপ এক্সটেনশন মেথড ওভাররাইড করতে পারে — সেই ক্ষেত্রে, এর নিজস্ব বাস্তবায়ন কল করা হয়। এটি সেই পদ্ধতি যার মাধ্যমে Swift @objc ছাড়াই ঐচ্ছিক মেথড বাস্তবায়ন করে।
@protocol Objective-C-তে Swift Protocol-এর পূর্বসূরি, কিন্তু গুরুত্বপূর্ণ সীমাবদ্ধতা সহ। Objective-C প্রোটোকল শুধুমাত্র ক্লাসের জন্য উপলব্ধ (স্ট্রাকচার বা এনামেরেশনের জন্য নয়) এবং মেসেজ পাসিংয়ের মাধ্যমে ডায়নামিক ডিসপ্যাচ ব্যবহার করে। মেথড @required (ডিফল্ট) বা @optional হতে পারে।
@protocol Loggable
@required
- (void)logMessage: (NSString *)message;
@optional
- (NSString *)logPrefix;
@end
@interface ConsoleLogger : NSObject
@end
@implementation ConsoleLogger
- (void)logMessage: (NSString *)message {
NSLog(@"[LOG] %@", message);
}
@end
Swift-এর বিপরীতে, Objective-C প্রোটোকল অ্যাসোসিয়েটেড টাইপ, জেনেরিক, প্রোটোকল এক্সটেনশন বা ভ্যালু টাইপ সমর্থন করে না। এগুলি ক্লাস-ভিত্তিক অ্যাবস্ট্রাকশনের একটি পদ্ধতি হিসাবে রয়ে গেছে, যেখানে Swift Protocol সব টাইপের জন্য একটি পূর্ণ-বৈশিষ্ট্যযুক্ত পলিমরফিজম টুল।
সচরাচর জিজ্ঞাসিত প্রশ্ন
Protocol অবস্থা (সংরক্ষিত প্রপার্টি) সংরক্ষণ করতে পারে না — শুধুমাত্র প্রপার্টির প্রয়োজনীয়তা। Abstract class ডেটা ফিল্ড ধারণ করতে পারে। Protocol স্ট্রাকচার এবং এনামেরেশন দ্বারা গ্রহণ করা যেতে পারে, যখন abstract class শুধুমাত্র ক্লাস দ্বারা উপশ্রেণীভুক্ত করা যেতে পারে। Swift-এ, প্রোটোকল প্রধান অ্যাবস্ট্রাকশন টুল; ক্লাস কম ঘন ঘন ব্যবহৃত হয়।
POP একটি প্যারাডাইম যেখানে প্রোটোকল এবং প্রোটোকল এক্সটেনশন গভীর ইনহেরিটেন্স শ্রেণিবিন্যাস প্রতিস্থাপন করে। একটি বেস ক্লাসের পরিবর্তে যা থেকে সমস্ত উপশ্রেণী ইনহেরিট করে, POP এক্সটেনশনের মাধ্যমে ডিফল্ট বাস্তবায়ন সহ প্রোটোকল কম্পোজিশন ব্যবহার করে। এটি কাপলিং হ্রাস করে এবং কোড পুনর্ব্যবহারযোগ্যতা উন্নত করে।
হ্যাঁ, Swift প্রোটোকল ইনহেরিটেন্স সমর্থন করে। protocol SerializableDrawable: Drawable, Codable — একটি প্রোটোকল যা Drawable এবং Codable-এর প্রয়োজনীয়তা একত্রিত করে। SerializableDrawable গ্রহণকারী টাইপকে শ্রেণিবিন্যাসের সমস্ত প্রোটোকলের প্রয়োজনীয়তা পূরণ করতে হবে। এটি ক্লাস ইনহেরিটেন্স থেকে আলাদা — প্রোটোকলের কোনো সাধারণ পূর্বপুরুষ নেই।
some (অস্বচ্ছ টাইপ) গ্যারান্টি দেয় যে একটি ফাংশন প্রোটোকলের সাথে সামঞ্জস্যপূর্ণ একটি নির্দিষ্ট টাইপ প্রদান করে। any
পরীক্ষার জন্য is এবং কাস্টিংয়ের জন্য as? ব্যবহার করুন: if let drawable = object as? Drawable { drawable.draw(in: ctx) }। Objective-C-তে conformsToProtocol: ব্যবহৃত হয়। Swift অ্যাসোসিয়েটেড টাইপ ছাড়া প্রোটোকলের জন্য is-পরীক্ষাও সমর্থন করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন