Protocol — এটি কী, iOS-এ প্রোটোকল এবং ডেলিগেট

লেখক: IT Sectr প্রকাশিত: 2026-02-18 পড়ার সময়: 10 মিনিট

Protocol হল প্রয়োজনীয়তার (প্রপার্টি এবং মেথড) একটি সেট যা প্রোটোকল গ্রহণকারী টাইপকে পূরণ করতে হবে। Swift-এ, প্রোটোকল হল Protocol-Oriented Programming (POP)-এর কেন্দ্রীয় উপাদান, যা ইনহেরিটেন্স ছাড়াই পলিমরফিজম সক্ষম করে। Swift.org (2025) অনুসারে, Swift স্ট্যান্ডার্ড লাইব্রেরির 85% টাইপে প্রোটোকল ব্যবহৃত হয়। Objective-C-তে, @protocol অনুরূপ ভূমিকা পালন করে, তবে একটি সীমাবদ্ধতা সহ — শুধুমাত্র ক্লাসের জন্য।

মূল বিষয়

Swift-এ প্রোটোকল কী?

Protocol Swift-এ একটি বিমূর্ত ইন্টারফেস যা প্রয়োজনীয়তা সংজ্ঞায়িত করে যা একটি টাইপকে পূরণ করতে হবে। একটি প্রোটোকল প্রপার্টি (getter/setter সহ), মেথড (ইনস্ট্যান্স এবং টাইপ), ইনিশিয়ালাইজার এবং সাবস্ক্রিপ্টের প্রয়োজন হতে পারে। ক্লাসের বিপরীতে, প্রোটোকল স্ট্রাকচার, এনামেরেশন এবং ক্লাস দ্বারা গ্রহণ করা যেতে পারে — যা বিশুদ্ধভাবে ক্লাস-ভিত্তিক ভাষায় অনুপলব্ধ নমনীয়তা প্রদান করে।

Swift
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: Swift প্যারাডাইম

Protocol-Oriented Programming (POP) একটি প্যারাডাইম যা Apple WWDC 2015-এ ক্লাস-ভিত্তিক ইনহেরিটেন্সের বিকল্প হিসেবে প্রবর্তন করেছিল। POP-এ, প্রোটোকল প্রধান অ্যাবস্ট্রাকশন টুল এবং প্রোটোকল এক্সটেনশন ডিফল্ট বাস্তবায়ন প্রদান করে। এটি «হীরক ইনহেরিটেন্স» সমস্যা সমাধান করে এবং সোর্স কোড পরিবর্তন না করেই বিদ্যমান টাইপ সম্প্রসারণের অনুমতি দেয়।

দিকPOP (প্রোটোকল-ভিত্তিক)OOP (ক্লাস-ভিত্তিক)
অ্যাবস্ট্রাকশন এককProtocolবেস ক্লাস
পুনর্ব্যবহার পদ্ধতিProtocol extensionইনহেরিটেন্স
ভ্যালু টাইপসমর্থিত (struct)শুধুমাত্র রেফারেন্স টাইপ
একাধিক গ্রহণProtocol compositionএকাধিক ইনহেরিটেন্স (Swift-এ নেই)
কাপলিং ঝুঁকিনিম্ন (ঢিলেঢালা কাপলিং)উচ্চ (কঠোর শ্রেণিবিন্যাস)

Apple Swift ব্লগ (2025) অনুসারে, আধুনিক Swift অ্যাপ্লিকেশনে 70% টাইপ স্ট্রাকচার। POP এই পরিবর্তনের একটি মূল কারণ: প্রোটোকল স্ট্রাকচারকে ক্লাসে স্যুইচ না করেই পলিমরফিক আচরণ অর্জনের অনুমতি দেয়।

Protocol বনাম abstract class বনাম interface

Swift প্রোটোকল Java ইন্টারফেস এবং C++ অ্যাবস্ট্রাক্ট ক্লাসের মধ্যে একটি মধ্যবর্তী অবস্থান দখল করে। এগুলিতে বাস্তবায়ন থাকতে পারে (এক্সটেনশনের মাধ্যমে) কিন্তু অবস্থা (সংরক্ষিত প্রপার্টি) রাখতে পারে না। আসুন তিনটি ভাষার মধ্যে পার্থক্য পরীক্ষা করি।

