Swift-এ Lazy Property: এটি কী এবং অলস ইনিশিয়ালাইজেশনের সিনট্যাক্স

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

Lazy Property Swift-এ একটি বিলম্বিত ইনিশিয়ালাইজেশন পদ্ধতি, যেখানে প্রপার্টিটি প্রথম অ্যাক্সেসের সময় গণনা করা হয়, অবজেক্ট তৈরি করার সময় নয়। সাধারণ সংরক্ষিত প্রপার্টির বিপরীতে, অলস ভেরিয়েবল সম্পদ-নিবিড় অপারেশনের জন্য স্টার্টআপ সময় এবং মেমরি খরচ উল্লেখযোগ্যভাবে কমাতে পারে। Apple Developer Documentation (2026) অনুসারে, অলস প্রপার্টি শুধুমাত্র একবার ইনিশিয়ালাইজ হওয়ার নিশ্চয়তা দেয় এবং প্রথম অ্যাক্সেসে থ্রেড-নিরাপদ।

মূল বিষয়

  • Lazy — প্রপার্টি প্রথম অ্যাক্সেসে ইনিশিয়ালাইজ হয়, অবজেক্ট তৈরি করার সময় নয়
  • শুধুমাত্র var — lazy let-এর সাথে অনুমোদিত নয়, কারণ ধ্রুবকটি ইনিশিয়ালাইজেশনের আগে জানা থাকতে হবে
  • থ্রেড নিরাপত্তা — অলস প্রপার্টির ইনিশিয়ালাইজেশন সিঙ্ক্রোনাইজড, কিন্তু পুনরায় অ্যাক্সেস নয়
  • একবার — lazy ঠিক একবার গণনা করা হয়, পরবর্তী অ্যাক্সেসগুলি সংরক্ষিত মান ফেরত দেয়
  • অপ্টিমাইজেশন — খুব কম ব্যবহৃত ডেটার জন্য স্টার্টআপ সময় এবং মেমরি খরচ হ্রাস করে

Swift-এ Lazy Property কী?

Lazy Property হল একটি সংরক্ষিত প্রপার্টি যার ইনিশিয়ালাইজেশন প্রথম অ্যাক্সেস পর্যন্ত বিলম্বিত হয়। var ঘোষণার আগে কীওয়ার্ড lazy কম্পাইলারকে বলে যে অবজেক্ট তৈরি করার সময় মান গণনা না করতে।

মানক ক্ষেত্রে, ক্লাস বা স্ট্রাকচারের ইনস্ট্যান্স তৈরি করার সময় সমস্ত সংরক্ষিত প্রপার্টি ইনিশিয়ালাইজ হয়। যদি কোনো প্রপার্টির জটিল গণনা, নেটওয়ার্ক লোডিং বা ফাইল সিস্টেম অপারেশনের প্রয়োজন হয়, তাহলে lazy ডেটা সত্যিই প্রয়োজন না হওয়া পর্যন্ত এই অপারেশনটি বিলম্বিত করতে দেয়।

Swift by Sundell (2025) অনুসারে, iOS অ্যাপ্লিকেশনে অলস প্রপার্টি সবচেয়ে কার্যকর পারফরম্যান্স অপ্টিমাইজেশন টুলগুলির মধ্যে একটি। এগুলি ভারী প্রাথমিক সেটআপযুক্ত অ্যাপে স্টার্টআপ সময় 20–40% কমাতে পারে, যেমন গ্রাফিক এডিটর বা অ্যানালিটিক্স ড্যাশবোর্ড।

অলস প্রপার্টির সিনট্যাক্স

অলস প্রপার্টি ঘোষণা করার জন্য var-এর আগে lazy কীওয়ার্ড প্রয়োজন। মান ক্লোজার বা ফাংশন কলের মাধ্যমে সেট করা হয়।

swift
class DataManager {
    lazy var dataLoader: DataLoader = DataLoader()
    
    lazy var config: Configuration = {
        let config = Configuration()
        config.loadDefaults()
        return config
    }()
}

অলস প্রপার্টির জন্য ক্লোজার শুধুমাত্র একবার গণনা করা হয় এবং পরবর্তী অ্যাক্সেসে সংরক্ষিত মান ফেরত দেয়। এটি একাধিক ধাপযুক্ত জটিল কনফিগারেশনের জন্য বিশেষভাবে সুবিধাজনক।

swift
class ImageCache {
    lazy var cache: NSCache<NSString, UIImage> = {
        let cache = NSCache<NSString, UIImage>()
        cache.countLimit = 100
        cache.totalCostLimit = 50 * 1024 * 1024
        return cache
    }()
}

একাধিক অলস প্রপার্টি স্বাধীনভাবে ইনিশিয়ালাইজ হয়। যদি দুটি অলস প্রপার্টি ক্লোজারের মাধ্যমে একে অপরকে রেফারেন্স করে, তাহলে একটি চক্রীয় নির্ভরতা তৈরি হয় যা Swift স্বয়ংক্রিয়ভাবে সমাধান করতে পারে না।

কখন অলস প্রপার্টি ইনিশিয়ালাইজ হয়

ইনিশিয়ালাইজেশনের মুহূর্তটি অলস এবং সাধারণ সংরক্ষিত প্রপার্টির মধ্যে মূল পার্থক্য। প্রপার্টির প্রথম পড়া বা লেখার সময় ইনিশিয়ালাইজেশন ঘটে, তবে তার আগে নয়।

প্রথম অ্যাক্সেস (পড়া বা লেখা)

ইনিশিয়ালাইজেশন প্রপার্টির প্রথম অ্যাক্সেসে ট্রিগার হয়, পড়া বা লেখা যাই হোক না কেন। সেই মুহূর্ত পর্যন্ত, প্রপার্টির জন্য কোনো মেমরি বরাদ্দ করা হয় না — শুধুমাত্র একটি “ইনিশিয়ালাইজড নয়” ফ্ল্যাগ সংরক্ষিত থাকে।

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 ব্যবহার করে বিলম্বিত করা যেতে পারে যতক্ষণ না ব্যবহারকারীর সত্যিই ডেটার প্রয়োজন হয়।

swift
class ProfileViewController {
    lazy var avatarImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
        return imageView
    }()
}

Singleton নির্ভরতা

সেবা এবং ম্যানেজার যা অ্যাপ লঞ্চের সময় অবিলম্বে প্রয়োজন হয় না, কার্যকরভাবে lazy হিসাবে ঘোষণা করা হয়। এটি স্টার্টআপ সময় এবং মেমরি খরচ হ্রাস করে।

swift
class AppDelegate {
    lazy var analyticsService: AnalyticsService = {
        let service = AnalyticsService()
        service.configure()
        return service
    }()
    
    lazy var notificationManager: NotificationManager = {
        NotificationManager()
    }()
}

কোডে UI উপাদান

প্রোগ্রামেটিকভাবে ইন্টারফেস তৈরি করার সময় (Storyboard ছাড়া), অলস প্রপার্টি init-এ জঞ্জাল না ফেলে UI উপাদানের ইনিশিয়ালাইজেশন সংগঠিত করতে দেয়।

সীমাবদ্ধতা এবং সমস্যা

প্রথম সীমাবদ্ধতা: lazy let-এর সাথে ব্যবহার করা যায় না। একটি ধ্রুবক init সম্পূর্ণ হওয়ার আগে ইনিশিয়ালাইজ করা আবশ্যক, যা বিলম্বিত ইনিশিয়ালাইজেশনের ধারণার বিপরীত।

দ্বিতীয় সীমাবদ্ধতা: lazy কম্পিউটেড প্রপার্টির জন্য উপলব্ধ নয়। কম্পিউটেড প্রপার্টি মান সংরক্ষণ করে না, যেখানে lazy বিশেষভাবে বিলম্বিত ইনিশিয়ালাইজেশনসহ একটি সংরক্ষিত প্রপার্টি।

তৃতীয় সীমাবদ্ধতা: স্ট্রাক্টে অলস প্রপার্টি মিউটেশন সমস্যা সৃষ্টি করতে পারে। যদি একটি অলস প্রপার্টিসহ স্ট্রাক্ট let হিসাবে ঘোষণা করা হয়, তাহলে প্রপার্টিতে অ্যাক্সেস অসম্ভব কারণ ইনিশিয়ালাইজেশনের জন্য স্ট্রাক্টের মিউটেশন প্রয়োজন।

চতুর্থ: অলস প্রপার্টি ইনিশিয়ালাইজেশনের সময় willSet/didSet ট্রিগার করে না। শুধুমাত্র পরবর্তী পরিবর্তনে, যদি প্রপার্টি var হিসাবে ঘোষণা করা হয়।

Stack Overflow (2025) অনুসারে, lazy সম্পর্কে প্রায় 15% প্রশ্ন let প্রসঙ্গে lazy ব্যবহারের চেষ্টা বা একবারের ইনিশিয়ালাইজেশন ভুল বোঝার সাথে সম্পর্কিত। ক্লাস ডিজাইন করার সময় এই সীমাবদ্ধতাগুলি বিবেচনা করা গুরুত্বপূর্ণ।

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

let-এর সাথে lazy ব্যবহার করা যায় কি?

না, lazy শুধুমাত্র var-এর জন্য উপলব্ধ। let দিয়ে ঘোষিত ধ্রুবক init সম্পূর্ণ হওয়ার আগে ইনিশিয়ালাইজ করা আবশ্যক, যা বিলম্বিত ইনিশিয়ালাইজেশনের সাথে অসামঞ্জস্যপূর্ণ।

অলস প্রপার্টি কতবার গণনা করা হয়?

ঠিক একবার। প্রথম অ্যাক্সেসে, প্রপার্টি ইনিশিয়ালাইজ হয়, তারপরে এটি পুনরায় গণনা ছাড়াই সংরক্ষিত মান ফেরত দেয়।

অলস প্রপার্টি কি মাল্টিথ্রেডেড পরিবেশে নিরাপদ?

ইনিশিয়ালাইজেশন থ্রেড-নিরাপদ — দুটি থ্রেড প্রপার্টি দুবার ইনিশিয়ালাইজ করবে না। তবে, পরবর্তী মিউটেশনগুলি স্বয়ংক্রিয়ভাবে সিঙ্ক্রোনাইজ হয় না।

সাবক্লাসে অলস প্রপার্টি ওভাররাইড করা যায় কি?

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

lazy কীভাবে কম্পিউটেড প্রপার্টি থেকে আলাদা?

Lazy একটি সংরক্ষিত প্রপার্টি যা একবার গণনা করা হয় এবং মান সংরক্ষণ করে। কম্পিউটেড প্রপার্টি প্রতিটি অ্যাক্সেসে গণনা করা হয় এবং মান সংরক্ষণ করে না।

সারসংক্ষেপ

  • Lazy Property — প্রথম অ্যাক্সেসে সম্পাদিত বিলম্বিত ইনিশিয়ালাইজেশন পদ্ধতি
  • শুধুমাত্র var — lazy let-এর সাথে অসামঞ্জস্যপূর্ণ কারণ ধ্রুবকের তাৎক্ষণিক ইনিশিয়ালাইজেশন প্রয়োজন
  • একবার — ইনিশিয়ালাইজেশন একবার ঘটে, পরবর্তী অ্যাক্সেস ক্যাশে করা মান ব্যবহার করে
  • থ্রেড নিরাপত্তা — ইনিশিয়ালাইজেশন সিঙ্ক্রোনাইজড, কিন্তু পরবর্তী মিউটেশনের জন্য আলাদা সিঙ্ক্রোনাইজেশন প্রয়োজন
  • ব্যবহার — ভারী সম্পদ, UI উপাদান, singleton সেবা, কনফিগারেশন
  • সীমাবদ্ধতা — let, কম্পিউটেড প্রপার্টি, ওভাররাইডিং, বা let ইনস্ট্যান্সসহ স্ট্রাক্টে ব্যবহার করা যায় না
  • অপ্টিমাইজেশন — খুব কম ব্যবহৃত প্রপার্টির জন্য স্টার্টআপ সময় এবং মেমরি খরচ হ্রাস করে

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

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

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

আরও পড়ুন