Protocol Swift-এ একটি চুক্তি যা প্রয়োজনীয়তার একটি সেট সংজ্ঞায়িত করে যা কোনও গ্রহণকারী টাইপকে পূরণ করতে হবে। প্রোটোকলগুলি প্রোটোকল-ওরিয়েন্টেড প্রোগ্রামিং (POP) এর ভিত্তি — একটি প্যারাডাইম যা Apple ক্লাসিক্যাল OOP-এর পাশাপাশি Swift-এর জন্য সুপারিশ করেছে। Apple Documentation, 2026 অনুসারে, স্ট্রাকচার, ক্লাস এবং এনাম প্রোটোকল গ্রহণ করতে পারে, যা আর্কিটেকচারকে নমনীয় এবং পরীক্ষাযোগ্য করে তোলে।
মূল পয়েন্ট
Protocol একটি অ্যাবস্ট্র্যাক্ট ইন্টারফেস যা নির্ধারণ করে একটি টাইপ কী করতে সক্ষম হবে, কিন্তু এটি কীভাবে করে তা নয়। Swift-এ, প্রোটোকল Java বা Go-র ইন্টারফেসের অনুরূপ, তবে অতিরিক্ত ক্ষমতা সহ।
একটি প্রোটোকল প্রয়োজন করতে পারে:
{ get } বা { get set } স্পেসিফায়ার সহWWDC 2015 অনুসারে, Apple Swift অ্যাপ্লিকেশন আর্কিটেকচারের জন্য প্রোটোকল-ওরিয়েন্টেড প্রোগ্রামিংকে একটি মৌলিক পদ্ধতি হিসাবে প্রবর্তন করেছে। OOP-এর বিপরীতে, যেখানে ক্লাস ইনহেরিটেন্স কঠোর শ্রেণীবিন্যাস তৈরি করে, POP প্রোটোকল কম্পোজিশন প্রদান করে। এটি নমনীয়তা দেয়: একটি একক টাইপ একাধিক প্রোটোকল মেনে চলতে পারে, এক্সটেনশনের মাধ্যমে তাদের প্রয়োজনীয়তা এবং ইমপ্লিমেন্টেশন অর্জন করে।
Protocol কীওয়ার্ড protocol, একটি নাম এবং বডি দিয়ে ডিক্লেয়ার করা হয়।
protocol Drawable {
func draw(context: CGContext)
var boundingBox: CGRect { get }
}
একটি টাইপ তার নামের পরে কোলন ব্যবহার করে একটি প্রোটোকল গ্রহণ করে:
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 } দিয়ে ডিক্লেয়ার করা হয়।
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 অন্য একটি প্রোটোকল ইনহেরিট করতে পারে, নতুন প্রয়োজনীয়তা যোগ করতে পারে। এটি কঠোর ক্লাস কাপলিং ছাড়াই চুক্তির একটি শ্রেণীবিন্যাস তৈরি করে।
protocol Vehicle {
var speed: Double { get set }
func move()
}
protocol Flyable: Vehicle {
var altitude: Double { get set }
func takeOff()
}
Flyable গ্রহণকারী টাইপকে উভয় প্রোটোকলের প্রয়োজনীয়তা পূরণ করতে হবে — Vehicle এবং Flyable। Swift প্রোটোকলের বহু-ইনহেরিটেন্স সমর্থন করে: protocol A: B, C।
Protocol Composition একটি প্রক্রিয়া যা নির্দিষ্ট করতে দেয় যে একটি টাইপকে একই সাথে একাধিক প্রোটোকল মেনে চলতে হবে, কোনও নতুন কম্বাইন্ড প্রোটোকল তৈরি না করেই।
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 একটি ভেরিয়েবল, ফাংশন প্যারামিটার বা কালেকশন এলিমেন্টের টাইপ হিসাবে ব্যবহার করা যেতে পারে। একে এক্সিস্টেনশিয়াল টাইপ বলে।
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-তে একটি মানক পদ্ধতি।
প্রোটোকল নিয়ে কাজ করার সময়, ডেভেলপাররা প্রায়শই বেশ কয়েকটি পুনরাবৃত্ত ভুল করে থাকেন।
<T: Drawable>-এর পরিবর্তে Drawable ব্যবহার করাAnyObject ব্যবহার, যা স্ট্রাকচার এবং এনামকে বাদ দেয়সচরাচর জিজ্ঞাসিত প্রশ্ন
Protocol ইমপ্লিমেন্টেশন ছাড়া শুধুমাত্র প্রয়োজনীয়তা সংজ্ঞায়িত করে (protocol extensions পর্যন্ত)। Abstract class-এ ইমপ্লিমেন্টেশন এবং স্টেট থাকতে পারে। Swift-এ কোনো অ্যাবস্ট্র্যাক্ট ক্লাস নেই — তাদের ভূমিকা এক্সটেনশন সহ প্রোটোকল পালন করে।
হ্যাঁ, স্ট্রাকচার, ক্লাস এবং এনাম — সবাই প্রোটোকল গ্রহণ করতে পারে। এটি POP-এর ভিত্তি: আর্কিটেকচার সংগঠিত করতে আপনার ক্লাস ব্যবহার করার প্রয়োজন নেই। প্রোটোকল সহ স্ট্রাকচার ভ্যালু সিম্যান্টিক্স এবং অপরিবর্তনীয়তা প্রদান করে।
Associated type (associatedtype) হল একটি টাইপের জন্য প্লেসহোল্ডার যা ইমপ্লিমেন্টিং টাইপ নিজেই নির্ধারণ করে। উদাহরণ: Collection-এর associatedtype Element আছে। এটি প্রোটোকল স্তরে একটি জেনেরিক।
হ্যাঁ, AnyObject থেকে ইনহেরিটেন্স যোগ করুন: protocol MyProtocol: AnyObject। তাহলে শুধুমাত্র ক্লাস এই প্রোটোকল গ্রহণ করতে পারবে। এটি দুর্বল রেফারেন্স এবং ডেলিগেটের জন্য কার্যকর।
পরীক্ষার জন্য is এবং কাস্টিংয়ের জন্য as? ব্যবহার করুন: if let drawable = item as? Drawable। এটি শুধুমাত্র associated types ছাড়া প্রোটোকলের জন্য কাজ করে।
সারসংক্ষেপ
&) ইনহেরিটেন্স ছাড়া প্রোটোকল একত্রিত করেany) এবং অপাক টাইপ (some) — প্রোটোকল নিয়ে কাজ করার দুটি উপায়আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন