Struct Swift زبان میں ایک ویلیو ٹائپ (value type) ہے، جس کی مثالیں کوڈ کے مختلف حصوں کے درمیان منتقل کرتے وقت کاپی ہو جاتی ہیں۔ کلاسز کے برعکس، ڈھانچے وراثت کی حمایت نہیں کرتے، لیکن وہ پروٹوکول نافذ کرتے ہیں، خصوصیات اور طریقے رکھتے ہیں، اور ARC کے بغیر پیش قیاسی میموری مینجمنٹ فراہم کرتے ہیں۔ Swift Programming Language Guide, 2026 کے مطابق، struct Swift کا بنیادی تعمیراتی بلاک ہے — یہاں تک کہ معیاری اقسام Int، String، Array اور Dictionary بھی ڈھانچے کے طور پر نافذ کی گئی ہیں۔ زبان ڈیٹا ماڈلنگ کے لیے ڈھانچے کو ترجیحی انتخاب کے طور پر تجویز کرتی ہے۔
اہم نکات
Struct (ڈھانچہ) Swift میں ایک مرکب ڈیٹا ٹائپ ہے جو متعلقہ خصوصیات اور طریقوں کو ایک اکائی میں جمع کرتا ہے۔ کلاسز کے برعکس، ڈھانچے value types ہیں: جب کسی فنکشن میں منتقل کیا جائے یا نئے متغیر میں تفویض کیا جائے، اصل آبجیکٹ کے حوالہ کے بجائے ڈھانچے کی ایک آزاد کاپی بنائی جاتی ہے۔
Swift تمام ابتدائی اقسام کے لیے ڈھانچے استعمال کرتا ہے: Int، Double، String، Bool، Array، Dictionary اور Set۔ اس کا مطلب ہے کہ ایک بنیادی Int بھی ڈھانچے کی طرح برتاؤ کرتا ہے — تفویض پر ایک کاپی بنتی ہے۔ ڈویلپر خصوصیات اور طریقوں کے کسی بھی سیٹ کے ساتھ اپنا ڈھانچہ بیان کر سکتا ہے۔
Swift Evolution (SE-0143) کے مطابق، معیاری اقسام کو ڈھانچے کے طور پر نافذ کرنے کا فیصلہ کارکردگی اور پیش قیاسی کی وجہ سے ہے۔ Value types حوالہ چکر نہیں بناتے، ARC حوالہ گنتی کی ضرورت نہیں ہوتی، اور ضمانت دیتے ہیں کہ کاپی میں تبدیلی اصل کو متاثر نہیں کرے گی — یہ ملٹی تھریڈڈ منظرناموں میں ڈیٹا کی عدم تغیر کے لیے انتہائی اہم ہے۔
ویلیو ٹائپ سیمنٹکس struct اور class کے درمیان بنیادی فرق ہے۔ جب آپ ڈھانچے کو نئے متغیر میں تفویض کرتے ہیں یا کسی فنکشن میں منتقل کرتے ہیں، Swift تمام ڈیٹا کی آزاد کاپی بناتا ہے۔ کاپی میں کوئی بھی تبدیلی اصل کو متاثر نہیں کرتی، حوالہ اقسام کے عام ضمنی اثرات کو ختم کرتی ہے۔
// ویلیو ٹائپ سیمنٹکس کی مثال
struct Point {
var x: Double
var y: Double
}
var p1 = Point(x: 10, y: 20)
var p2 = p1 // p2، p1 کی ایک آزاد کاپی ہے
p2.x = 99 // صرف p2 تبدیل ہوتا ہے
print(p1.x) // 10 — p1 تبدیل نہیں ہوا
print(p2.x) // 99
Swift کاپی کو بہتر بنانے کے لیے Copy-on-Write (COW) استعمال کرتا ہے۔ اگر متعدد متغیرات ایک ہی ڈھانچے کا حوالہ دیتے ہیں لیکن ان میں سے کوئی ڈیٹا میں ترمیم نہیں کرتا، کوئی اصل کاپی نہیں ہوتی۔ Swift پہلی تبدیلی تک متغیرات کے درمیان میموری شیئر کرتا ہے — پھر ایک حقیقی کاپی بنائی جاتی ہے۔ یہ ضرورت سے زیادہ مختص آپریشنز کو روکتا ہے اور مجموعوں کے ساتھ کام کو تیز کرتا ہے۔
بطور ڈیفالٹ، ڈھانچے کے طریقے اس کی خصوصیات میں ترمیم نہیں کر سکتے — Swift تبدیلیاں کرنے والے طریقوں کے لیے واضح mutating کلیدی لفظ کی ضرورت ہے۔ یہ پابندی اتفاقی تبدیلی سے بچاتی ہے اور کوڈ کو پیش قیاس بناتی ہے: اگر کوئی طریقہ mutating کے طور پر نشان زد نہیں ہے، تو آپ کو ضمانت ہے کہ ڈھانچہ تبدیل نہیں کریں گے۔
جب آپ کسی طریقے سے پہلے mutating کلیدی لفظ شامل کرتے ہیں، Swift ڈھانچے کی خصوصیات میں نئی قدریں لکھنے کی صلاحیت حاصل کرتا ہے۔ دراصل، طریقہ self = کے ذریعے ڈھانچے کی مثال کو مکمل طور پر نئی سے تبدیل بھی کر سکتا ہے۔ یہ طریقہ کار، مثال کے طور پر، Option اور Result اقسام میں استعمال ہوتا ہے۔
// Mutating طریقے والا struct
struct Counter {
private var value: Int = 0
// Mutating طریقہ — خصوصیات کو تبدیل کر سکتا ہے
mutating func increment() {
value += 1
}
// Mutating طریقہ self کو مکمل طور پر تبدیل کر سکتا ہے
mutating func reset() {
self = Counter()
}
// غیر mutating طریقہ — صرف پڑھنے کے لیے
func currentValue() -> Int {
return value
}
}
var counter = Counter()
counter.increment()
print(counter.currentValue()) // 1
counter.reset()
print(counter.currentValue()) // 0
Mutating کے قواعد: ڈھانچے کو var سے اعلان کرنا چاہیے، let سے نہیں — ایک مستقل ڈھانچہ mutating طریقہ کو کال نہیں کر سکتا۔ مرتب کنندہ تعمیر کے وقت اسے چیک کرتا ہے: let مستقل پر mutating طریقہ کال کرنے کی کوشش مرتبی غلطی کا سبب بنے گی۔
struct اور class کے درمیان انتخاب Swift میں بنیادی فیصلوں میں سے ایک ہے۔ دونوں اقسام میں خصوصیات، طریقے، ابتدا کار ہو سکتے ہیں اور پروٹوکول نافذ کر سکتے ہیں، لیکن میموری سیمنٹکس، وراثت اور زندگی کے دورانیے کے انتظام میں بنیادی فرق ہے۔
| خصوصیت | struct | class |
|---|---|---|
| قسم | Value type (کاپی ہوتا ہے) | Reference type (حوالہ) |
| وراثت | حمایت نہیں کرتا | حمایت کرتا ہے |
| ARC / حوالہ گنتی | ضرورت نہیں | ARC ضروری |
| اختتامیہ | حمایت نہیں کرتا | deinit کی حمایت کرتا ہے |
| مستقل میں خصوصیت کی تبدیلی | صرف var کے ذریعے | let کے ذریعے ممکن (حوالہ مستقل ہے) |
| قسم کی تبدیلی | حمایت نہیں کرتا | حمایت کرتا ہے |
| مجموعوں میں ذخیرہ | براہ راست ذخیرہ (قدر) | حوالہ کے طور پر ذخیرہ (پوائنٹر) |
ڈھانچے ترجیحی ہوتے ہیں جب ڈیٹا وراثت کی ضرورت نہیں رکھتا، مشترکہ شناخت نہیں ہونی چاہیے (مثلاً، نقاط، سائز، ترتیب) اور ماڈیولز کے درمیان منتقل ہوتا ہے۔ UI اجزاء (UIView، UIViewController)، سنگلٹن اور مشترکہ شناخت والی اشیاء کے لیے کلاسز منتخب کی جاتی ہیں۔
Apple Swift میں ڈیٹا ماڈلنگ کے لیے struct کو بطور ڈیفالٹ قسم استعمال کرنے کی تجویز کرتا ہے۔ ڈھانچے پیش قیاسی کاپی سیمنٹکس اور حوالہ گنتی کے اوور ہیڈ کی عدم موجودگی کی وجہ سے زیادہ تر منظرناموں کے لیے موزوں ہیں۔ آئیے عام حالات دیکھتے ہیں جہاں struct بہترین انتخاب ہے۔
اگر کوئی وجود وراثت کی ضرورت کے بغیر ڈیٹا رکھتا ہے (Product، User، Order، Point)، struct استعمال کریں۔ مرتب کنندہ خود بخود memberwise initializer پیدا کرتا ہے — آپ کو دستی طور پر init لکھنے کی ضرورت نہیں۔ Equatable اور Hashable بھی ان ڈھانچوں کے لیے خود بخود نافذ ہوتے ہیں جن کی تمام خصوصیات ان پروٹوکولز کی پابند ہیں۔
ترتیبات، سیٹنگز اور جھنڈوں کے لیے جو تخلیق کے بعد تبدیل نہیں ہوتے، struct class سے بہتر ہے۔ ایک مستقل (let) ڈھانچہ تمام اندرونی فیلڈز کی عدم تغیر کو یقینی بناتا ہے — class میں یہ صرف حوالے پر لاگو ہوتا ہے، آبجیکٹ کے مواد پر نہیں۔
ویلیو سیمنٹکس کی وجہ سے ڈھانچے ملٹی تھریڈڈ ماحول میں محفوظ ہیں۔ ہر تھریڈ ڈیٹا کی ایک آزاد کاپی حاصل کرتا ہے اور دوسرے تھریڈز کو متاثر نہیں کرتا۔ Value types کے لیے تھریڈز کے درمیان ڈیٹا ریس ناممکن ہے، جو SwiftUI میں ماڈلز کے لیے struct کو ترجیحی انتخاب بناتا ہے (ObservableObject کو class درکار ہے، لیکن @State struct استعمال کرتا ہے)۔
// ڈیٹا ماڈل کے لیے struct استعمال کی مثال
struct User: Codable, Identifiable {
let id: UUID
var name: String
var email: String
var isPremium: Bool
// حساب شدہ خصوصیت — non-mutating
var displayName: String {
isPremium ? "\(name) ⭐️" : name
}
}
// خودکار memberwise ابتدا کار
let user = User(
id: UUID(),
name: "Alice",
email: "alice@example.com",
isPremium: true
)
// ملٹی تھریڈنگ کے لیے کاپی کرنا محفوظ ہے
var userCopy = user
userCopy.isPremium = false
// user.isPremium true رہتا ہے
class استعمال کریں جب آپ کو وراثت (UIKit/AppKit اجزاء)، مشترکہ شناخت (delegate، observer) یا کنٹرول شدہ آبجیکٹ لائف سائیکل (deinit) کی ضرورت ہو۔ باقی سب کے لیے — struct استعمال کریں۔
اکثر پوچھے گئے سوالات
Struct Swift میں ایک ویلیو ٹائپ ہے جو کوڈ کے حصوں کے درمیان منتقل کرتے وقت کاپی ہوتا ہے۔ ڈھانچوں میں خصوصیات، طریقے، ابتدا کار ہو سکتے ہیں اور وہ پروٹوکول نافذ کر سکتے ہیں۔ Swift کی بنیادی اقسام (Int، String، Array) ڈھانچے کے طور پر نافذ کی گئی ہیں۔
Struct ایک value type ہے (تفویض پر کاپی ہوتا ہے)، وراثت کی حمایت نہیں کرتا اور ARC کی ضرورت نہیں۔ Class ایک reference type ہے (حوالہ سے منتقل ہوتا ہے)، وراثت، اختتامیہ اور حوالہ گنتی کی حمایت کرتا ہے۔ ڈویلپر struct کو ڈیفالٹ قسم کے طور پر تجویز کرتے ہیں۔
Mutating ایک کلیدی لفظ ہے جو اشارہ کرتا ہے کہ ڈھانچے کا کوئی طریقہ اس کی خصوصیات کو تبدیل کر سکتا ہے۔ Mutating کے بغیر، مرتب کنندہ فیلڈ کی تبدیلی کو منع کرتا ہے۔ Mutating طریقے صرف var کے ساتھ اعلان کردہ متغیرات پر کال کیے جا سکتے ہیں، let پر نہیں۔
Copy-on-Write (COW) ڈھانچوں کے لیے Swift کی ایک اصلاح ہے جس میں ڈیٹا کی اصل کاپی پہلی تبدیلی تک مؤخر کر دی جاتی ہے۔ جب تک تمام متغیرات صرف ڈھانچہ پڑھتے ہیں، وہ ایک میموری علاقہ شیئر کرتے ہیں۔ یہ بڑے مجموعوں کے ساتھ کام کرتے وقت کارکردگی بہتر کرتا ہے۔
وراثت کے بغیر ڈیٹا ماڈلز، ترتیبات، DTOs اور ملٹی تھریڈڈ منظرناموں کے لیے struct استعمال کریں۔ UIKit/AppKit UI اجزاء، سنگلٹن، مشترکہ شناخت والی اکائیوں (delegate، observer) اور اختتامیہ کی ضرورت والی اشیاء کے لیے class استعمال کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں