some View — یہ کیا ہے، SwiftUI میں مبہم قسم

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

some View ایک اہم Swift نحوی تعمیر ہے جس کے بغیر SwiftUI کام نہیں کر سکتا۔ Apple Swift Book, 2024 کے مطابق، some View ایک مبہم قسم (opaque type) ہے جو کمپائل ٹائم پر سخت ٹائپنگ کو برقرار رکھتے ہوئے مخصوص واپسی کی قسم کو چھپاتی ہے۔ یہ تعمیر View پروٹوکول کو عملدرآمد کی تفصیلات ظاہر کیے بغیر ایک متحد body دستخط رکھنے کی اجازت دیتی ہے۔

اہم نکات

  • some View — View پروٹوکول کی body خاصیت کے ذریعے لوٹائی گئی مبہم قسم
  • الٹی generics — ٹھوس قسم کمپائلر کے ذریعے طے کی جاتی ہے لیکن کال کرنے والے کوڈ سے پوشیدہ ہوتی ہے
  • کارکردگی — some View AnyView کے برعکس کوئی اضافی بوجھ نہیں ڈالتی
  • حدود — تمام واپسی کے راستوں کی ایک ہی ٹھوس قسم ہونی چاہیے
  • @ViewBuilder ConditionalContent کے ذریعے مختلف اقسام کا مسئلہ حل کرتا ہے

SwiftUI میں some View کیا ہے؟

some View Swift 5.1 میں متعارف کرائی گئی ایک مبہم قسم کی نحو ہے۔ یہ View پروٹوکول کی body خاصیت کی واپسی کی قسم کے طور پر استعمال ہوتی ہے۔ some View کا اشارہ means: “فنکشن یا خاصیت کچھ ٹھوس قسم لوٹاتی ہے جو View پروٹوکول کی تعمیل کرتی ہے، لیکن کال کرنے والا کوڈ نہیں جانتا اور نہیں جاننا چاہیے کہ وہ کون سی قسم ہے”۔

مبہم قسم کا تصور عام پروگرامنگ (generics) کا الٹا پہلو ہے۔ اگر generics کال کرنے والے کوڈ کو قسم متعین کرنے کی اجازت دیتی ہے، تو مبہم قسم عملدرآمد کو قسم متعین کرنے کی اجازت دیتی ہے، اسے کال کرنے والے سے چھپاتے ہوئے۔ یہ ڈویلپر کو معاہدہ تبدیل کیے بغیر اندرونی عملدرآمد تبدیل کرنے کی آزادی دیتا ہے۔

Swift Evolution SE-0244 کے مطابق، مبہم اقسام SwiftUI اور منسلک اقسام (PAT) والے پروٹوکول کے پیٹرن کو سپورٹ کرنے کے لیے شامل کی گئی تھیں، جو اس تعمیر کے بغیر واپسی کی قسم کے طور پر استعمال نہیں ہو سکتیں۔

some View کی ضرورت کیوں ہے

some View کے بغیر، body دستخط ناممکن ہوگا: View پروٹوکول کا ایک منسلک قسم Body ہے جو View کی تعمیل کرتی ہے۔ اگر body صرف View (ایک پروٹوکول کے طور پر) لوٹاتا، تو Swift واپسی کی جگہ پر Self کی ضروریات والے پروٹوکول کے ساتھ کام نہیں کر سکتا تھا۔ some View ایک ٹھوس لیکن پوشیدہ قسم فراہم کر کے اس مسئلے کو حل کرتی ہے۔

مبہم قسم: کام کرنے کا طریقہ کار

مبہم قسم ایک خاص قسم ہے جو کمپائلر کے لیے ٹھوس لیکن ڈویلپر کے لیے تجریدی برتاؤ کرتی ہے۔ جب کمپائلر some View دیکھتا ہے، تو وہ عملدرآمد کا تجزیہ کرتا ہے اور صحیح واپسی کی قسم متعین کرتا ہے۔ یہ قسم طے کر دی جاتی ہے اور متحرک ڈسپیچ کے بغیر کوڈ جنریشن کے لیے استعمال ہوتی ہے۔

swift
struct SimpleView: View {
    var body: some View {
        Text("ہیلو")
    }
}
// Compiler sees: body -> Text, not some View

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

اگر body کا عملدرآمد تبدیل ہوتا ہے (مثال کے طور پر، Text کی بجائے Text اور Button کا VStack لوٹایا جاتا ہے)، کمپائلر ٹھوس قسم کی دوبارہ وضاحت کرتا ہے۔ لیکن کال کرنے والے کوڈ (SwiftUI) کے لیے، دستخط وہی رہتا ہے — some View۔ یہ generics کا الٹا پہلو ہے: کال کرنے والا کوڈ عملدرآمد کی تبدیلیوں پر منحصر نہیں ہوتا۔

قسم کا تعین اور استحکام

مبہم اقسام کے اہم اصولوں میں سے ایک: some View لوٹانے والا فنکشن یا خاصیت ہمیشہ ایک ہی ٹھوس قسم لوٹانا چاہیے۔ آپ ایک if شاخ میں Text اور دوسری میں Image نہیں لوٹا سکتے۔ یہ حد کمپائلر کے ذریعے چیک کی جاتی ہے اور کال کرنے والے کوڈ کے لیے ایک ضمانت کے طور پر کام کرتی ہے۔

swift
struct BadView: View {
    var flag: Bool
    var body: some View {
        if flag {
            Text("صحیح")   // غلطی: Text vs VStack
        } else {
            VStack {
                Text("غلط")
                Image(systemName: "xmark")
            }
        }
    }
}

اس مسئلے کو حل کرنے کے لیے @ViewBuilder استعمال کیا جاتا ہے، جو مختلف شاخوں کو ConditionalContent کنٹینر میں لپیٹتا ہے۔ body پر @ViewBuilder کا حاشیہ SwiftUI میں معیاری عمل ہے، حالانکہ اگر body میں صرف ایک اظہار ہو تو یہ مضمر ہو سکتا ہے۔

some View بمقابلہ AnyView: موازنہ

AnyView ایک قسم ہے جو View کے ٹھوس عملدرآمد کو مٹا دیتی ہے (type erasure)۔ یہ کسی بھی View کو ایک ہی لفافے میں لپیٹتی ہے، مختلف اقسام کے Views کو ایک ہی کنٹینر میں ذخیرہ کرنے کی اجازت دیتی ہے۔ some View کے برعکس، AnyView رن ٹائم پر کام کرتی ہے اور لپیٹنے اور کھولنے کا اضافی بوجھ ڈالتی ہے۔

معیارsome ViewAnyView
حل کا وقتکمپائل ٹائمرن ٹائم
کارکردگیبراہ راست کال، بغیر بوجھ کےexistential container میں لپیٹنا
قسم کی لچکایک ٹھوس قسمکوئی بھی View قسم
متحرک تبدیلیمعاون نہیںرن ٹائم پر معاون
استعمال کی ترجیحجب بھی ممکن ہوصرف جب some View ناممکن ہو
PAT پروٹوکول سپورٹہاںہاں

AnyView کب استعمال کریں: صرف ان حالات میں جہاں رن ٹائم پر متحرک قسم کی تبدیلی کی ضرورت کی وجہ سے some View ناممکن ہو۔ مثال کے طور پر، ڈکشنری سے View لوٹاتے وقت یا تکراری ڈھانچے میں جہاں ٹھوس قسم کو ہر سطح پر تبدیل ہونا چاہیے۔ AnyView کو کم سے کم رکھنا چاہیے، کیونکہ ہر لپیٹنے سے SwiftUI کی اصلاحات غیر فعال ہو جاتی ہیں۔

عام غلط فہمی: AnyView body میں مختلف اقسام کا مسئلہ حل نہیں کرتی — @ViewBuilder اسے حل کرتا ہے۔ AnyView قسم مٹاتی ہے لیکن کمپائلر کو ایک واحد قسم کا اندازہ لگانے میں مدد نہیں کرتی۔ مشروط منطق کے لیے @ViewBuilder اور صرف متحرک ڈسپیچ کے لیے AnyView استعمال کریں۔

some View اور @ViewBuilder: ایک ساتھ کام کرنا

@ViewBuilder ایک result builder ہے جو خاص طور پر some View کے ساتھ کام کرنے کے لیے ڈیزائن کیا گیا ہے۔ یہ body میں مشروط منطق (if/else, switch) اور متعدد اظہارات کے استعمال کی اجازت دیتا ہے، جبکہ ایک ہی واپسی کی قسم برقرار رکھتا ہے۔ ViewBuilder خود بخود متعدد اظہارات کو TupleView میں اور مشروط شاخوں کو ConditionalContent میں لپیٹتا ہے۔

swift
struct ProfileView: View {
    let user: User?

    @ViewBuilder
    var body: some View {
        if let user {
            UserCard(user: user)
            Text("آن لائن")
                .font(.caption)
        } else {
            ProgressView("Loading...")
        }
    }
}

یہ کیسے کام کرتا ہے: @ViewBuilder کوڈ بلاک کا تجزیہ کرتا ہے اور مناسب buildBlock، buildOptional یا buildEither کال پیدا کرتا ہے۔ مشروط منطق کے لیے ConditionalContent بنایا جاتا ہے — ایک مشترکہ قسم جو شاخوں کے اندر ٹھوس اقسام کو چھپاتی ہے لیکن خود کمپائلر کے لیے ایک ہی قسم ہے۔ یہ مختلف ٹھوس اقسام کے مسئلے کو حل کرتا ہے۔

@ViewBuilder کے بغیر، ایک body خاصیت جس میں متعدد اظہارات یا مشروط منطق ہو، کمپائلیشن کی خرابی کا سبب بنے گی۔ یہی وجہ ہے کہ SwiftUI body پر @ViewBuilder کو مضمر طور پر لاگو کرتا ہے، اور حسب ضرورت خصوصیات اور فنکشنز کے لیے اسے واضح طور پر شامل کرنا ضروری ہے۔

@ViewBuilder کی درجہ بندی

@ViewBuilder درجہ بند ہو سکتا ہے: ایک ViewBuilder دوسرے کے اندر۔ یہ مختلف سطحوں پر شرائط کے ساتھ پیچیدہ تنظیمی ڈھانچے بنانے کی اجازت دیتا ہے۔ تاہم، گہری درجہ بندی پڑھنے کی اہلیت کو پیچیدہ بناتی ہے، لہذا درجہ بند شرائط کو علیحدہ View اجزاء میں نکالنے کی سفارش کی جاتی ہے۔

some View کی عملی مثالیں

مثال 1: حساب شدہ خاصیت سے حسب ضرورت View لوٹانا۔ ایک خاصیت some View لوٹا سکتی ہے، اندرونی ساخت کو چھپاتے ہوئے۔ یہ عوامی انٹرفیس کو تبدیل کیے بغیر کوڈ کی تنظیم نو کی اجازت دیتا ہے۔

swift
struct ArticleView: View {
    var body: some View {
        CardView {
            HeaderView()
            ContentView()
            FooterView()
        }
    }
}

struct CardView<Content: View>: View {
    let content: Content

    var body: some View {
        content
            .padding(16)
            .background(.white)
            .cornerRadius(12)
            .shadow(radius: 4)
    }
}

مثال 2: @ViewBuilder کے ذریعے View کو بندش کے طور پر منتقل کرنا۔ یہ پیٹرن معیاری SwiftUI کنٹینرز (VStack, HStack, List) میں استعمال ہوتا ہے اور حسب ضرورت اجزاء میں لاگو کیا جا سکتا ہے۔

swift
struct CustomContainer<Content: View>: View {
    @ViewBuilder let content: () -> Content

    var body: some View {
        VStack(alignment: .leading) {
            content()
        }
        .padding(20)
    }
}

مثال 3: ایک فیکٹری فنکشن جو some View لوٹاتا ہے۔ عملدرآمد کو ظاہر کیے بغیر پیرامیٹرز کی بنیاد پر View بنانے کی اجازت دیتا ہے۔ یہ خاص طور پر لائبریریوں اور دوبارہ قابل استعمال اجزاء کے لیے مفید ہے۔

swift
func makeIcon(for status: Status) -> some View {
    switch status {
    case .success:
        Image(systemName: "checkmark.circle.fill")
            .foregroundColor(.green)
    case .error:
        Image(systemName: "xmark.circle.fill")
            .foregroundColor(.red)
    case .pending:
        ProgressView()
    }
}

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

SwiftUI میں some View کا کیا مطلب ہے؟

some View ایک مبہم قسم ہے، جس کا مطلب ہے کہ View پروٹوکول کی تعمیل کرنے والی کچھ ٹھوس قسم لوٹائی جاتی ہے۔ ٹھوس قسم کمپائلر کے ذریعے طے کی جاتی ہے لیکن کال کرنے والے کوڈ سے پوشیدہ ہوتی ہے۔ یہ عملدرآمد کی تفصیلات ظاہر کیے بغیر سخت ٹائپنگ فراہم کرتا ہے۔

some View اور AnyView میں کیا فرق ہے؟

some View صفر بوجھ کے ساتھ کمپائل ٹائم پر حل ہو جاتی ہے۔ AnyView existential container میں لپیٹنے کے اضافی اخراجات کے ساتھ رن ٹائم پر type erasure استعمال کرتی ہے۔ جب بھی ممکن ہو some View استعمال کریں، AnyView صرف متحرک قسم کی تبدیلی کے لیے۔

کیوں some View if/else میں مختلف اقسام کے ساتھ استعمال نہیں کی جا سکتی؟

مبہم قسم کو تمام واپسی کے راستوں کے لیے ایک ٹھوس قسم کی ضرورت ہوتی ہے۔ مختلف اقسام کے ساتھ if/else اس ضرورت کی خلاف ورزی کرتا ہے۔ @ViewBuilder شاخوں کو ConditionalContent — ایک ہی قسم جو ٹھوس عملدرآمد کے فرق کو چھپاتی ہے — میں لپیٹ کر مسئلہ حل کرتا ہے۔

some View SwiftUI کی کارکردگی کو کیسے متاثر کرتی ہے؟

some View کارکردگی کو کم نہیں کرتی — کمپائلر صحیح قسم جانتا ہے اور براہ راست کوڈ تیار کرتا ہے۔ اس کے برعکس، any View (ایک پروٹوکول کے طور پر) متحرک ڈسپیچ کی ضرورت ہوگی۔ some View SwiftUI کے ڈیزائن میں شامل ایک اصلاح کا طریقہ کار ہے۔

کیا some View SwiftUI سے باہر استعمال کی جا سکتی ہے؟

ہاں، some Swift 5.1 کی ایک عام تعمیر ہے جو SwiftUI سے منسلک نہیں ہے۔ اسے کسی بھی پروٹوکول کے ساتھ استعمال کیا جا سکتا ہے: some Equatable، some Codable، some Collection۔ یہ [String: [Int]] جیسی پیچیدہ درجہ بند اقسام کو چھپانے کے لیے مفید ہے۔

خلاصہ

  • some View — View پروٹوکول کی body خاصیت کے ذریعے لوٹائی گئی Swift مبہم قسم
  • مبہم قسم — generics کا الٹا: عملدرآمد قسم متعین کرتا ہے، اسے کال کرنے والے سے چھپاتا ہے
  • کمپائلر کوڈ کی اصلاح کے لیے کمپائل ٹائم پر ٹھوس قسم طے کرتا ہے
  • @ViewBuilder ConditionalContent کے ذریعے مختلف اقسام کا مسئلہ حل کرتا ہے
  • AnyView — بوجھ کے ساتھ type erasure، صرف اس وقت استعمال کریں جب some View ناممکن ہو
  • ایک قسم کا اصول — تمام some View واپسی کے راستوں کی ایک ہی ٹھوس قسم ہونی چاہیے
  • some — ایک عام Swift تعمیر جو صرف View ہی نہیں بلکہ کسی بھی پروٹوکول پر لاگو ہوتی ہے

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

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

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

مزید پڑھیں