class — یہ کیا ہے، کلیدی تصورات اور Swift میں کام کرنے کا اصول

مصنف: IT Sectr اشاعت: 2026-06-17 مطالعے کا وقت: 8 منٹ

Class Swift زبان میں ایک حوالہ قسم (reference type) ہے، جس کی مثالیں تفویض پر کاپی ہونے کے بجائے حوالہ سے منتقل کی جاتی ہیں۔ structs کے برعکس، کلاسز وراثت، ڈی انیشیالائزیشن اور میموری کے انتظام کے لیے خودکار حوالہ گنتی ARC کو سپورٹ کرتی ہیں۔ Swift Programming Language Guide, 2026 کے مطابق، Apple کے UI فریم ورکس (UIKit, AppKit) کے ساتھ کام کرنے اور آبجیکٹ کی مشترکہ شناخت کی ضرورت والے پیٹرن کو نافذ کرنے کے لیے class ضروری ہے۔ class اور struct کے درمیان انتخاب Swift میں اہم تعمیری فیصلوں میں سے ایک ہے۔

اہم نکات

  • Class — Swift میں ایک حوالہ قسم جہاں متغیر ہیپ میں آبجیکٹ کا حوالہ ذخیرہ کرتا ہے، نہ کہ خود قدر۔
  • وراثت — کلاسز والدین کلاس کی خصوصیات اور طریقوں کو وراثت میں لے سکتی ہیں اور override کے ذریعے انہیں اوور رائڈ کر سکتی ہیں۔
  • ARC — خودکار حوالہ گنتی میموری کو آزاد کرتی ہے جب کسی آبجیکٹ پر کوئی مضبوط حوالہ باقی نہ رہے۔
  • Deinit — ایک خاص طریقہ جو وسائل صاف کرنے کے لیے آبجیکٹ کے آزاد ہونے سے پہلے بلایا جاتا ہے۔
  • شناخت — === اور !== آپریٹر چیک کرتے ہیں کہ آیا دو متغیر ایک ہی کلاس مثال کا حوالہ دیتے ہیں۔

Swift میں class کیا ہے؟

Class — Swift میں ایک مرکب حوالہ قسم ہے جو خصوصیات اور طریقوں کو وراثت اور متحرک ترسیل کی حمایت کے ساتھ ایک ہستی میں گروپ کرتی ہے۔ struct کے برعکس، ایک کلاس مثال ہیپ میں بنائی جاتی ہے، اور ایک متغیر اس مثال کا حوالہ ذخیرہ کرتا ہے، نہ کہ خود ڈیٹا۔

جب آپ کلاس متغیر کو دوسرے متغیر میں تفویض کرتے ہیں، تو دونوں میموری میں ایک ہی آبجیکٹ کا حوالہ دیتے ہیں۔ ایک حوالہ کے ذریعے تبدیلیاں دوسرے کے ذریعے نظر آتی ہیں — یہ حوالہ اقسام کی ایک بنیادی خاصیت ہے، جو وفد، مشاہدہ اور مشترکہ حالت کے پیٹرن میں استعمال ہوتی ہے۔

Apple Swift دستاویزات کے مطابق، UIKit اور AppKit کے ساتھ کام کرنے کا واحد طریقہ کلاسز ہیں، جہاں تمام UI اجزاء UIView اور UIViewController سے وراثت پاتے ہیں۔ مزید برآں، کلاسز ان پیٹرن کو نافذ کرنے کے لیے ضروری ہیں جن میں آبجیکٹ کی شناخت (ایک آبجیکٹ کے دو حوالے) اور کنٹرول شدہ زندگی کا دورانیہ درکار ہوتا ہے۔

حوالہ قسم کے طور پر class

حوالہ قسم کے معنی — کلاسز کی اہم خاصیت۔ کسی کلاس کو نئے متغیر میں تفویض کرتے وقت، Swift حوالہ کاپی کرتا ہے، ڈیٹا نہیں۔ ایک ہی مثال کا حوالہ دینے والے تمام متغیر اس کی موجودہ حالت دیکھتے ہیں اور اسے تبدیل کر سکتے ہیں۔ یہ رویہ قدر اقسام سے بنیادی طور پر مختلف ہے، جہاں ہر متغیر کو ایک آزاد کاپی ملتی ہے۔

swift
// حوالہ قسم کے معنی کی مثال
class User {
    var name: String
    init(name: String) { self.name = name }
}

let user1 = User(name: "Alice")
let user2 = user1           // user2 — ایک ہی حوالہ
user2.name = "Bob"

print(user1.name)               // "Bob" — user2 کے ذریعے تبدیل!

// === آپریٹر سے شناخت کی جانچ
print(user1 === user2)          // true — ایک ہی آبجیکٹ

=== (شناخت) اور !== آپریٹر چیک کرتے ہیں کہ آیا دو متغیر ایک ہی کلاس مثال کا حوالہ دیتے ہیں۔ یہ == (مساوات) سے مختلف ہے، جو خصوصیت کی قدروں کا موازنہ کرتا ہے۔ === آپریٹر struct کے لیے دستیاب نہیں ہے — قدر اقسام کی کوئی شناخت نہیں ہوتی۔

کلاسز کی وراثت

وراثت — ایک طریقہ کار جس کے ذریعے ایک کلاس والدین کلاس کی خصوصیات اور طریقوں کو اپنا سکتی ہے۔ Swift میں، ایک کلاس صرف ایک والدین سے وراثت حاصل کر سکتی ہے (واحد وراثت)، لیکن متعدد پروٹوکول نافذ کر سکتی ہے۔ override کلیدی لفظ وراثت میں ملے طریقہ یا خصوصیت کو اوور رائڈ کرنے کی اجازت دیتا ہے۔

بنیادی کلاس اور ذیلی کلاس

کوئی بھی کلاس جو کسی دوسری کلاس سے وراثت نہیں پاتی خود بخود بنیادی بن جاتی ہے (NSObject سے الجھائیں نہیں)۔ ایک ذیلی کلاس اپنے نام کے بعد بڑی آن سے والدین کی وضاحت کرتی ہے۔ اگر کوئی ذیلی کلاس والدین کے طریقہ کو اوور رائڈ کرتی ہے، تو اسے والدین کے رویے کو برقرار رکھنے کے لیے super.طریقہ() کال کرنا ہوگا — یہ مرتب کرنے والے کی ضرورت ہے۔

فائنل کلاس

class سے پہلے کلیدی لفظ final وراثت کو روکتا ہے۔ مرتب کرنے والا جامد ترسیل کے ذریعے فائنل کلاس کے طریقہ کالز کو بہتر بنا سکتا ہے، جس سے کارکردگی بہتر ہوتی ہے۔ ان کلاسز کے لیے final استعمال کریں جو توسیع کے لیے نہیں ہیں — یہ آپ کے ارادے کو دستاویز کرتا ہے اور کوڈ کو تیز کرتا ہے۔

swift
// Swift میں کلاس وراثت کی مثال
class Vehicle {
    var speed: Double = 0

    func description() -> String {
        "Speed: \(speed) km/h"
    }
}

// Car Vehicle سے وراثت پاتی ہے
class Car: Vehicle {
    var brand: String = "Unknown"

    override func description() -> String {
        "\(brand) - \(speed) km/h"
    }
}

// فائنل کلاس — وراثت کو روکتی ہے
final class ElectricCar: Car {
    var batteryLevel: Double = 100
}

let tesla = ElectricCar()
tesla.brand = "Tesla"
tesla.speed = 120
print(tesla.description())  // "Tesla - 120.0 km/h"

وراثت ایک طاقتور لیکن ذمہ دارانہ طریقہ کار ہے۔ گہری تنظیمی ڈھانچے (5+ سطحیں) دیکھ بھال اور جانچ کو پیچیدہ بناتی ہیں۔ وراثت کے بغیر فعال دوبارہ استعمال کے لیے، توسیع اور پروٹوکول پر مبنی پروگرامنگ کے ساتھ پروٹوکول استعمال کریں — ایک نقطہ نظر جسے Apple گہری کلاس تنظیمی ڈھانچے کے متبادل کے طور پر فروغ دیتا ہے۔

