Lazy Property Swift-এ একটি বিলম্বিত ইনিশিয়ালাইজেশন পদ্ধতি, যেখানে প্রপার্টিটি প্রথম অ্যাক্সেসের সময় গণনা করা হয়, অবজেক্ট তৈরি করার সময় নয়। সাধারণ সংরক্ষিত প্রপার্টির বিপরীতে, অলস ভেরিয়েবল সম্পদ-নিবিড় অপারেশনের জন্য স্টার্টআপ সময় এবং মেমরি খরচ উল্লেখযোগ্যভাবে কমাতে পারে। Apple Developer Documentation (2026) অনুসারে, অলস প্রপার্টি শুধুমাত্র একবার ইনিশিয়ালাইজ হওয়ার নিশ্চয়তা দেয় এবং প্রথম অ্যাক্সেসে থ্রেড-নিরাপদ।
মূল বিষয়
Lazy Property হল একটি সংরক্ষিত প্রপার্টি যার ইনিশিয়ালাইজেশন প্রথম অ্যাক্সেস পর্যন্ত বিলম্বিত হয়। var ঘোষণার আগে কীওয়ার্ড lazy কম্পাইলারকে বলে যে অবজেক্ট তৈরি করার সময় মান গণনা না করতে।
মানক ক্ষেত্রে, ক্লাস বা স্ট্রাকচারের ইনস্ট্যান্স তৈরি করার সময় সমস্ত সংরক্ষিত প্রপার্টি ইনিশিয়ালাইজ হয়। যদি কোনো প্রপার্টির জটিল গণনা, নেটওয়ার্ক লোডিং বা ফাইল সিস্টেম অপারেশনের প্রয়োজন হয়, তাহলে lazy ডেটা সত্যিই প্রয়োজন না হওয়া পর্যন্ত এই অপারেশনটি বিলম্বিত করতে দেয়।
Swift by Sundell (2025) অনুসারে, iOS অ্যাপ্লিকেশনে অলস প্রপার্টি সবচেয়ে কার্যকর পারফরম্যান্স অপ্টিমাইজেশন টুলগুলির মধ্যে একটি। এগুলি ভারী প্রাথমিক সেটআপযুক্ত অ্যাপে স্টার্টআপ সময় 20–40% কমাতে পারে, যেমন গ্রাফিক এডিটর বা অ্যানালিটিক্স ড্যাশবোর্ড।
অলস প্রপার্টি ঘোষণা করার জন্য var-এর আগে lazy কীওয়ার্ড প্রয়োজন। মান ক্লোজার বা ফাংশন কলের মাধ্যমে সেট করা হয়।
class DataManager {
lazy var dataLoader: DataLoader = DataLoader()
lazy var config: Configuration = {
let config = Configuration()
config.loadDefaults()
return config
}()
}
অলস প্রপার্টির জন্য ক্লোজার শুধুমাত্র একবার গণনা করা হয় এবং পরবর্তী অ্যাক্সেসে সংরক্ষিত মান ফেরত দেয়। এটি একাধিক ধাপযুক্ত জটিল কনফিগারেশনের জন্য বিশেষভাবে সুবিধাজনক।
class ImageCache {
lazy var cache: NSCache<NSString, UIImage> = {
let cache = NSCache<NSString, UIImage>()
cache.countLimit = 100
cache.totalCostLimit = 50 * 1024 * 1024
return cache
}()
}
একাধিক অলস প্রপার্টি স্বাধীনভাবে ইনিশিয়ালাইজ হয়। যদি দুটি অলস প্রপার্টি ক্লোজারের মাধ্যমে একে অপরকে রেফারেন্স করে, তাহলে একটি চক্রীয় নির্ভরতা তৈরি হয় যা Swift স্বয়ংক্রিয়ভাবে সমাধান করতে পারে না।
ইনিশিয়ালাইজেশনের মুহূর্তটি অলস এবং সাধারণ সংরক্ষিত প্রপার্টির মধ্যে মূল পার্থক্য। প্রপার্টির প্রথম পড়া বা লেখার সময় ইনিশিয়ালাইজেশন ঘটে, তবে তার আগে নয়।
ইনিশিয়ালাইজেশন প্রপার্টির প্রথম অ্যাক্সেসে ট্রিগার হয়, পড়া বা লেখা যাই হোক না কেন। সেই মুহূর্ত পর্যন্ত, প্রপার্টির জন্য কোনো মেমরি বরাদ্দ করা হয় না — শুধুমাত্র একটি “ইনিশিয়ালাইজড নয়” ফ্ল্যাগ সংরক্ষিত থাকে।
class ReportGenerator {
lazy var report: String = {
print("রিপোর্ট জেনারেট হচ্ছে...")
return "Annual report data"
}()
}
let generator = ReportGenerator()
// এই মুহূর্তে রিপোর্ট তৈরি করা হয়নি
print(generator.report) // "রিপোর্ট জেনারেট হচ্ছে..."
print(generator.report) // পরবর্তী অ্যাক্সেসে পুনরায় জেনারেট করা হয় না
অলস প্রপার্টি সাবক্লাসে ওভাররাইড করা যায় না। যদি একটি ক্লাস অলস প্রপার্টি ঘোষণা করে, তাহলে চাইল্ড ক্লাস এটি ভিন্ন আচরণ সহ কম্পিউটেড বা সংরক্ষিত প্রপার্টি হিসেবে ওভাররাইড করতে পারে না।
Apple Swift Blog (2025) অনুসারে, এই সীমাবদ্ধতা কারণ lazy কোনো ওভাররাইড মডিফায়ার নয়, বরং একটি স্টোরেজ বাস্তবায়নের বিবরণ। সাবক্লাস শুধুমাত্র সেই পদ্ধতিটি ওভাররাইড করতে পারে যা অলস প্রপার্টি তার ক্লোজারে কল করে।
Swift-এ অলস প্রপার্টির ইনিশিয়ালাইজেশন থ্রেড-নিরাপদ: যদি দুটি থ্রেড একই সাথে একটি অলস প্রপার্টি অ্যাক্সেস করে, তাহলে ইনিশিয়ালাইজেশন শুধুমাত্র একবার হয় এবং দ্বিতীয় থ্রেডটি এটি সম্পূর্ণ না হওয়া পর্যন্ত ব্লক হয়।
তবে, ইনিশিয়ালাইজেশনের পরে সিঙ্ক্রোনাইজেশন সরিয়ে ফেলা হয়। এর মানে একাধিক থ্রেড থেকে একসাথে পড়া নিরাপদ, কিন্তু যদি একটি থ্রেড lazy var-এ নতুন মান লেখে যখন অন্যটি পড়ে, তাহলে একটি ডেটা রেস ঘটে।
Swift Evolution প্রস্তাব SE-0254 (2025) অনুসারে, অলস প্রপার্টির জন্য সিঙ্ক্রোনাইজেশন প্রক্রিয়া নিম্ন স্তরে objc_sync_enter/exit-এর মাধ্যমে বাস্তবায়িত হয়। এটি পারমাণবিক ইনিশিয়ালাইজেশন নিশ্চিত করে, কিন্তু পরবর্তী মিউটেশন নয়। পরিবর্তনযোগ্য অলস প্রপার্টির সাথে থ্রেড-নিরাপদ কাজের জন্য, আলাদা সিঙ্ক্রোনাইজেশন প্রক্রিয়া ব্যবহার করুন।
অলস প্রপার্টি Swift প্রজেক্টে পারফরম্যান্স অপ্টিমাইজ করতে এবং কোড আর্কিটেকচার উন্নত করতে ব্যবহৃত হয়।
ইমেজ লোড করা, JSON পার্স করা, ডেটাবেস নিয়ে কাজ করা — এই সমস্ত অপারেশন lazy ব্যবহার করে বিলম্বিত করা যেতে পারে যতক্ষণ না ব্যবহারকারীর সত্যিই ডেটার প্রয়োজন হয়।
class ProfileViewController {
lazy var avatarImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
return imageView
}()
}
সেবা এবং ম্যানেজার যা অ্যাপ লঞ্চের সময় অবিলম্বে প্রয়োজন হয় না, কার্যকরভাবে lazy হিসাবে ঘোষণা করা হয়। এটি স্টার্টআপ সময় এবং মেমরি খরচ হ্রাস করে।
class AppDelegate {
lazy var analyticsService: AnalyticsService = {
let service = AnalyticsService()
service.configure()
return service
}()
lazy var notificationManager: NotificationManager = {
NotificationManager()
}()
}
প্রোগ্রামেটিকভাবে ইন্টারফেস তৈরি করার সময় (Storyboard ছাড়া), অলস প্রপার্টি init-এ জঞ্জাল না ফেলে UI উপাদানের ইনিশিয়ালাইজেশন সংগঠিত করতে দেয়।
প্রথম সীমাবদ্ধতা: lazy let-এর সাথে ব্যবহার করা যায় না। একটি ধ্রুবক init সম্পূর্ণ হওয়ার আগে ইনিশিয়ালাইজ করা আবশ্যক, যা বিলম্বিত ইনিশিয়ালাইজেশনের ধারণার বিপরীত।
দ্বিতীয় সীমাবদ্ধতা: lazy কম্পিউটেড প্রপার্টির জন্য উপলব্ধ নয়। কম্পিউটেড প্রপার্টি মান সংরক্ষণ করে না, যেখানে lazy বিশেষভাবে বিলম্বিত ইনিশিয়ালাইজেশনসহ একটি সংরক্ষিত প্রপার্টি।
তৃতীয় সীমাবদ্ধতা: স্ট্রাক্টে অলস প্রপার্টি মিউটেশন সমস্যা সৃষ্টি করতে পারে। যদি একটি অলস প্রপার্টিসহ স্ট্রাক্ট let হিসাবে ঘোষণা করা হয়, তাহলে প্রপার্টিতে অ্যাক্সেস অসম্ভব কারণ ইনিশিয়ালাইজেশনের জন্য স্ট্রাক্টের মিউটেশন প্রয়োজন।
চতুর্থ: অলস প্রপার্টি ইনিশিয়ালাইজেশনের সময় willSet/didSet ট্রিগার করে না। শুধুমাত্র পরবর্তী পরিবর্তনে, যদি প্রপার্টি var হিসাবে ঘোষণা করা হয়।
Stack Overflow (2025) অনুসারে, lazy সম্পর্কে প্রায় 15% প্রশ্ন let প্রসঙ্গে lazy ব্যবহারের চেষ্টা বা একবারের ইনিশিয়ালাইজেশন ভুল বোঝার সাথে সম্পর্কিত। ক্লাস ডিজাইন করার সময় এই সীমাবদ্ধতাগুলি বিবেচনা করা গুরুত্বপূর্ণ।
সচরাচর জিজ্ঞাসিত প্রশ্ন
না, lazy শুধুমাত্র var-এর জন্য উপলব্ধ। let দিয়ে ঘোষিত ধ্রুবক init সম্পূর্ণ হওয়ার আগে ইনিশিয়ালাইজ করা আবশ্যক, যা বিলম্বিত ইনিশিয়ালাইজেশনের সাথে অসামঞ্জস্যপূর্ণ।
ঠিক একবার। প্রথম অ্যাক্সেসে, প্রপার্টি ইনিশিয়ালাইজ হয়, তারপরে এটি পুনরায় গণনা ছাড়াই সংরক্ষিত মান ফেরত দেয়।
ইনিশিয়ালাইজেশন থ্রেড-নিরাপদ — দুটি থ্রেড প্রপার্টি দুবার ইনিশিয়ালাইজ করবে না। তবে, পরবর্তী মিউটেশনগুলি স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ হয় না।
না, অলস প্রপার্টি ওভাররাইড করা যায় না। সাবক্লাস শুধুমাত্র ক্লোজারের ভিতরের লজিক পরিবর্তন করতে পারে, কিন্তু অলস ইনিশিয়ালাইজেশন নিজেই নয়।
Lazy একটি সংরক্ষিত প্রপার্টি যা একবার গণনা করা হয় এবং মান সংরক্ষণ করে। কম্পিউটেড প্রপার্টি প্রতিটি অ্যাক্সেসে গণনা করা হয় এবং মান সংরক্ষণ করে না।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন