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 کے بغیر)، سست خصوصیات UI عناصر کے ابتدائیہ کو init کو بے ترتیب کیے بغیر منظم کرنے کی اجازت دیتی ہیں۔
پہلی حد: 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں