Sendable — یہ کیا ہے، تھریڈ سیفٹی پروٹوکول

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

Sendable ایک Swift پروٹوکول ہے جو تھریڈز کے درمیان منتقلی کے لیے محفوظ اقسام کو نشان زد کرتا ہے۔ کنکرنسی (actor, async/await, Task) کے ساتھ کام کرتے وقت، Swift کمپائلر مطالبہ کرتا ہے کہ الگ تھلگ سیاق و سباق کے درمیان منتقل کردہ تمام ڈیٹا Sendable کے مطابق ہو۔ یہ غیر محفوظ اقسام کی حادثاتی منتقلی کو روکتا ہے جو ڈیٹا ریس کا باعث بن سکتی ہیں۔ پروٹوکول ایک معاہدے کے طور پر کام کرتا ہے: Sendable کے مطابق ایک قسم اندرونی غیر ہم آہنگ حالت کی عدم موجودگی کی ضمانت دیتی ہے۔ WWDC 2021 کے مطابق، محفوظ ملٹی تھریڈڈ آرکیٹیکچر ڈیزائن کرتے وقت Sendable پروٹوکول ایک لازمی عنصر ہے۔

اہم نکات

  • Sendable — ایک پروٹوکول جو تھریڈز کے درمیان منتقلی میں ڈیٹا ریس کی عدم موجودگی کی ضمانت دیتا ہے
  • ویلیو اقسام (struct, enum) خود بخود Sendable کے مطابق ہو جاتی ہیں اگر ان کی تمام خصوصیات Sendable ہوں
  • @unchecked Sendable — ان کلاسز کے لیے ایک بائی پاس میکانزم جن کی حفاظت کی ذمہ داری ڈویلپر لیتا ہے
  • Sendable closures کو @Sendable وصف سے نشان زد کیا جاتا ہے، جو متغیر کی گرفت کو چیک کرتا ہے
  • کمپائلر خرابی دیتا ہے اگر کوئی غیر Sendable قسم الگ تھلگ سیاق و سباق کے درمیان منتقل کی جائے

Swift میں Sendable پروٹوکول کیا ہے؟

Sendable Swift معیاری لائبریری (SE-0302) کا ایک پروٹوکول ہے جو علیحدگی کے ڈومینز کے درمیان منتقلی کے لیے محفوظ اقسام کو نشان زد کرتا ہے۔ علیحدگی کے ڈومین کا مطلب actor، Task یا @MainActor سیاق و سباق ہے۔ Sendable میں کوئی تقاضے نہیں ہیں — یہ حفاظتی نشان گر کے طور پر کام کرتا ہے۔

Sendable کی ضرورت کیوں ہے

Swift 5.5 سے پہلے، ڈویلپر DispatchQueue کے ذریعے کسی بھی شے کو تھریڈز کے درمیان منتقل کر سکتے تھے، اور کمپائلر چیک نہیں کرتا تھا کہ آیا یہ محفوظ ہے۔ Sendable اس خلا کو پُر کرتا ہے: اب کمپائلر خود کراس تھریڈ منتقلیوں کو ٹریک کرتا ہے اور غیر محفوظ منتقلیوں کو بلاک کرتا ہے۔ یہ ہمہ وقت کوڈ کو چلانے سے پہلے ہی زیادہ قابل اعتماد بناتا ہے۔

swift
struct UserProfile: Sendable {
    let name: String
    let age: Int
}

class NonSendableClass {
    var counter: Int = 0
}

مثال میں، UserProfile کو تھریڈز کے درمیان محفوظ طریقے سے منتقل کیا جا سکتا ہے کیونکہ یہ Sendable اقسام کی مستقل خصوصیات والا ایک struct ہے۔ NonSendableClass await کے ذریعے یا Task میں منتقل کرنے کی کوشش پر کمپائلیشن خرابی کا سبب بنے گا۔

کون سی اقسام ڈیفالٹ طور پر Sendable کے مطابق ہیں

Swift میں Sendable اقسام تین زمروں میں تقسیم ہوتی ہیں: Sendable خصوصیات والی ویلیو اقسام، ناقابل تبدیل حالت والی final کلاسز، اور @Sendable سے نشان زد فنکشنز/closures۔ کمپائلر ویلیو اقسام کے لیے خود بخود Sendable مطابقت کا اندازہ لگاتا ہے۔

ویلیو اقسام اور خودکار مطابقت

Struct, Enum اور tuple خود بخود Sendable بن جاتی ہیں اگر ان کی تمام خصوصیات اور وابستہ قدریں بھی Sendable ہوں۔ یہ ایک قدامت پسندانہ نقطہ نظر ہے: اگر کم از کم ایک خصوصیت Sendable کے مطابق نہیں ہے تو پوری قسم کو محفوظ نہیں سمجھا جائے گا۔

قسمSendableشرط
Structہاں (واضح اعلان کے بغیر)تمام خصوصیات Sendable ہیں
Enumہاں (واضح اعلان کے بغیر)تمام وابستہ قدریں Sendable ہیں
Final classہاں (واضح اعلان کے ساتھ)تمام let خصوصیات Sendable ہیں، کوئی var نہیں
Non-final classنہیںوراثت کی وجہ سے Sendable نہیں ہو سکتی

بنیادی اقسام

تمام Swift میں شامل اقسام — Int, String, Double, Bool, Optional, Array, Dictionary, Set — Sendable کے مطابق ہیں۔ یہ قسم کی ترکیب کو ڈیفالٹ طور پر محفوظ بناتا ہے۔ ڈویلپر کو صرف حسب ضرورت کلاسز پر توجہ دینی ہوتی ہے۔

Sendable اور کلاسز: @unchecked Sendable

@unchecked Sendable ایک میکانزم ہے جو کلاس کو کمپائلر چیک کو نظرانداز کرتے ہوئے واضح طور پر خود کو Sendable قرار دینے کی اجازت دیتا ہے۔ ڈویلپر ایسی کلاس کی تھریڈ حفاظت کی ذمہ داری لیتا ہے۔ یہ Objective-C پلوں اور بہتر ساختوں کے لیے مفید ہے۔

@unchecked Sendable کب استعمال کریں

@unchecked Sendable اس وقت استعمال کیا جاتا ہے جب کوئی کلاس اندرونی طور پر تالے یا ایٹمی کارروائیوں کے ذریعے حفاظت کو یقینی بناتی ہے، لیکن کمپائلر اسے جامد طور پر تصدیق نہیں کر سکتا۔ مثال کے طور پر، os_unfair_lock یا pthread_mutex_t والی کلاس — اس کی تھریڈ حفاظت کوڈ کے ذریعے یقینی بنائی جاتی ہے، لیکن Swift اسے نہیں دیکھتا۔

swift
final class AtomicCounter: @unchecked Sendable {
    private var value: Int = 0
    private let lock = NSLock()
    
    func increment() {
        lock.lock()
        value += 1
        lock.unlock()
    }
}

@unchecked Sendable کا استعمال احتیاط سے کیا جانا چاہیے۔ یہ دوسرے ڈویلپرز کے لیے ایک واضح اشارہ ہے: «میں نے جانچ لیا، یہ محفوظ ہے۔» نفاذ میں خرابی مشکل سے پکڑی جانے والی ریس کا سبب بن سکتی ہے۔ @unchecked استعمال کرنے سے پہلے، یقینی بنائیں کہ قسم واقعی ویلیو قسم کے طور پر دوبارہ نہیں لکھی جا سکتی۔

Actor کے ساتھ Sendable

Actor اور Sendable ایک ہی سکے کے دو رخ ہیں۔ Actor اپنی حالت کو الگ کرتا ہے، لیکن بیرونی دنیا کے ساتھ ڈیٹا کے تبادلے کے لیے اسے Sendable اقسام واپس کرنی ہوں گی۔ اگر actor کا کوئی طریقہ غیر Sendable قسم واپس کرتا ہے، تو کمپائلر انتباہ یا خرابی دیتا ہے۔

Sendable کے ذریعے ڈیٹا کی منتقلی

جب کوئی actor بیرونی کوڈ کو ڈیٹا بھیجتا ہے، تو یہ ڈیٹا علیحدگی کی حد کو عبور کرتا ہے۔ Sendable ضمانت دیتا ہے کہ وصول کنندہ اسے actor کے باہر محفوظ طریقے سے استعمال کر سکتا ہے۔ Actor خود الگ تھلگ رہتا ہے — اس کی اندرونی حالت ظاہر نہیں ہوتی۔

swift
struct AccountSnapshot: Sendable {
    let id: UUID
    let balance: Double
    let lastUpdated: Date
}

actor BankActor {
    private var balance: Double = 0
    
    func snapshot() async -> AccountSnapshot {
        return AccountSnapshot(
            id: UUID(),
            balance: balance,
            lastUpdated: Date()
        )
    }
}

AccountSnapshot ایک Sendable struct ہے جس میں صرف Sendable اقسام کی let خصوصیات ہیں۔ یہ نقطہ نظر actor سے ڈیٹا نکالنے کے لیے بہترین عمل ہے۔ حالت کی سنیپ شاٹ قیمت کے طور پر منتقل ہوتی ہے، اور actor اپنی حالت پر کنٹرول نہیں کھوتا۔

Sendable فنکشنز اور closures

@Sendable فنکشنز اور closures کے لیے ایک وصف ہے جو ضمانت دیتا ہے کہ closure غیر Sendable ڈیٹا کو قابل تبدیلی شکل میں گرفت نہیں کرتا۔ جب کوئی closure Task یا actor طریقہ میں منتقل کیا جاتا ہے، تو اسے Sendable ہونا چاہیے۔

@Sendable closures میں گرفت کی جانچ

کمپائلر چیک کرتا ہے کہ @Sendable closure کلاسز کے قابل تبدیل حوالہ جات کو گرفت نہیں کرتا۔ Sendable اقسام کی let خصوصیات کو گرفت کرنے کی اجازت ہے۔ حوالہ قسم کے var متغیر کو گرفت کرنے سے خرابی ہوگی کیونکہ closure تغیر کے ساتھ بیک وقت عمل میں آ سکتا ہے۔

swift
func performAsync(operation: @Sendable () -> Void) {
    Task {
        await operation()
    }
}

let constant = "Safe"
var counter = 0
// counter — var کو گرفت کرنے سے counter تبدیل ہوتا ہے، کمپائلیشن خرابی
performAsync { // ❌ گرفت کردہ متغیر کی تبدیلی
    print(constant)
}

قاعدہ سادہ ہے: ایک @Sendable closure صرف ان ڈیٹا کو گرفت کر سکتا ہے جو خود Sendable ہوں اور باہر سے تبدیل نہیں ہوں گے۔ کلاسز کے لیے، کمزور حوالہ weak self کو گرفت کرنے کی اجازت ہے اگر کلاس Sendable کے طور پر نشان زد نہ ہو۔ یہ کلاسک retain cycles اور ریس کنڈیشنز کو روکتا ہے۔

اکثر پوچھے گئے سوالات

سادہ الفاظ میں Swift میں Sendable کیا ہے؟

Sendable ایک نشان گر ہے جو کمپائلر کو بتاتا ہے: «اس قسم کو تھریڈز کے درمیان محفوظ طریقے سے منتقل کیا جا سکتا ہے۔» structs اور constants عام طور پر ڈیفالٹ طور پر Sendable ہوتے ہیں، کلاسز اس وقت تک نہیں جب تک واضح طور پر بیان نہ کیا جائے۔

کون سی اقسام خود بخود Sendable کے مطابق ہیں؟

Sendable خصوصیات والی ویلیو اقسام (struct, enum)، ناقابل تبدیل حالت والی final کلاسز، اور تمام بنیادی Swift اقسام: Int, String, Double, Bool, Array, Dictionary, Optional — خود بخود Sendable کے مطابق ہیں۔

@unchecked Sendable کیا ہے؟

@unchecked Sendable کمپائلر کے جامد چیک کے بغیر کلاس کو Sendable قرار دینے کا ایک طریقہ ہے۔ ڈویلپر خود حفاظت کو یقینی بناتا ہے، اکثر تالوں یا ایٹمی کارروائیوں کے ذریعے۔

Actor کے لیے Sendable کیوں ضروری ہے؟

Actor اپنی حالت کو الگ کرتا ہے، لیکن بیرونی کوڈ کو ڈیٹا واپس کرتے وقت، یہ ڈیٹا علیحدگی کی حد کو عبور کرتا ہے۔ Sendable ضمانت دیتا ہے کہ وصول کنندہ کو actor کے باہر اس ڈیٹا کو استعمال کرتے ہوئے ریس کا سامنا نہیں کرنا پڑے گا۔

Swift میں کلاس کو Sendable کیسے بنایا جائے؟

ایک final کلاس میں Sendable پروٹوکول شامل کریں، جس کی تمام خصوصیات Sendable اقسام کے constants ہوں۔ اگر کلاس تالے استعمال کرتی ہے، تو @unchecked Sendable استعمال کیا جا سکتا ہے، لیکن اسے احتیاط کی ضرورت ہے۔

خلاصہ

  • Sendable — کراس تھریڈ ڈیٹا کی محفوظ منتقلی کے لیے ایک نشان گر پروٹوکول
  • ویلیو اقسام شرائط پوری ہونے پر خود بخود Sendable کے مطابق ہو جاتی ہیں
  • کلاسز کو واضح Sendable یا @unchecked Sendable اعلان کی ضرورت ہوتی ہے
  • Actor بیرونی کوڈ کو صرف Sendable اقسام کے ذریعے ڈیٹا واپس کرتا ہے
  • @Sendable closure وصف متغیر گرفت کی درستگی کو چیک کرتا ہے
  • کمپائلر جامد طور پر Sendable مطابقت کو چیک کرتا ہے، تعمیر کے وقت ریس کو روکتا ہے

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

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

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

مزید پڑھیں