সুইফট ল্যাঙ্গুয়েজে ডেলিগেট ইমপ্লিমেন্ট করা – Implementing delegates in Swift

swift bangla delegate blog featured image

ডেলিগেট কি: ডেলিগেট হলো ডিজাইন প্যাটার্ন যা কোন একটা নির্দিষ্ট ইভেন্ট ঘটলে একটা অবজেক্ট থেকে অন্য অবজেক্টে মেসেজ পাঠাতে সহায়তা করে। iOS ডেভলপারদের জন্য ডেলিগেশন খুব গুরুত্বপূর্ণ ডিজাইন প্যাটার্ণ । মনে করি, A অবজেক্ট B অবজেক্টকে কল করে কোন একটি কাজ করার জন্য। পরবর্তী কাজগুলো করার জন্য যখন কাজটি শেষ হবে, A অবজেক্টকে জানতে হবে যে B অবজেক্ট কাজটি শেষ করেছে। এটা করার জন্য ডেলিগেট প্যাটার্ন ব্যবহার করা হয়।

এখন, কিভাবে একটা ক্লাস থেকে অন্য ক্লাসে ডেটা পাস করার জন্য কাস্টম ডেলিগেট তৈরি করা যায় তা দেখব। এজন্য আমরা একটা ছোট একটা এ্যাপ ব্যবহার করব। প্রথমে এই প্রজেক্ট টি ডাউনলোড করে রান করতে হবে। 

এ্যাপটিতে দুইটি ক্লাস আছে। ভিউ কন্ট্রোলার A এবং ভিউ কন্ট্রোলার B । B এর দুইটা ভিউ আছে যাদের ট্যাপ করে ভিউ কন্ট্রোলারের ব্যাকগ্রাউন্ড কালার চেন্জ করা যায়। এখন B এর ভিউ য়ে ট্যাপ করলে A এর ব্যকগ্রাউন্ড কালার চেন্জ করার কাজটি করতে হবে।

প্রবলেম হলো যে, ভিউগুলো ক্লাস B তে আছে এবং ক্লাস A তে কোন যোগাযোগ নাই। তাই আমাদের এমন একটা উপায় বের করতে হবে যাতে আমরা দুটি ক্লাসে যোগাযোগ করতে পারি আর এ জন্য আমাদের আছে ডেলিগেশন।

৬ ধাপে ভাগ করে ইমপ্লিমেন্টশন দেখানো হলো যাতে পরবর্তীতে প্রয়োজনে এটাকে ব্যবহার করা যায়।

ধাপ – ১: ClassBVC ফাইলে MARK: step 1 এ নিচের কোড লিখতে হবে।

//MARK: step 1 Add Protocol here.
protocol ClassBVCDelegate: class {
    func changeBackgroundColor(_ color: UIColor?)
}

প্রথম ধাপ হলো প্রটোকল তৈরি করা। এখন আমরা Class B তে প্রটোকল তৈরি করব। ইমপ্লিমেন্টেশনের রিকোয়ারমেন্টের উপর ভিত্তি করে প্রটোকলের ভিতরে যত খুশি ফাংশন তৈরি করা যায়। এই অবস্থায়, আমাদের শুধু একটা সাধারণ ফাংশন আছে যা একটি অপশনাল UIColor আর্গুমেন্ট গ্রহন করে।

প্রটোকলের নামে Class এর নামের পর delegate শব্দটি রাখা উচিত এটা হলো Good Practice. এক্ষেত্রে নাম হবে ClassBVCDelegate.

ধাপ – ২: ClassBVC ফাইলে MARK: step 2 তে নিচের কোড লিখতে হবে।

//MARK: step 2 Create a delegate property here.
weak var delegate: ClassBVCDelegate?

এখানে আমরা ক্লাসের জন্য শুধু ডেলিগেটের প্রোপার্টি তৈরি করেছি। এই প্রোপার্টিকে অবশ্যই protocol টাইপ হতে হবে এবং এটা অপশনাল হওয়া উচিত। ডেটা যেন মেমোরিতে জমা না থাকে এবং মেমোরি লিক না হয় এজন্য প্রোপার্টির শুরুতে weak কী-ওয়ার্ড ব্যবহার করা উচিত।

ধাপ – ৩: ClassBVC ফাইলে MARK: step 3 তে handleTap মেথডের ভিতরে নিচের কোড লিখতে হবে:

//MARK: step 3 Add the delegate method call here.
delegate?.changeBackgroundColor(tapGesture.view?.backgroundColor)

একটা ব্যাপার জানা উচিত, এ্যাপ রান করুন এবং যে কোন ভিউতে ট্যাপ করুন, কোন নতুন কিছু ঘটবে না আর এটাই ঠিক আছে কিন্তু যে জিনিসটা পয়েন্ট করতে চাচ্ছি যে ডেলিগেট কল হলেও এ্যাপটা ক্রাশ করছে না কারন আমরা এটাকে Optional value হিসেবে তৈরি করেছি আর এজন্যই এটা ক্রাশ করছে না যদিও এখনো ডেলিগেট নাই।

এখন আমরা ClassAVC ফাইলে যাব আর ডেলিগেট তৈরি করব।

ধাপ – ৪: ClassAVC ফাইলে MARK: step 4 তে handleTap মেথডের ভিতরে class type এর পর  নিচের কোড লিখতে হবে:

//MARK: step 4 conform the protocol here.
class ClassAVC: UIViewController, ClassBVCDelegate {

এখন ClassAVC ক্লাস ClassBVCDelegate protocol কে গ্রহণ (Implement) করে। এখন কম্পাইলার একটা ইরর দেখাবে যে “Type ClassAVC does not conform to protocol ClassBVCDelegate” এবং এর মানে হলো যে আপনি এখনো প্রোটোকলের মেথড ব্যবহার করেননি। একটি ক্লাসে কোন প্রোটোকলকে ইমপ্লিমেন্ট করা একটা চুক্তি সই করার মত যেখানে বলা আছে যে ‘কোন ক্লাস আমাকে ইমপ্লিমেন্ট করলে অবশ্যই আমার ফাংশন ব্যবহার করতে হবে’। এর মানে হলো যে এখন আমাদের প্রোটোকলের মেথড ইমপ্লিমেন্ট (ব্যবহার) করতে হবে ClassAVC ক্লাসে।

নোট: যদি আপনি অবজেক্টিভ সি করে থাকেন তবে হয়তো ভাবছেন যে এই ইরর থেকে মুক্তি পেতে মেথডকে অপশনাল করে দিবেন কিন্তু সুইফটে অপশনাল মেথড সাপোর্ট করে না। এটা করতে চাইলে প্রোটোকলের জন্য এক্সটেনশন তৈরি করতে হবে অথবা প্রোটোকলের ইমপ্লিমেন্টেশনে @objc কী-ওয়ার্ড ব্যবহার করতে হবে।

Here is a good article about optional methods.

ধাপ – ৫: ClassAVC ফাইলে prepareforsegue method এর ভিতরে MARK: step ৫ এ নিচের কোড লিখতে হবে:

// MARK: step 5 create a reference of Class B and bind them through the prepareforsegue method.
if let nav = segue.destination as? UINavigationController, let classBVC = nav.topViewController as? ClassBVC {
    classBVC.delegate = self
}

এখানে আমরা শুধু ClassBVC এর একটা ইন্সটেন্স তৈরি করেছি এবং এর ডেলিগেট self এ্যাসাইন করেছি। কিন্তু এখানে self টা আবার কি জিনিস? self হলো ClassAVC (যে ক্লাসে কোড লিখছি) যাকে অর্পন করা বা ডেলিগেট করা হয়েছে।

ধাপ – ৬: অবশেষে, ClassAVC ফাইলে MARK: step ৬ এ গিয়ে প্রোটোকলের ফাংশন ব্যবহার করতে হবে। func changeBackgroundColor লিখতে থাকলে অটো-কমপ্লিট সাজেশন আসবে। এর ভিতরে প্রয়োজন মত যে কোন কোড লিখা যাবে। এই উদাহরণে শুধু কালার চেন্জ করা হলো।

//MARK: step 6 finally use the method of the contract
func changeBackgroundColor(_ color: UIColor?) {
    view.backgroundColor = color
}

আমাদের কাজ শেষ। এখন এ্যাপটি রান করি…

খেয়াল করলে দেখা যাবে, ডেলিগেট সব যায়গায় আছে এবং আপনি এটা ব্যবহার করছেন। যদি আপনি টেবিল ভিউ তৈরি করে থাকেন তাহলে আপনি ডেলিগেশন ব্যবহার করেছেন। UIKit / অন্যান্য ফ্রেইমওয়ার্কের অনেক ক্লাস আছে যেগুলো ডেলিগেটের মাধ্যমে কাজ করে। এটা ব্যবহার করলে অবজেক্টের Tight Coupling হয় না। ডেলিগেশন দুইটি অবজেক্টের মধ্যে One to One রিলেশনশীপ গঠন করে।

–০–

  •  
  •  
  •  
  •  
  •  

Leave a Reply

Your email address will not be published. Required fields are marked *