বৈশিষ্ট্যSwift ProtocolJava InterfaceC++ Abstract Class
মেথড বাস্তবায়নহ্যাঁ (extension)হ্যাঁ (default methods)হ্যাঁ
সংরক্ষিত প্রপার্টিনানাহ্যাঁ
ভ্যালু টাইপহ্যাঁনানা
একাধিক বাস্তবায়নহ্যাঁহ্যাঁহ্যাঁ
ইনিশিয়ালাইজারহ্যাঁ (প্রয়োজনীয়তা)নাহ্যাঁ

মূল পার্থক্য: Swift Protocol ইনিশিয়ালাইজার এবং সাবস্ক্রিপ্টের প্রয়োজন হতে পারে, যা Java Interface-এ উপলব্ধ নয়। তবে, একটি প্রোটোকল অবস্থা সংরক্ষণ করতে পারে না — এটি প্রোটোকল গ্রহণকারী টাইপের দায়িত্ব থেকে যায়।

প্রোটোকলে Associated Types এবং Generics

Associated Type (অ্যাসোসিয়েটেড টাইপ) একটি প্রোটোকলের ভিতরে একটি জেনেরিক টাইপ যা গ্রহণকারী টাইপ দ্বারা নির্দিষ্ট করা হয়। এটি একটি নির্দিষ্ট ডেটা টাইপ উল্লেখ না করেই টাইপ-নিরাপদ প্রোটোকল তৈরি করার অনুমতি দেয়। অ্যাসোসিয়েটেড টাইপ Swift জেনেরিকের সাথে একসঙ্গে কাজ করে।

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 এবং প্রোটোকল এক্সটেনশন

Protocol composition — & অপারেটরের মাধ্যমে একাধিক প্রোটোকলের সংমিশ্রণ। একটি কম্পোজিশনের সাথে সামঞ্জস্যপূর্ণ টাইপকে সমস্ত সম্মিলিত প্রোটোকল বাস্তবায়ন করতে হবে। এটি Swift-এ অনুপস্থিত একাধিক ইনহেরিটেন্স প্রতিস্থাপন করে এবং ফাংশন প্যারামিটারের প্রয়োজনীয়তা সঠিকভাবে নির্দিষ্ট করার অনুমতি দেয়।

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 ছাড়াই ঐচ্ছিক মেথড বাস্তবায়ন করে।

Objective-C-তে @protocol: Swift থেকে পার্থক্য

@protocol Objective-C-তে Swift Protocol-এর পূর্বসূরি, কিন্তু গুরুত্বপূর্ণ সীমাবদ্ধতা সহ। Objective-C প্রোটোকল শুধুমাত্র ক্লাসের জন্য উপলব্ধ (স্ট্রাকচার বা এনামেরেশনের জন্য নয়) এবং মেসেজ পাসিংয়ের মাধ্যমে ডায়নামিক ডিসপ্যাচ ব্যবহার করে। মেথড @required (ডিফল্ট) বা @optional হতে পারে।

Objective-C
@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 সব টাইপের জন্য একটি পূর্ণ-বৈশিষ্ট্যযুক্ত পলিমরফিজম টুল।

সচরাচর জিজ্ঞাসিত প্রশ্ন

প্রোটোকল কীভাবে abstract class থেকে আলাদা?

Protocol অবস্থা (সংরক্ষিত প্রপার্টি) সংরক্ষণ করতে পারে না — শুধুমাত্র প্রপার্টির প্রয়োজনীয়তা। Abstract class ডেটা ফিল্ড ধারণ করতে পারে। Protocol স্ট্রাকচার এবং এনামেরেশন দ্বারা গ্রহণ করা যেতে পারে, যখন abstract class শুধুমাত্র ক্লাস দ্বারা উপশ্রেণীভুক্ত করা যেতে পারে। Swift-এ, প্রোটোকল প্রধান অ্যাবস্ট্রাকশন টুল; ক্লাস কম ঘন ঘন ব্যবহৃত হয়।

Protocol-Oriented Programming কী?

POP একটি প্যারাডাইম যেখানে প্রোটোকল এবং প্রোটোকল এক্সটেনশন গভীর ইনহেরিটেন্স শ্রেণিবিন্যাস প্রতিস্থাপন করে। একটি বেস ক্লাসের পরিবর্তে যা থেকে সমস্ত উপশ্রেণী ইনহেরিট করে, POP এক্সটেনশনের মাধ্যমে ডিফল্ট বাস্তবায়ন সহ প্রোটোকল কম্পোজিশন ব্যবহার করে। এটি কাপলিং হ্রাস করে এবং কোড পুনর্ব্যবহারযোগ্যতা উন্নত করে।

একটি প্রোটোকল কি অন্য প্রোটোকল ইনহেরিট করতে পারে?

হ্যাঁ, Swift প্রোটোকল ইনহেরিটেন্স সমর্থন করে। protocol SerializableDrawable: Drawable, Codable — একটি প্রোটোকল যা Drawable এবং Codable-এর প্রয়োজনীয়তা একত্রিত করে। SerializableDrawable গ্রহণকারী টাইপকে শ্রেণিবিন্যাসের সমস্ত প্রোটোকলের প্রয়োজনীয়তা পূরণ করতে হবে। এটি ক্লাস ইনহেরিটেন্স থেকে আলাদা — প্রোটোকলের কোনো সাধারণ পূর্বপুরুষ নেই।

প্রোটোকলের প্রসঙ্গে any এবং some কী?

some (অস্বচ্ছ টাইপ) গ্যারান্টি দেয় যে একটি ফাংশন প্রোটোকলের সাথে সামঞ্জস্যপূর্ণ একটি নির্দিষ্ট টাইপ প্রদান করে। any

Swift-এ প্রোটোকল কনফরমেন্স কীভাবে পরীক্ষা করবেন?

পরীক্ষার জন্য is এবং কাস্টিংয়ের জন্য as? ব্যবহার করুন: if let drawable = object as? Drawable { drawable.draw(in: ctx) }। Objective-C-তে conformsToProtocol: ব্যবহৃত হয়। Swift অ্যাসোসিয়েটেড টাইপ ছাড়া প্রোটোকলের জন্য is-পরীক্ষাও সমর্থন করে।

সারসংক্ষেপ

  • Protocol — একটি চুক্তি যা গ্রহণকারী টাইপের জন্য প্রপার্টি, মেথড, ইনিশিয়ালাইজার এবং সাবস্ক্রিপ্টের প্রয়োজনীয়তা সংজ্ঞায়িত করে
  • Protocol-Oriented Programming ক্লাস ইনহেরিটেন্সকে প্রোটোকল কম্পোজিশন এবং এক্সটেনশন দিয়ে প্রতিস্থাপন করে
  • Protocol extension ডিফল্ট বাস্তবায়ন প্রদান করে, @objc ছাড়াই মেথডগুলিকে ঐচ্ছিক করে তোলে
  • Associated types বাস্তবায়নের পাশে টাইপ নির্দিষ্টকরণের সাথে জেনেরিক প্রোটোকল তৈরি করার অনুমতি দেয়
  • Protocol composition & এর মাধ্যমে একাধিক প্রোটোকলের প্রয়োজনীয়তা একত্রিত করে
  • Objective-C @protocol ক্লাসের মধ্যে সীমাবদ্ধ এবং অ্যাসোসিয়েটেড টাইপ, জেনেরিক বা ভ্যালু টাইপ সমর্থন করে না
  • সুপারিশ: Swift-এ প্রোটোকলকে প্রধান অ্যাবস্ট্রাকশন টুল হিসাবে ব্যবহার করুন, শুধুমাত্র রেফারেন্স সিম্যান্টিক্সের প্রয়োজন হলে ক্লাস ব্যবহার করুন

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন