willSet এবং didSet হলো Swift-এ প্রপার্টি অবজারভার (property observers) যা প্রপার্টির মান পরিবর্তনের আগে এবং পরে কোড কার্যকর করতে দেয়। computed properties-এর বিপরীতে, অবজারভাররা নতুন মান গণনা করে না, বরং শুধু পরিবর্তনে প্রতিক্রিয়া জানায়। Apple ডকুমেন্টেশন, The Swift Programming Language (2026) অনুযায়ী, ডেটা বৈধতা, ইন্টারফেস সিঙ্ক্রোনাইজেশন এবং কোডে পরিবর্তন লগ করার জন্য অবজারভার অপরিহার্য।
মূল পয়েন্ট
willSet এবং didSet হলো Swift-এ প্রপার্টি অবজারভার (property observers), যা stored properties-এ পরিবর্তন ট্র্যাক করার জন্য একটি অন্তর্নির্মিত প্রক্রিয়া।
অন্যান্য ভাষার বিপরীতে যেখানে ম্যানুয়াল setter বাস্তবায়ন বা কলব্যাক সিস্টেমের প্রয়োজন হয়, Swift পরিবর্তনে প্রতিক্রিয়া জানানোর জন্য একটি ঘোষণামূলক সিনট্যাক্স প্রদান করে। অবজারভার প্রপার্টি ঘোষণার পরপরই যোগ করা হয় এবং এগুলোর আলাদা কল করার প্রয়োজন হয় না।
Apple ডেভেলপার ডকুমেন্টেশন (2026) অনুযায়ী, property observers যেকোনো class, struct বা enum-এর stored properties-এর জন্য সমর্থিত। এগুলি computed properties-এর সাথে কাজ করে না কারণ সেগুলো মান সংরক্ষণ করে না — তাদের জন্য, পরিবর্তনে প্রতিক্রিয়া সরাসরি setter-এ বাস্তবায়িত হয়।
willSet প্রপার্টিতে নতুন মান নির্ধারণের ঠিক আগে কল করা হয়। willSet-এর ভিতরে, অন্তর্নিহিত প্যারামিটার newValue উপলব্ধ থাকে যা নির্ধারিত হবে এমন মান ধারণ করে। এই মুহূর্তে, প্রপার্টির বর্তমান মান এখনও পরিবর্তিত হয়নি — আপনি সরাসরি প্রপার্টির মাধ্যমে পুরনো মান পড়তে পারেন।
Swift Evolution প্রস্তাব SE-0001 (2024) অনুযায়ী, willSet প্রকৃত পরিবর্তনের আগে বৈধতা যাচাই বা লগিং করার ক্ষমতা প্রদান করে। যদি willSet-এ কোনো ব্যতিক্রম নিক্ষেপ করা হয়, নতুন মান প্রয়োগ করা হবে না, যা অবজারভারকে ডেটা সুরক্ষা প্রক্রিয়ায় পরিণত করে।
didSet নতুন মান নির্ধারণের ঠিক পরে কল করা হয়। didSet-এর ভিতরে, অন্তর্নিহিত প্যারামিটার oldValue উপলব্ধ থাকে যা পরিবর্তনের আগের মান ধারণ করে। এই মুহূর্তে, প্রপার্টিতে ইতিমধ্যেই নতুন মান রয়েছে এবং আপনি এটি পুরনো মানের সাথে তুলনা করতে পারেন।
Swift by Sundell (2025) অনুযায়ী, didSet সবচেয়ে জনপ্রিয় অবজারভার কারণ পোস্ট-প্রসেসিংয়ের জন্য এটি প্রায়শই প্রয়োজন: UI আপডেট, নির্ভরশীল ফিল্ড পুনর্গণনা, বা পরিবর্তনের পরে সার্ভারে ডেটা পাঠানো।
Property observers প্রপার্টির পরপরই কোঁকড়া বন্ধনী ব্যবহার করে ঘোষণা করা হয়। ন্যূনতম সিনট্যাক্সে শুধু একটি অবজারভার প্রয়োজন, তবে আপনি উভয়ই ঘোষণা করতে পারেন।
var score: Int = 0 {
willSet {
print("স্কোর পরিবর্তন হয়ে \(newValue) হবে")
}
didSet {
print("স্কোর \(oldValue) থেকে পরিবর্তন হয়ে \(score) হয়েছে")
}
}
উভয় অবজারভার ঐচ্ছিক — আপনি শুধু willSet বা শুধু didSet নির্দিষ্ট করতে পারেন। willSet-এর জন্য আপনি প্রথম বন্ধনীতে নাম উল্লেখ করে newValue-এর নাম পরিবর্তন করতে পারেন।
var username: String = "guest" {
willSet(newName) {
print("\(newName) সেট করতে যাচ্ছি")
}
didSet(oldName) {
print("ছিল \(oldName), এখন \(username)")
}
}
Swift Language Guide (2026) অনুযায়ী, প্যারামিটার পুনঃনামকরণ কোড পঠনযোগ্যতা উন্নত করে, বিশেষ করে যখন প্রপার্টি এবং অবজারভার দীর্ঘ নাম সহ বড় প্রকল্পে ব্যবহার করা হয়।
কার্যকরীকরণের ক্রম কঠোরভাবে সংজ্ঞায়িত: প্রথমে willSet (পুরনো মান উপলব্ধ), তারপর নির্ধারণ, তারপর didSet (নতুন মান উপলব্ধ)।
class Temperature {
var celsius: Double = 0.0 {
willSet {
print("তাপমাত্রা \(celsius) থেকে পরিবর্তন হয়ে \(newValue) হবে")
}
didSet {
if celsius > 100.0 {
print("স্ফুটনাঙ্ক অতিক্রম করেছে!")
}
}
}
}
একটি গুরুত্বপূর্ণ সীমাবদ্ধতা: ইনস্ট্যান্স তৈরির সময় প্রপার্টি আরম্ভকরণের সময় অবজারভার কল করা হয় না। init-এর ভিতরে, মান নির্ধারণ willSet এবং didSet ট্রিগার করে না — এটি নির্মাণ পর্যায়ে অবাঞ্ছিত পার্শ্বপ্রতিক্রিয়া প্রতিরোধ করে।
Apple Swift Blog (2025) অনুযায়ী, এই আচরণ অনেক অন্যান্য ভাষা থেকে ভিন্ন যেখানে setter এমনকি কনস্ট্রাক্টরেও কল করা হয়। Swift নিরাপত্তা বেছে নেয়: অবজারভার শুধুমাত্র অবজেক্ট আরম্ভকরণ সম্পূর্ণ হওয়ার পর কাজ করতে শুরু করে।
didSet-এর ভিতরে প্রপার্টি পরিবর্তন করলে বারবার অবজারভার কল হতে পারে। Swift রিকার্সন ব্লক করে না — প্রোগ্রামারকে এটি ম্যানুয়ালি নিয়ন্ত্রণ করতে হবে।
var counter: Int = 0 {
didSet {
if counter < 5 {
counter += 1
}
}
}
এমন কোড যদি প্রস্থান শর্ত না দেওয়া হয় তবে স্ট্যাক ওভারফ্লো সহ সম্পূর্ণ রিকার্সন তৈরি করবে। Stack Overflow Swift Community (2025) অনুযায়ী, property observers নিয়ে কাজ করার সময় এটি শিক্ষানবিশ ডেভেলপারদের সবচেয়ে সাধারণ ভুলগুলির মধ্যে একটি।
স্ট্রাকচার কোনো সীমাবদ্ধতা ছাড়াই stored properties-এর জন্য willSet এবং didSet সমর্থন করে। এটি মনে রাখা গুরুত্বপূর্ণ যে স্ট্রাকচার হল value types, এবং mutating মেথডের ভিতরে প্রপার্টি পরিবর্তন করলেও অবজারভার ট্রিগার হয়।
struct Point {
var x: Double = 0.0 {
didSet {
print("X পরিবর্তন হয়ে \(x) হয়েছে")
}
}
var y: Double = 0.0 {
didSet {
print("Y পরিবর্তন হয়ে \(y) হয়েছে")
}
}
}
var point = Point()
point.x = 5.0
প্রপার্টি অবজারভার Swift প্রকল্পে বিস্তৃত কাজের জন্য ব্যবহৃত হয়: UI সিঙ্ক্রোনাইজেশন থেকে ডেটা বৈধতা যাচাই এবং লগিং পর্যন্ত।
didSet আপনাকে একটি অবৈধ মান সেট হওয়ার পরপরই তা প্রত্যাহার বা সংশোধন করতে দেয়। এটি Objective-C-এর জটিল setter-কে প্রতিস্থাপন করে এবং মডেল স্তরে ডেটা অখণ্ডতা নিশ্চিত করে।
var age: Int = 0 {
didSet {
if age < 0 || age > 150 {
age = oldValue
}
}
}
যখন একটি সম্পর্কিত প্রপার্টি পরিবর্তিত হয়, আপনি আলাদা আপডেট মেথড কল ছাড়াই স্বয়ংক্রিয়ভাবে ইন্টারফেস উপাদান আপডেট করতে পারেন।
var userName: String = "" {
didSet {
nameLabel.text = userName
}
}
willSet ডিবাগিং বা অডিটের উদ্দেশ্যে লগিংয়ের জন্য সুবিধাজনক। আপনি প্রয়োগের আগে সময় এবং নতুন মান রেকর্ড করতে পারেন, নিশ্চিত করে যে লগে বিশ্লেষণের জন্য মূল ডেটা রয়েছে।
objc.io (2025) অনুযায়ী, property observers বিশেষ করে একমুখী ডেটা প্রবাহের আর্কিটেকচারে উপযোগী, যেখানে পরবর্তী অবস্থা পুনরুৎপাদনের জন্য প্রতিটি প্রপার্টি পরিবর্তন রেকর্ড করা হয়।
Computed properties তাৎক্ষণিকভাবে মান গণনা করে এবং কোনো সঞ্চয়স্থান থাকে না, যেখানে willSet এবং didSet প্রকৃত মান সহ stored property-তে কাজ করে।
| বৈশিষ্ট্য | Property Observers | Computed Properties |
|---|---|---|
| মান সংরক্ষণ করে | হ্যাঁ | না |
| পরিবর্তনে কোড কার্যকর করে | হ্যাঁ | না |
| ঘোষণার ধরন | var | var (get/set) |
| অ্যাক্সেস প্যারামিটার | newValue, oldValue | newValue (set-এ) |
| আরম্ভকরণ | প্রাথমিক মান প্রয়োজন | প্রয়োজন নেই |
মূল পার্থক্য: computed property প্রতিটি অ্যাক্সেসে মান গণনা করে, যেখানে property observer বিদ্যমান মানের পরিবর্তনে প্রতিক্রিয়া জানায়। তাদের মধ্যে পছন্দ শব্দার্থ দ্বারা নির্ধারিত হয় — যদি প্রপার্টি অন্য ডেটা থেকে উদ্ভূত হয়, computed ব্যবহার করুন; যদি এটি একটি স্বাধীন মান যার পরিবর্তন পর্যবেক্ষণ করা প্রয়োজন, তাহলে willSet/didSet ব্যবহার করুন।
সবচেয়ে সাধারণ ভুল হল প্রস্থান শর্ত ছাড়া didSet-এর পুনরাবৃত্তিমূলক কল। didSet-এর ভিতরে প্রতিটি প্রপার্টি পরিবর্তন অবজারভারকে পুনরায় ট্রিগার করে, যা অসীম লুপের দিকে নিয়ে যায়।
দ্বিতীয় সাধারণ ভুল হল let প্রপার্টিতে অবজারভার ব্যবহারের চেষ্টা। Swift কম্পাইলার একটি ত্রুটি দেবে কারণ let একটি ধ্রুবক।
তৃতীয় ভুল হল উপেক্ষা করা যে আরম্ভকরণের সময় অবজারভার কল হয় না। যে ডেভেলপাররা init-এর ভিতরে willSet সক্রিয় হওয়ার আশা করেন, তারা অপ্রত্যাশিত আচরণ পান।
চতুর্থ সমস্যা হল extension-এ প্রপার্টিতে অবজারভার প্রয়োগ করা। Swift extension-এ stored properties-এ willSet/didSet যোগ করতে নিষেধ করে।
Ray Wenderlich (2025) অনুযায়ী, এই সীমাবদ্ধতাগুলি বোঝা প্রাথমিক পর্যায়ে বাগ এড়াতে সাহায্য করে এবং Swift কোডকে আরও পূর্বানুমেয় করে তোলে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
হ্যাঁ, প্রত্যেকটি অবজারভার ঐচ্ছিক। আপনি শুধু willSet, শুধু didSet, বা উভয়ই একসাথে ঘোষণা করতে পারেন।
না, Swift extension-এ stored properties-এর জন্য willSet এবং didSet যোগ করতে নিষেধ করে। অবজারভার শুধুমাত্র মূল টাইপ সংজ্ঞায় ঘোষণা করা হয়।
না, আরম্ভকরণের সময় অবজারভার কল হয় না। এটি একটি সুরক্ষা প্রক্রিয়া যা অবজেক্ট নির্মাণ পর্যায়ে পার্শ্বপ্রতিক্রিয়া প্রতিরোধ করে।
willSet একটি stored property অবজারভার যা মান পরিবর্তনের আগে কার্যকর হয়। computed property-তে setter হল একটি নতুন মান গণনার উপায়, কোন বিদ্যমান মান পর্যবেক্ষণের নয়।
পুনরাবৃত্ত didSet কল রিকার্সন ঘটাবে। প্রস্থান শর্ত ছাড়া, এটি স্ট্যাক ওভারফ্লো এবং প্রোগ্রাম সমাপ্তির দিকে নিয়ে যায়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন