$lang['tuto'] = "سبق"; ?>$lang['tuto'] = "سبق"; ?> Swift 6 میں کسٹم UIView انیشیئلائزیشن

Swift 6 میں کسٹم UIView انیشیئلائزیشن مین ایکٹر آئسولیشن ایرر کو ٹھیک کرنا

Swift 6 میں کسٹم UIView انیشیئلائزیشن مین ایکٹر آئسولیشن ایرر کو ٹھیک کرنا
Swift concurrency

UIView سیٹ اپ میں Swift 6 مین اداکار تنہائی کے چیلنجز کا ازالہ کرنا

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

میرے رواج میں ذیلی کلاس، `SegmentedHeaderView`، میں نے اپنے یوزر انٹرفیس کو ترتیب دینے کے لیے ایک طریقہ کو کال کیا . اس نے اب تک ہمیشہ ٹھیک کام کیا تھا، لیکن سوئفٹ 6 نے ایک غیر الگ تھلگ سیاق و سباق سے "مین ایکٹر سے الگ تھلگ" طریقہ کو کال کرنے کے بارے میں ایک غلطی پھینک دی۔

اس قسم کی خرابی مایوس کن ہو سکتی ہے، خاص طور پر اگر آپ پرانے کوڈ کو منتقل کر رہے ہیں۔ میری طرح، بہت سے ڈویلپرز جیسے طریقوں پر انحصار کرتے ہیں۔ نب فائلوں سے آراء لوڈ کرنے کے لیے۔ ایک سادہ اپ ڈیٹ اس میں خلل نہیں ڈالنا چاہئے! 😩

اس گائیڈ میں، میں آپ کو ممکنہ حل کے بارے میں بتاؤں گا، بشمول Swift 6 کے نئے کنکرنسی ٹولز، جیسے `Task` اور `MainActor.assumeIsolated` کا استعمال۔ آخر تک، آپ کو اپنے UI سے سمجھوتہ کیے بغیر، `awakeFromNib()` میں مرکزی اداکار کو الگ تھلگ کرنے کے طریقوں کے بارے میں واضح نقطہ نظر حاصل ہوگا۔ 🛠️

حکم استعمال اور تفصیل کی مثال
@MainActor @MainActor func addContentView() کے بطور استعمال کیا جاتا ہے۔ دی انتساب مرکزی اداکار کے لیے ایک طریقہ کو الگ کرتا ہے، اس بات کو یقینی بناتا ہے کہ اسے مرکزی دھاگے پر عمل میں لایا گیا ہے، جو Swift 6 میں UI اپ ڈیٹس کے لیے اہم ہے۔
Task { @MainActor in } ٹاسک { @MainActor in addContentView() } کے بطور استعمال کیا جاتا ہے۔ یہ نقطہ نظر ایک نیا غیر مطابقت پذیر کام شروع کرتا ہے جو مرکزی اداکار پر کوڈ چلاتا ہے، اس بات کو یقینی بناتا ہے کہ UI سے متعلقہ کوڈ کو بلاک کیے بغیر مین تھریڈ پر عمل درآمد ہوتا ہے۔
MainActor.assumeIsolated MainActor.assumeIsolated { addContentView() } کے بطور استعمال ہوتا ہے۔ یہ کمانڈ فرض کرتی ہے کہ موجودہ سیاق و سباق پہلے سے ہی مرکزی اداکار پر ہے، جو مرکزی اداکار کے طریقوں کو ہم وقت ساز کالوں کی اجازت دیتا ہے اور Swift 6 میں ہم آہنگی کے مسائل سے بچنے میں مدد کرتا ہے۔
awakeFromNib() اوور رائیڈ فنک awakeFromNib() کے طور پر استعمال کیا جاتا ہے۔ یہ طریقہ ایک نب فائل سے ایک منظر کو لوڈ کرنے کے بعد کہا جاتا ہے، ابتدائی کے لئے ایک جگہ فراہم کرتا ہے. یہ سوئفٹ 6 میں غیر منقولہ ہے، جس سے اداکاروں کو الگ تھلگ کرنے کے تنازعات پیدا ہوتے ہیں جب اداکار کے مرکزی طریقوں تک براہ راست رسائی حاصل ہوتی ہے۔
UINib.instantiate nib.instantiate (withOwner: self، options: nil) کے بطور استعمال کیا جاتا ہے۔ یہ کمانڈ نب فائل کو لوڈ کرتی ہے، جس سے UI اجزاء کی ایک مثال بنتی ہے۔ اسے یہاں ایک نب فائل سے اپنی مرضی کے مطابق منظر کو متحرک طور پر لوڈ کرنے اور اسے مرکزی منظر میں شامل کرنے کے لیے استعمال کیا جاتا ہے۔
Bundle(for: type(of: self)) لیٹ بنڈل = بنڈل کے طور پر استعمال کیا جاتا ہے (برائے: قسم (کی: خود))۔ یہ لائن موجودہ کلاس پر مشتمل بنڈل کو بازیافت کرتی ہے، اس بات کو یقینی بناتی ہے کہ صحیح نب فائل لوڈ ہو یہاں تک کہ جب کلاس مختلف ماڈیولز یا فریم ورک میں استعمال ہو۔
XCTest درآمد XCTest کے طور پر استعمال کیا جاتا ہے. یہ Swift کے لیے ایک ٹیسٹنگ فریم ورک ہے، جسے یونٹ ٹیسٹ بنانے کے لیے استعمال کیا جاتا ہے۔ فراہم کردہ مثال میں، چیک کرتا ہے کہ SegmentedHeaderView شروع کرنے کا عمل بغیر کسی غلطی کے مکمل ہوتا ہے اور UI عناصر صحیح طریقے سے لوڈ ہوتے ہیں۔
setUp() اوور رائیڈ فنک سیٹ اپ() کے طور پر استعمال کیا جاتا ہے۔ یہ طریقہ XCTest میں ہر ٹیسٹ کے طریقہ سے پہلے چلتا ہے، ہر ٹیسٹ کے لیے کلین سیٹ اپ فراہم کرتا ہے۔ یہ جانچ کے مقاصد کے لیے SegmentedHeaderView کو شروع کرتا ہے۔
addSubview self.addSubview(view) کے بطور استعمال کیا جاتا ہے۔ یہ طریقہ ایک حسب ضرورت منظر کو مرکزی منظر کے درجہ بندی سے منسلک کرتا ہے، جس سے یہ اسکرین پر دکھائی دیتا ہے۔ یہ متحرک طور پر نِب فائلوں سے آراء کو لوڈ کرنے اور سرایت کرنے میں ضروری ہے۔
XCTAssertNotNil XCTAssertNotNil(headerView.contentView) کے بطور استعمال کیا جاتا ہے۔ یہ XCTest کمانڈ اس بات کی تصدیق کرتی ہے کہ ایک مخصوص متغیر صفر نہیں ہے، اس بات کی تصدیق کرتا ہے کہ UI سیٹ اپ نے مواد کا منظر کامیابی سے لوڈ کر دیا ہے۔

کسٹم UIView سیٹ اپ کے ساتھ Swift 6 میں مرکزی اداکار کی تنہائی کی خرابیوں کو حل کرنا

Swift 6 میں، ایک اہم تبدیلی کی گئی تھی کہ کس طرح غیر مطابقت پذیر کاموں کو سنبھالا جاتا ہے، خاص طور پر مرکزی اداکار کے ارد گرد۔ اپنی مرضی کے مطابق اپ ڈیٹ کرتے وقت ذیلی کلاس، SegmentedHeaderView، اس نئے مرکزی اداکار کی تنہائی کے اصول کی وجہ سے مجھے ایک خرابی کا سامنا کرنا پڑا۔ یہ خرابی اس وقت پیش آئی جب مرکزی اداکار کے الگ تھلگ طریقہ، addContentView() کو awakeFromNib() سے کال کرتے ہوئے پیش آیا، جسے Swift 6 غیر حل شدہ سیاق و سباق کے طور پر دیکھتا ہے۔ فراہم کردہ حلوں کا مقصد یہ یقینی بنانا تھا کہ addContentView() مرکزی اداکار پر چلتا ہے، UI کے ساتھ کسی بھی ہم آہنگی کے مسائل کو روکتا ہے۔

پہلا حل Task { @MainActor in } نحو کا استعمال کرتا ہے۔ یہ تکنیک ایک غیر مطابقت پذیر ٹاسک میں addContentView() کی کال کو لپیٹ دیتی ہے اور یہ بتاتی ہے کہ اسے مین ایکٹر پر چلنا چاہیے، اس بات کو یقینی بناتے ہوئے کہ UI سیٹ اپ مین تھریڈ پر ہو۔ ایسا کرنے سے، کام کی متضاد نوعیت UI کو مسدود نہیں کرتی بلکہ اداکار کی تنہائی کو برقرار رکھتی ہے۔ یہ بہت اہم ہے کیونکہ، iOS کی ترقی میں، UI اپ ڈیٹس ہمیشہ مین تھریڈ پر ہونی چاہئیں تاکہ خرابیوں سے بچا جا سکے۔ اس طرح کے ریپنگ کے طریقے سوئفٹ کے نئے کنکرنسی ماڈل میں استحکام کو یقینی بناتے ہیں۔

دوسرا حل ایک مطابقت پذیر، الگ تھلگ سیاق و سباق میں addContentView() کو کال کرنے کے لیے MainActor.assumeIsolated کا فائدہ اٹھاتا ہے۔ یہ فنکشن فرض کرتا ہے کہ موجودہ سیاق و سباق پہلے سے ہی مرکزی اداکار پر ہے، مطلب یہ ہے کہ یہ براہ راست مرکزی اداکار سے الگ تھلگ طریقوں تک رسائی حاصل کرسکتا ہے۔ یہ نقطہ نظر ان صورتوں میں اچھی طرح سے کام کرتا ہے جہاں ایک مطابقت پذیر سیٹ اپ کو ترجیح دی جاتی ہے یا اس کی ضرورت ہوتی ہے، خاص طور پر کچھ پیچیدہ UI سیٹ اپ میں جہاں غیر مطابقت پذیر عمل وقت کے مسائل کا باعث بن سکتا ہے۔ تاہم، جبکہ MainActor.assumeIsolated غلطی کو حل کرتا ہے، اس کا احتیاط سے استعمال کرنا ضروری ہے، کیونکہ یہ عام اداکاروں کی تنہائی کے اصولوں کو نظرانداز کرتا ہے۔ یہ فائدہ مند ہو سکتا ہے لیکن غیر متوقع رویے سے بچنے کے لیے احتیاط سے استعمال کی ضرورت ہے۔

آخر میں، یونٹ ٹیسٹ اس بات کی تصدیق کے لیے لاگو کیے گئے کہ یہ حل حسب منشا کام کرتے ہیں، خاص طور پر مختلف ماحول اور ٹیسٹ کیسز میں۔ XCTest درآمد کرکے اور setUp() اور XCTAssertNotNil() کو شامل کرکے، یونٹ ٹیسٹ اس بات کی تصدیق کرتے ہیں کہ SegmentedHeaderView کامیابی کے ساتھ اپنا منظر ایک nib فائل سے لوڈ کرتا ہے اور مواد کے منظر کو صحیح طریقے سے شروع کرتا ہے۔ XCTest یہاں انمول ہے، اس بات کو یقینی بناتا ہے کہ UI اجزاء درست طریقے سے شروع ہوں بغیر ہم آہنگی کے مسائل، قطع نظر اس سے کہ مرکزی اداکار کی تنہائی کا طریقہ استعمال کیا جائے۔ 🧑‍💻 یہ ٹیسٹنگ اپروچ ڈویلپرز کو جلد ہی مسئلے کو الگ کرنے کی اجازت دیتا ہے اور یہ اعتماد دیتا ہے کہ حل مختلف iOS آلات پر مستحکم رہے گا۔

UIView ابتدا کے لیے Swift 6 میں مرکزی اداکار کی تنہائی کو ہینڈل کرنا

طریقہ 1: اداکار کی تنہائی کا انتظام کرنے کے لیے ٹاسک اور @MainActor کا استعمال

class SegmentedHeaderView: UIView {
    @IBOutlet var contentView: UIView?
    // Other IBOutlet properties
    override func awakeFromNib() {
        super.awakeFromNib()
        Task { @MainActor in
            addContentView()
        }
    }
    
    @MainActor func addContentView() {
        guard let view = loadViewFromNib() else { return }
        view.frame = self.bounds
        self.addSubview(view)
        contentView = view
    }
    
    func loadViewFromNib() -> UIView? {
        let nibName = "SegmentedHeaderView"
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as? UIView
    }
}

Swift 6 میں MainActor.assumeIsolated کے ساتھ اداکار کی تنہائی کو نافذ کرنا

نقطہ نظر 2: ہم وقت ساز اداکار کالوں کے لیے MainActor.assumeIsolated کا استعمال

class SegmentedHeaderView: UIView {
    @IBOutlet var contentView: UIView?
    // Other IBOutlet properties
    override func awakeFromNib() {
        super.awakeFromNib()
        MainActor.assumeIsolated {
            addContentView()
        }
    }
    
    @MainActor func addContentView() {
        guard let view = loadViewFromNib() else { return }
        view.frame = self.bounds
        self.addSubview(view)
        contentView = view
    }
    
    func loadViewFromNib() -> UIView? {
        let nibName = "SegmentedHeaderView"
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(withOwner: self, options: nil).first as? UIView
    }
}

جانچ کے لیے ماڈیولرائزڈ کوڈ کا استعمال کرتے ہوئے حل

طریقہ 3: آسان یونٹ ٹیسٹنگ کے لیے SegmentedHeaderView کی ساخت

import XCTest
class SegmentedHeaderViewTests: XCTestCase {
    var headerView: SegmentedHeaderView!
    override func setUp() {
        super.setUp()
        headerView = SegmentedHeaderView()
        headerView.awakeFromNib()
    }
    func testAddContentView() {
        XCTAssertNotNil(headerView.contentView, "Content view should not be nil after adding")
    }
}

سوئفٹ 6 میں مین ایکٹر آئسولیشن اور یو آئی ویو انیشیلائزیشن سے خطاب

Swift 6 میں، جس طرح سے مرکزی اداکار ہم آہنگی کو سنبھالتا ہے وہ سخت ہو گیا ہے، خاص طور پر UI سیٹ اپ جیسے سیاق و سباق سے متعلق مخصوص علاقوں میں۔ کے ساتھ کام کرتے وقت ذیلی طبقات، ڈویلپرز عام طور پر اس طرح کے طریقے استعمال کرتے ہیں۔ نب فائل سے اپنی مرضی کے نظارے شروع کرنے کے لئے۔ تاہم، Swift 6 علاج کرتا ہے۔ ایک غیر الگ تھلگ سیاق و سباق کے طور پر، جو براہ راست کالوں کو روکتا ہے۔ @MainActor افعال یہ غلطیاں متعارف کرواتا ہے، جیسا کہ ہم ایک الگ تھلگ طریقہ کو کال کرنے کی کوشش کرتے وقت دیکھ رہے ہیں (جیسے، ) اس تناظر سے۔

سوئفٹ کے کنکرنسی ماڈل کے لیے ڈویلپرز کو کالز کو ایک میں لپیٹ کر موافقت کرنے کی ضرورت ہے۔ بلاک کرنا یا استعمال کرنا ایک الگ تھلگ سیاق و سباق میں پھانسی پر مجبور کرنا۔ ان طریقوں میں سے ہر ایک منفرد فوائد پیش کرتا ہے لیکن حدود کے ساتھ آتا ہے۔ کسی کام میں ریپنگ کوڈ غیر مطابقت پذیر ہے، لہذا یہ طریقہ مرکزی دھاگے کو مسدود نہیں کرے گا۔ تاہم، یہ UI ٹائمنگ کے مسائل کا باعث بن سکتا ہے۔ اس کے برعکس، استعمال کرتے ہوئے کوڈ کے ساتھ ایسا سلوک کرتا ہے جیسے یہ پہلے سے ہی مرکزی اداکار پر ہے، جو ہم وقت ساز آپریشنز کے لیے فائدہ مند ہو سکتا ہے لیکن غیر متوقع ضمنی اثرات سے بچنے کے لیے اسے احتیاط سے استعمال کرنا چاہیے۔

Swift 6 میں اس نئی ہینڈلنگ نے ہم آہنگی کے بارے میں بہت سے سوالات کو جنم دیا ہے، خاص طور پر پرانے Swift ورژن سے منتقلی کرنے والے ڈویلپرز کے لیے۔ یہ تبدیلیاں اداکار کی تنہائی کو سمجھنے کی اہمیت اور UI سے متعلقہ کوڈ میں مرکزی تھریڈ کے منفرد کردار کو اجاگر کرتی ہیں۔ اس تبدیلی کو اپنانے کے لیے، یہ یقینی بنانے کے لیے کہ UI مختلف آلات اور ماحول میں مستقل طور پر لوڈ اور کارکردگی دکھاتا ہے، ہر ایک نقطہ نظر کو جانچنا اور جانچنا ضروری ہے۔ یہ اصلاحات، ابتدائی طور پر چیلنج کرتے ہوئے، بالآخر سوئفٹ کو iOS کی کارکردگی اور حفاظتی معیارات کے ساتھ ہم آہنگ پروگرامنگ کے لیے ایک زیادہ مضبوط زبان بناتی ہیں۔ 💡

  1. "ایک ہم وقت ساز سیاق و سباق میں مرکزی اداکار سے الگ تھلگ مثال کے طریقہ کار" کا کیا مطلب ہے؟
  2. اس غلطی کا مطلب ہے نشان زدہ طریقہ ایک ایسے سیاق و سباق سے بلایا جا رہا ہے جو مرکزی اداکار سے الگ تھلگ نہیں ہے، جیسے . سوفٹ 6 ہم آہنگی کے مسائل سے بچنے کے لیے اس تنہائی کو نافذ کرتا ہے۔
  3. کیوں ہے غیر حل شدہ سیاق و سباق سمجھا جاتا ہے؟
  4. سوئفٹ 6 میں، اسے غیر حل شدہ سمجھا جاتا ہے کیونکہ یہ ایک مطابقت پذیر سیاق و سباق میں چلتا ہے، جو اس بات کی ضمانت نہیں دیتا ہے کہ یہ مرکزی اداکار پر ہے، جس سے ممکنہ ہم آہنگی کے تنازعات پیدا ہوتے ہیں۔
  5. کیسے کرتا ہے اس صورت حال میں کام کرتے ہیں؟
  6. آپ کو یہ فرض کرنے دیتا ہے کہ موجودہ کوڈ پہلے ہی مرکزی اداکار کے لیے الگ تھلگ ہے، جس سے مرکزی اداکار کے طریقوں کو ہم وقت ساز کالوں کی اجازت ملتی ہے جیسے . یہ کام کر سکتا ہے اگر آپ کو یقین ہے کہ طریقہ واقعی مرکزی دھاگے پر ہے۔
  7. کیا میں استعمال کر سکتا ہوں؟ کے بجائے ?
  8. ہاں، اکثر مرکزی اداکار کے اندر غیر مطابقت پذیر کالوں کو لپیٹنے کے لیے استعمال کیا جاتا ہے۔ تاہم، اگر UI اپ ڈیٹس کے لیے وقت اہم ہے، تو اس میں ایڈجسٹمنٹ کی ضرورت پڑ سکتی ہے کیونکہ یہ متضاد رویے کو متعارف کراتی ہے۔
  9. کیا استعمال کرنے کے خطرات ہیں؟ سوئفٹ 6 میں؟
  10. ہاں، یہ کمانڈ مرکزی اداکار کی تنہائی کی ضمانتوں میں سے کچھ کو نظر انداز کرتی ہے، لہذا غلط استعمال غیر متوقع غلطیوں یا UI کی خرابیوں کا باعث بن سکتا ہے۔ اسے تھوڑا اور صرف اس وقت استعمال کیا جانا چاہئے جب وقت کی درستگی ضروری ہو۔
  11. کیا UI سے متعلق طریقوں کے لیے @MainActor استعمال کرنا ضروری ہے؟
  12. ہاں، Swift 6 میں، UI کو اپ ڈیٹ کرنے کے طریقے کارکردگی اور تھریڈ سیفٹی کے لیے مرکزی اداکار پر چلنا چاہیے۔ استعمال کرنا Swift اس اصول کو نافذ کرنے میں مدد کرتا ہے۔
  13. استعمال کرنے میں کیا فرق ہے۔ اور a چادر
  14. کسی فنکشن کو براہ راست مین تھریڈ سے الگ کرنے کے لیے استعمال کیا جاتا ہے، جبکہ a ریپر مرکزی اداکار کے اندر غیر مطابقت پذیر رویہ فراہم کرتا ہے، جو نان بلاکنگ آپریشنز کے لیے مفید ہے۔
  15. XCTest کیا ہے، اور اسے اس سیٹ اپ میں کیوں استعمال کیا جاتا ہے؟
  16. سوئفٹ کا ٹیسٹنگ فریم ورک ہے، جس کا استعمال اس بات کی توثیق کرنے کے لیے کیا جاتا ہے کہ UI اجزاء صحیح طریقے سے شروع ہوتے ہیں اور طریقوں میں ہم آہنگی سے متعلق مسائل کو روکتے ہیں جیسے .
  17. میں کیسے جانتا ہوں کہ اگر میرا ذیلی کلاس ہم آہنگی کے مسائل کے بغیر چلتا ہے؟
  18. کا استعمال کرتے ہوئے جانچ مناسب ابتداء کو یقینی بنا سکتا ہے، اور اس بات کی تصدیق کر سکتا ہے کہ UI اپ ڈیٹس صرف مرکزی دھاگے پر ہی ہوتے ہیں کنکرنسی کی غلطیوں کو روکنے میں مدد کر سکتے ہیں۔
  19. کیا یہ تبدیلیاں پسماندہ مطابقت پر اثر انداز ہوں گی؟
  20. ہاں، ان کنکرنسی ٹولز کو استعمال کرنے کے لیے Swift 6 یا بعد کا ورژن درکار ہے، اس لیے ان ایڈجسٹمنٹ کا استعمال کرنے والا کوڈ پہلے کے Swift ورژن پر نہیں چلے گا۔

سوئفٹ 6 کے لیے کوڈ کو اپ ڈیٹ کرنے کا مطلب بعض اوقات دیرینہ طریقوں پر نظر ثانی کرنا ہوتا ہے، خاص طور پر سخت موافقت اور قواعد میں UI عناصر کے ساتھ کام کرتے وقت ذیلی طبقات، جیسے حل کا استعمال کرتے ہوئے اور MainActor.assumeIsolated Swift کے نئے رہنما خطوط کے اندر رہتے ہوئے ہموار اور محفوظ UI سیٹ اپ کو یقینی بنا سکتا ہے۔

ان ایڈجسٹمنٹس کو سیکھنے سے ڈویلپرز کو آپٹمائزڈ کنکرنسی ہینڈلنگ کے ساتھ مزید مستحکم ایپلی کیشنز بنانے کی اجازت ملتی ہے۔ جیسے جیسے Swift کا کنکرنسی ماڈل تیار ہوتا ہے، ان طریقوں کو اپنانا مضبوط، ریسپانسیو ایپس بنانے کے لیے ضروری ہو جاتا ہے جو iOS کی ترقی کے معیارات کو برقرار رکھتی ہیں۔ 🚀

  1. یہ مضمون گہری تفصیلات کے لیے سوئفٹ کنکرنسی اور مرکزی اداکار کی تنہائی پر آفیشل ایپل ڈویلپر دستاویزات کا حوالہ دیتا ہے۔ سوئفٹ کنکرنسی پر ایپل ڈویلپر کی دستاویزات
  2. سوئفٹ میں UIView ذیلی طبقے کی شروعات اور ہم آہنگی کو سنبھالنے کے بارے میں اضافی بصیرت کا حوالہ سبق اور مثالوں سے لیا گیا تھا۔ رے وینڈرلچ .
  3. سوئفٹ میں ٹیسٹنگ اور بہترین طریقوں کے لیے، جدید ترین سوئفٹ ارتقاء کی تجویز سے رہنمائی لی گئی، جو Swift 6 میں اداکاروں کو الگ تھلگ کرنے کے اصولوں پر بحث کرتی ہے۔ سوئفٹ ارتقاء کی تجویز