Swift-এ Protocol — এটি কী, সিনট্যাক্স এবং সম্ভাবনাগুলি

লেখক: IT Sectr প্রকাশিত: 2026-06-17 পড়ার সময়: 6 মিনিট

Protocol Swift-এ একটি চুক্তি যা প্রয়োজনীয়তার একটি সেট সংজ্ঞায়িত করে যা কোনও গ্রহণকারী টাইপকে পূরণ করতে হবে। প্রোটোকলগুলি প্রোটোকল-ওরিয়েন্টেড প্রোগ্রামিং (POP) এর ভিত্তি — একটি প্যারাডাইম যা Apple ক্লাসিক্যাল OOP-এর পাশাপাশি Swift-এর জন্য সুপারিশ করেছে। Apple Documentation, 2026 অনুসারে, স্ট্রাকচার, ক্লাস এবং এনাম প্রোটোকল গ্রহণ করতে পারে, যা আর্কিটেকচারকে নমনীয় এবং পরীক্ষাযোগ্য করে তোলে।

মূল পয়েন্ট

  • Protocol — স্ট্রাকচার, ক্লাস এবং এনামের জন্য প্রয়োজনীয়তা সহ একটি চুক্তি
  • প্রয়োজনীয়তাগুলি মেথড, প্রপার্টি, ইনিশিয়ালাইজার এবং সাবস্ক্রিপ্ট অন্তর্ভুক্ত করে
  • Protocol Composition একাধিক প্রোটোকল একত্রিত করার অনুমতি দেয়
  • POP — প্রোটোকল-ওরিয়েন্টেড প্রোগ্রামিং, ইনহেরিটেন্সের বিকল্প
  • Protocol Extensions মেথডের জন্য ডিফল্ট ইমপ্লিমেন্টেশন যোগ করে

Swift-এ Protocol কী?

Protocol একটি অ্যাবস্ট্র্যাক্ট ইন্টারফেস যা নির্ধারণ করে একটি টাইপ কী করতে সক্ষম হবে, কিন্তু এটি কীভাবে করে তা নয়। Swift-এ, প্রোটোকল Java বা Go-র ইন্টারফেসের অনুরূপ, তবে অতিরিক্ত ক্ষমতা সহ।

একটি প্রোটোকল প্রয়োজন করতে পারে:

  • ইনস্ট্যান্স এবং টাইপ মেথড (স্ট্যাটিক)
  • প্রপার্টি { get } বা { get set } স্পেসিফায়ার সহ
  • ইনিশিয়ালাইজার
  • সাবস্ক্রিপ্ট
  • Associated types (প্রোটোকল স্তরে জেনেরিক)

WWDC 2015 অনুসারে, Apple Swift অ্যাপ্লিকেশন আর্কিটেকচারের জন্য প্রোটোকল-ওরিয়েন্টেড প্রোগ্রামিংকে একটি মৌলিক পদ্ধতি হিসাবে প্রবর্তন করেছে। OOP-এর বিপরীতে, যেখানে ক্লাস ইনহেরিটেন্স কঠোর শ্রেণীবিন্যাস তৈরি করে, POP প্রোটোকল কম্পোজিশন প্রদান করে। এটি নমনীয়তা দেয়: একটি একক টাইপ একাধিক প্রোটোকল মেনে চলতে পারে, এক্সটেনশনের মাধ্যমে তাদের প্রয়োজনীয়তা এবং ইমপ্লিমেন্টেশন অর্জন করে।

প্রোটোকল ডিক্লেয়ারেশনের সিনট্যাক্স

Protocol কীওয়ার্ড protocol, একটি নাম এবং বডি দিয়ে ডিক্লেয়ার করা হয়।

swift
protocol Drawable {
    func draw(context: CGContext)
    var boundingBox: CGRect { get }
}

একটি টাইপ তার নামের পরে কোলন ব্যবহার করে একটি প্রোটোকল গ্রহণ করে:

swift
struct Circle: Drawable {
    let center: CGPoint
    let radius: CGFloat

    func draw(context: CGContext) {
        context.addArc(center: center, radius: radius, ...)
    }

    var boundingBox: CGRect {
        CGRect(x: center.x - radius, y: center.y - radius,
               width: radius * 2, height: radius * 2)
    }
}

একটি টাইপ কমা দিয়ে আলাদা করে একাধিক প্রোটোকল গ্রহণ করতে পারে: struct MyType: ProtocolA, ProtocolB। কম্পাইলার যাচাই করে যে প্রতিটি প্রোটোকলের সমস্ত প্রয়োজনীয়তা পূরণ হয়েছে কিনা।

প্রপার্টি এবং মেথডের প্রয়োজনীয়তা

প্রপার্টি প্রয়োজনীয়তা কীওয়ার্ড var এবং অ্যাক্সেস স্পেসিফায়ার { get } বা { get set } দিয়ে ডিক্লেয়ার করা হয়।

swift
protocol UserProtocol {
    var name: String { get }
    var age: Int { get set }
    static var maxAge: Int { get }
    mutating func updateName(_ newName: String)
}

প্রোটোকলে কীওয়ার্ড mutating নির্দেশ করে যে মেথড self পরিবর্তন করতে পারে। স্ট্রাকচারগুলিকে এই ধরনের মেথড mutating হিসাবে ইমপ্লিমেন্ট করতে হবে, যেখানে ক্লাসগুলি এটি বাদ দিতে পারে। মেথড প্রয়োজনীয়তা সম্পূর্ণ সিগনেচার সহ ডিক্লেয়ার করা হয়, প্যারামিটার লেবেল সহ।

প্রোটোকল ইনহেরিটেন্স

Protocol অন্য একটি প্রোটোকল ইনহেরিট করতে পারে, নতুন প্রয়োজনীয়তা যোগ করতে পারে। এটি কঠোর ক্লাস কাপলিং ছাড়াই চুক্তির একটি শ্রেণীবিন্যাস তৈরি করে।

swift
protocol Vehicle {
    var speed: Double { get set }
    func move()
}

protocol Flyable: Vehicle {
    var altitude: Double { get set }
    func takeOff()
}

Flyable গ্রহণকারী টাইপকে উভয় প্রোটোকলের প্রয়োজনীয়তা পূরণ করতে হবে — Vehicle এবং FlyableSwift প্রোটোকলের বহু-ইনহেরিটেন্স সমর্থন করে: protocol A: B, C

Protocol Composition

Protocol Composition একটি প্রক্রিয়া যা নির্দিষ্ট করতে দেয় যে একটি টাইপকে একই সাথে একাধিক প্রোটোকল মেনে চলতে হবে, কোনও নতুন কম্বাইন্ড প্রোটোকল তৈরি না করেই।

swift
func render(_ item: Drawable & Animatable) {
    item.draw(context: ...)
    item.animate(duration: 0.3)
}

কম্পোজিশন (&) ফাংশন প্যারামিটার, ভেরিয়েবল এবং জেনেরিক সীমাবদ্ধতায় কাজ করে। কম্পাইলার যাচাই করে যে পাস করা টাইপ একই সাথে সমস্ত প্রোটোকল পূরণ করে। SwiftUI-তে কম্পোজিশন ব্যাপকভাবে ব্যবহৃত হয়: some View হল কম্পোজিশন সহ একটি জেনেরিক।

Protocol Composition ইনহেরিটেন্স শ্রেণীবিন্যাস তৈরি করার চেয়ে ভালো: protocol A: B, C-এর পরিবর্তে সরাসরি B & C গ্রহণ করা যেতে পারে। এটি নমনীয়তা দেয় এবং কাপলিং কমায়। কম্পোজিশন বিশেষ করে ফাংশন প্যারামিটার এবং জেনেরিক সীমাবদ্ধতায় কার্যকর যেখানে একটি মধ্যবর্তী প্রোটোকল তৈরি না করেই অস্থায়ীভাবে প্রয়োজনীয়তা একত্রিত করার প্রয়োজন হয়। এটি কোডে সহায়ক টাইপের সংখ্যা কমায়।

প্রোটোকল একটি টাইপ হিসাবে

Protocol একটি ভেরিয়েবল, ফাংশন প্যারামিটার বা কালেকশন এলিমেন্টের টাইপ হিসাবে ব্যবহার করা যেতে পারে। একে এক্সিস্টেনশিয়াল টাইপ বলে।

swift
var drawableItem: Drawable
let items: [Drawable] = [Circle(...), Rectangle(...)]

func process(drawables: [any Drawable]) {
    for item in drawables {
        item.draw(context: ...)
    }
}

কীওয়ার্ড any (Swift 5.6+) স্পষ্টভাবে এক্সিস্টেনশিয়াল চিহ্নিত করে। any ছাড়া, কম্পাইলার একটি সতর্কতা জারি করে। Swift some (অপাক টাইপ) সমর্থন করে প্রোটোকলের পিছনে কংক্রিট টাইপ লুকানোর জন্য — এটি SwiftUI-তে একটি মানক পদ্ধতি।

প্রোটোকল নিয়ে সাধারণ ভুল

প্রোটোকল নিয়ে কাজ করার সময়, ডেভেলপাররা প্রায়শই বেশ কয়েকটি পুনরাবৃত্ত ভুল করে থাকেন।

  • mutating ভুলে যাওয়া — প্রোটোকলে একটি মেথড mutating হিসাবে চিহ্নিত, কিন্তু স্ট্রাকচার এটি কীওয়ার্ড ছাড়া ইমপ্লিমেন্ট করে
  • জেনেরিকের পরিবর্তে প্রোটোকল টাইপ হিসাবে ব্যবহার — যেখানে কংক্রিট টাইপ প্রয়োজন সেখানে <T: Drawable>-এর পরিবর্তে Drawable ব্যবহার করা
  • সার্কুলার প্রোটোকল রেফারেন্স — একটি প্রোটোকল যা সঠিক সমাধান ছাড়া associated type-এর মাধ্যমে নিজেকে রেফারেন্স করে
  • শুধুমাত্র-ক্লাস প্রোটোকল — প্রয়োজন ছাড়া AnyObject ব্যবহার, যা স্ট্রাকচার এবং এনামকে বাদ দেয়

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

Protocol এবং abstract class-এর মধ্যে পার্থক্য কী?

Protocol ইমপ্লিমেন্টেশন ছাড়া শুধুমাত্র প্রয়োজনীয়তা সংজ্ঞায়িত করে (protocol extensions পর্যন্ত)। Abstract class-এ ইমপ্লিমেন্টেশন এবং স্টেট থাকতে পারে। Swift-এ কোনো অ্যাবস্ট্র্যাক্ট ক্লাস নেই — তাদের ভূমিকা এক্সটেনশন সহ প্রোটোকল পালন করে।

কি struct একটি প্রোটোকল গ্রহণ করতে পারে?

হ্যাঁ, স্ট্রাকচার, ক্লাস এবং এনাম — সবাই প্রোটোকল গ্রহণ করতে পারে। এটি POP-এর ভিত্তি: আর্কিটেকচার সংগঠিত করতে আপনার ক্লাস ব্যবহার করার প্রয়োজন নেই। প্রোটোকল সহ স্ট্রাকচার ভ্যালু সিম্যান্টিক্স এবং অপরিবর্তনীয়তা প্রদান করে।

প্রোটোকলে associated type কী?

Associated type (associatedtype) হল একটি টাইপের জন্য প্লেসহোল্ডার যা ইমপ্লিমেন্টিং টাইপ নিজেই নির্ধারণ করে। উদাহরণ: Collection-এর associatedtype Element আছে। এটি প্রোটোকল স্তরে একটি জেনেরিক।

কি আমি প্রোটোকল শুধুমাত্র ক্লাসের জন্য সীমাবদ্ধ করতে পারি?

হ্যাঁ, AnyObject থেকে ইনহেরিটেন্স যোগ করুন: protocol MyProtocol: AnyObject। তাহলে শুধুমাত্র ক্লাস এই প্রোটোকল গ্রহণ করতে পারবে। এটি দুর্বল রেফারেন্স এবং ডেলিগেটের জন্য কার্যকর।

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

পরীক্ষার জন্য is এবং কাস্টিংয়ের জন্য as? ব্যবহার করুন: if let drawable = item as? Drawable। এটি শুধুমাত্র associated types ছাড়া প্রোটোকলের জন্য কাজ করে।

সারসংক্ষেপ

  • Protocol — মেথড, প্রপার্টি, ইনিশিয়ালাইজার এবং সাবস্ক্রিপ্টের জন্য চুক্তি
  • Class, struct, enum — সব টাইপ প্রোটোকল গ্রহণ করতে পারে
  • ইনহেরিটেন্স প্রোটোকলের কঠোর কাপলিং ছাড়া চুক্তির শ্রেণীবিন্যাস তৈরি করে
  • Protocol Composition (&) ইনহেরিটেন্স ছাড়া প্রোটোকল একত্রিত করে
  • এক্সিস্টেনশিয়াল টাইপ (any) এবং অপাক টাইপ (some) — প্রোটোকল নিয়ে কাজ করার দুটি উপায়
  • POP Apple ক্লাসিক্যাল ক্লাস ইনহেরিটেন্সের বিকল্প হিসাবে সুপারিশ করেছে
  • Protocol Extensions ডিফল্ট ইমপ্লিমেন্টেশন যোগ করার অনুমতি দেয়

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

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

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

আরও পড়ুন