ڈی انیشیالائزیشن اور میموری کا انتظام

Swift کلاس میموری کے انتظام کے لیے ARC (خودکار حوالہ گنتی) استعمال کرتا ہے۔ ہر کلاس مثال میں ایک مضبوط حوالہ شمار کنندہ ہوتا ہے۔ جب نیا مضبوط حوالہ بنایا جاتا ہے، شمار کنندہ بڑھتا ہے؛ جب تباہ ہوتا ہے، گھٹتا ہے۔ جب شمار کنندہ صفر تک پہنچتا ہے، میموری آزاد ہو جاتی ہے۔

Deinit

Deinit — ایک طریقہ جو کلاس مثال کے آزاد ہونے سے پہلے خود بخود بلایا جاتا ہے۔ وسائل آزاد کرتا ہے: فائلیں بند کرتا ہے، اطلاعات کی رکنیت منسوخ کرتا ہے، ٹائمر روکتا ہے۔ Deinit صرف کلاسز کے لیے دستیاب ہے — structs اور enums میں یہ نہیں ہے۔

کمزور اور بلا مالک حوالہ جات

مضبوط حوالہ چکروں (retain cycles) کو روکنے کے لیے، Swift weak اور unowned حوالہ جات فراہم کرتا ہے۔ Weak ایک اختیاری حوالہ ہے جو آبجیکٹ کے آزاد ہونے پر خود بخود nil ہو جاتا ہے۔ Unowned غیر اختیاری ہے لیکن کسی ایسے آبجیکٹ کا حوالہ دیتا ہے جو موجودہ سیاق و سباق سے زیادہ زندہ رہنے کی ضمانت ہے۔ ایک عام retain cycle والدین-بچے کے تعلق میں ہوتا ہے: بچہ والدین کے لیے مضبوط حوالہ رکھتا ہے۔

swift
// ARC اور کمزور حوالہ کی مثال
class Parent {
    var name: String
    var child: Child?

    init(name: String) { self.name = name }
    deinit { print("\(name) آزاد ہو گیا") }
}

class Child {
    var name: String
    weak var parent: Parent?   // weak retain cycle کو روکتا ہے

    init(name: String) { self.name = name }
    deinit { print("\(name) آزاد ہو گیا") }
}

var parent: Parent? = Parent(name: "Anna")
parent?.child = Child(name: "Mia")
parent?.child?.parent = parent

parent = nil  // دونوں آبجیکٹ آزاد ہو گئے!
// weak کے بغیر یہ retain cycle بنائے گا

بچے آبجیکٹ سے والدین تک حوالہ جات اور closures میں کیپچر فہرستوں کے لیے ہمیشہ weak استعمال کریں۔ Unowned صرف اس وقت استعمال کریں جب آپ کو یقین ہو کہ آبجیکٹ موجودہ سیاق و سباق سے زیادہ زندہ رہے گا — unowned کا غلط استعمال آزاد میموری تک رسائی پر کریش کا سبب بن سکتا ہے۔

Class vs Struct: اہم فرق

class اور struct کے درمیان انتخاب ایک تعمیری فیصلہ ہے جو کارکردگی، تھریڈ کی حفاظت اور API ڈیزائن کو متاثر کرتا ہے۔ ہر معاملے میں صحیح فیصلہ کرنے میں مدد کے لیے اہم فرق کے جدول پر غور کریں۔

خصوصیتclassstruct
قسمحوالہ قسمقدر قسم (کاپی)
میموریہیپ + ARCاسٹیک / ان لائن
وراثتحمایت کرتی ہے (ایک والدین)حمایت نہیں کرتی
Deinitدستیابدستیاب نہیں
شناخت (===)حمایت کرتی ہےحمایت نہیں کرتی
Mutatingضروری نہیں (ہمیشہ mutating)صرف mutating کے ساتھ
Memberwise initپیدا نہیں ہوتاخود بخود پیدا ہوتا ہے
تھریڈ کی حفاظتضمانت نہیں (مشترکہ حالت)ضمانت ہے (کاپی)

کلاسز استعمال کریں جب آپ کو مشترکہ شناخت (کوڈ کے متعدد حصے ایک آبجیکٹ کے ساتھ کام کر رہے ہوں)، وراثت یا Objective-C runtime کے ساتھ تعامل کی ضرورت ہو۔ باقی سب کے لیے، structs ترجیح دی جاتی ہیں — وہ تیز، ملٹی تھریڈ کوڈ میں محفوظ ہیں اور میموری کے انتظام کی ضرورت نہیں ہوتی۔

Swift میں class کب استعمال کریں

Apple کی ڈیفالٹ struct استعمال کرنے کی سفارش کے باوجود، کئی مخصوص منظرناموں میں کلاسز ضروری ہیں۔ آئیے عملی مثالوں کے ساتھ ہر ایک کا جائزہ لیں۔

UIKit اور AppKit اجزاء

iOS اور macOS میں تمام UI اجزاء کلاسز ہیں جو UIView (iOS) یا NSView (macOS) سے وراثت پاتی ہیں۔ آپ UIViewController کو struct سے تبدیل نہیں کر سکتے — اسے وسائل آزاد کرنے کے لیے وراثت اور deinit کی ضرورت ہے۔ UIKit کے ساتھ کام کرتے وقت، کنٹرولرز، ویوز اور ان کے مندوبین کے لیے کلاسز استعمال کریں۔

سنگلٹن اور مشترکہ حالت

سنگلٹن پیٹرن (پوری ایپلیکیشن کے لیے ایک کلاس مثال) کو حوالہ معنی کی ضرورت ہے۔ منتظمین: NetworkManager، SettingsManager، AnalyticsService — عام طور پر مشترکہ static خصوصیت والی کلاسز کے طور پر لاگو کیے جاتے ہیں۔ Structs موزوں نہیں ہیں کیونکہ ہر کاپی ایک آزاد مثال ہوگی۔

ڈیپنڈنسی انجیکشن اور حوالہ آبجیکٹ

جب کوئی آبجیکٹ سچائی کا واحد ذریعہ ہونا چاہیے اور ماڈیولز کے درمیان حوالہ سے منتقل ہوتا ہے — class استعمال کریں۔ یہ حالت کے انتظام پر لاگو ہوتا ہے، جہاں ایک جگہ آبجیکٹ کو تبدیل کرنا تمام منحصر اجزاء میں نظر آنا چاہیے۔ SwiftUI میں ObservableObject کے لیے، کلاسز لازمی ہیں۔

swift
// ObservableObject — SwiftUI کے لیے class ضروری
import SwiftUI

class AppViewModel: ObservableObject {
    @Published var isLoggedIn: Bool = false
    @Published var username: String = ""

    func login(user: String) {
        isLoggedIn = true
        username = user
    }
}

// SwiftUI View میں استعمال
struct ContentView: View {
    @StateObject var viewModel = AppViewModel()

    var body: some View {
        Text(viewModel.isLoggedIn ? "خوش آمدید" : "لاگ ان")
    }
}

اصول: اگر کسی آبجیکٹ میں شناخت (دو حوالے -> ایک آبجیکٹ) ہونی چاہیے، ایک ہی مثال ہونی چاہیے یا UIKit/Objective-C کے ساتھ کام کرنا چاہیے — class منتخب کریں۔ اگر کوئی آبجیکٹ صرف ڈیٹا پر مشتمل ہے — struct منتخب کریں۔

اکثر پوچھے جانے والے سوالات

Swift میں class کیا ہے؟

Class Swift میں ایک حوالہ قسم ہے جو وراثت، ڈی انیشیالائزیشن اور میموری کے انتظام کے لیے ARC کو سپورٹ کرتی ہے۔ کلاس مثالیں ہیپ میں محفوظ ہوتی ہیں اور متغیر میں آبجیکٹ کا حوالہ ہوتا ہے، اس کی کاپی نہیں۔

Swift میں class struct سے کیسے مختلف ہے؟

Class — حوالہ قسم (حوالہ سے منتقل ہوتی ہے)، وراثت اور deinit کو سپورٹ کرتی ہے۔ Struct — قدر قسم (کاپی ہوتی ہے)، وراثت کو سپورٹ نہیں کرتی، لیکن پروٹوکول نافذ کرتی ہے اور خود بخود memberwise init حاصل کرتی ہے۔ Swift ڈیفالٹ قسم کے طور پر struct کی سفارش کرتا ہے۔

Swift میں ARC کیا ہے؟

ARC (خودکار حوالہ گنتی) — Swift کلاسز کے لیے میموری کے انتظام کا طریقہ کار۔ ہر مثال میں ایک مضبوط حوالہ شمار کنندہ ہوتا ہے۔ جب شمار کنندہ صفر تک پہنچتا ہے، میموری آزاد ہو جاتی ہے۔ weak اور unowned حوالہ جات آبجیکٹ کے درمیان retain cycles کو روکتے ہیں۔

Swift میں deinit کیا ہے؟

Deinit — ایک کلاس طریقہ جو اس کی میموری آزاد ہونے سے پہلے خود بخود بلایا جاتا ہے۔ فائلیں بند کرنے، اطلاعات کی رکنیت منسوخ کرنے اور دیگر صفائی کے کاموں کے لیے استعمال ہوتا ہے۔ Deinit صرف کلاسز میں دستیاب ہے — structs میں یہ نہیں ہے۔

Swift میں class کب استعمال کریں؟

UIKit/AppKit UI اجزاء، سنگلٹن، SwiftUI میں ObservableObject، مشترکہ شناخت والے آبجیکٹ (delegate, observer) اور Objective-C runtime کے ساتھ کام کرتے وقت class استعمال کریں۔ ڈیٹا ماڈلز، DTOs اور کنفیگریشنز کے لیے struct ترجیح دی جاتی ہے۔

خلاصہ

  • Class Swift میں حوالہ سے منتقل کرنے کے معنی کے ساتھ ایک حوالہ قسم ہے: ایک آبجیکٹ کی طرف اشارہ کرنے والے تمام متغیر اس کی موجودہ حالت دیکھتے ہیں اور اسے تبدیل کر سکتے ہیں۔
  • ARC مضبوط حوالہ گنتی کے ذریعے کلاس میموری کا انتظام کرتا ہے؛ weak اور unowned والدین-بچے کے تعلقات اور closures میں retain cycles کو روکتے ہیں۔
  • وراثت کلاسز کو والدین کے رویے کو دوبارہ استعمال اور اوور رائڈ کرنے کی اجازت دیتی ہے، لیکن گہری تنظیمی ڈھانچے (5+ سطحیں) کوڈ کی دیکھ بھال کو پیچیدہ بناتی ہیں۔
  • Deinit آبجیکٹ کے آزاد ہونے پر چلتا ہے اور وسائل — فائلیں، ٹائمر، NotificationCenter رکنیتیں — آزاد کرنے کے لیے ضروری ہے۔
  • UIKit اور AppKit تمام UI اجزاء کے لیے کلاسز کی ضرورت ہے — UIView، UIViewController، ان کے مندوبین اور ڈیٹا ذرائع۔
  • SwiftUI میں ObservableObject — class لازمی ہے کیونکہ SwiftUI @Published اور @StateObject کے ذریعے حوالہ سے تبدیلیوں کو ٹریک کرتا ہے۔
  • Apple نئے ڈیٹا اقسام کے لیے ڈیفالٹ قسم کے طور پر struct کی سفارش کرتا ہے — class صرف اس وقت استعمال کریں جب شناخت، وراثت یا Objective-C انضمام کی ضرورت ہو۔

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں