Typealias: یہ کیا ہے، نحو اور استعمال

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

Typealias Swift میں ایک اعلان ہے جو نئی قسم کی تعریف کیے بغیر موجودہ قسم کے لیے متبادل نام بناتا ہے۔ عرفی نام مرتب وقت پر اصل قسم کے مکمل طور پر مساوی ہے — مرتب‌کار جہاں بھی typealias استعمال ہوتا ہے اصل قسم کو بدل دیتا ہے۔ Swift Language Guide (2025) کے مطابق، typealias لمبے دستخطوں کو مختصر کرنے، پروٹوکول میں associatedtype کے ذریعے اندرونی اقسام کو تجریدی بنانے اور پیچیدہ generic پیرامیٹرز کو آسان بنانے کے لیے استعمال ہوتا ہے۔ قسم کے ریپر کے برعکس، typealias قسم کی حفاظت نہیں بڑھاتا — یہ صرف ایک عرفی نام ہے جسے قسم کا نظام ممتاز نہیں کرتا۔

اہم نکات

  • Typealias — موجودہ قسم کا عرفی نام، نئی قسم نہیں بناتا؛ مرتب‌کار اسے اصل سے بدل دیتا ہے
  • نحو: typealias NewName = ExistingType — کسی بھی سطح پر اعلان کیا جا سکتا ہے (عالمی، مقامی، قسم کے اندر)
  • Associatedtype — پروٹوکول کے اندر typealias، ایک منسلک قسم کی تعریف کرتا ہے جو پروٹوکول اپنائے جانے پر متعین ہوتی ہے
  • Generic دستخط — typealias لمبے پیرامیٹرز مختصر کرتا ہے: typealias Result = Swift.Result<Data, Error>
  • Closure اقسام — typealias پڑھنے کی اہلیت بہتر بناتا ہے: typealias Handler = (Int) -> Void

Typealias کیا ہے؟

Typealias Swift میں ایک اعلان ہے جو موجودہ قسم کے لیے متبادل نام متعارف کراتا ہے۔ Typealias اعلان کرنے کے بعد، نیا نام وہاں استعمال کیا جا سکتا ہے جہاں اصل قسم کی توقع ہو — مرتب‌کار انہیں ایک جیسا سمجھتا ہے۔ Typealias معنوی علیحدگی نہیں بڑھاتا: UserID قسم کی قدر (جو String کے لیے typealias ہے) بغیر کسی غلطی کے String کی توقع رکھنے والے فنکشن میں بھیجی جا سکتی ہے۔

Typealias کے بنیادی مقاصد لمبے ناموں کو مختصر کرنا، قسم کے مقصد کو دستاویز کرنا اور ٹھوس نفاذ کو تجریدی بنانا ہے۔ مثال کے طور پر، typealias JSON = [String: Any] واضح طور پر ظاہر کرتا ہے کہ ایک لغت JSON ساخت کے طور پر استعمال ہوتی ہے، اور typealias Completion = (Result<Data, Error>) -> Void ایک پیچیدہ closure دستخط کو پڑھنے کے قابل قسم میں تبدیل کرتا ہے۔

Swift.org (2025) کے مطابق، typealias معیاری لائبریری میں وسیع پیمانے پر استعمال ہوتا ہے۔ مثال کے طور پر، String String کے لیے ایک typealias ہے (ایک مخصوص Array<Character>)۔ Swift کے جدید ورژنز میں یہ نفاذ پوشیدہ ہے۔ Void خالی ٹیپل () کے لیے ایک typealias ہے، جو فنکشن دستخطوں کو مزید پڑھنے کے قابل بناتا ہے۔

کسی قسم کی معنویت کو دستاویز کرنے کے لیے typealias استعمال کریں، لیکن یاد رکھیں: یہ ایک ہی بنیادی قسم کے مختلف تصورات کے اختلاط سے حفاظت نہیں کرتا۔ قسم کے محفوظ علیحدگی کے لیے، ریپر (struct wrapper) استعمال کریں۔

نحو اور دائرہ کار

Typealias کلیدی لفظ typealias سے اعلان کیا جاتا ہے، جس کے بعد نیا نام، مساوی نشان، اور موجودہ قسم آتی ہے۔ بنیادی شکل:

swift
typealias Name = ExistingType
typealias UserID = Int
typealias JSONDictionary = [String: Any]

Typealias کا دائرہ کار اس جگہ سے متعین ہوتا ہے جہاں اس کا اعلان کیا گیا ہے:

سطحمثالنمائش
عالمیtypealias Name = Stringپورا ماڈیول (رسائی کنٹرول کے تابع)
قسم کے اندرstruct User { typealias ID = Int }User.ID — قسم کے ذریعے قابل رسائی
فنکشن کے اندرfunc f() { typealias Local = Int }صرف فنکشن کے اندر
پروٹوکول کے اندرprotocol P { associatedtype T }اپنانے پر متعین کیا جاتا ہے

قسم کے اندر Typealias (مثال کے طور پر، User.ID) متعلقہ عرفی ناموں کو گروپ کرنے کا ایک عام نمونہ ہے۔ یہ نام کی جگہ کو بہتر بناتا ہے: Order.ID اور User.ID دونوں Int ہیں، لیکن مختلف تصورات کے طور پر پڑھے جاتے ہیں۔ اندرونی typealias تک رسائی User.ID کے ذریعے یا ڈاٹ نوٹیشن کے ذریعے کی جاتی ہے اگر قسم معلوم ہو۔

Closure اقسام کے لیے Typealias

Typealias کے سب سے عام استعمال میں سے ایک closure دستخطوں کو آسان بنانا ہے۔ Swift میں closure اقسام، خاص طور پر Optional اور generic پیرامیٹرز کے ساتھ، بوجھل ہو سکتی ہیں۔ Typealias (Data?, Error?) -> Void کو ایک پڑھنے کے قابل FetchResultHandler میں تبدیل کرتا ہے:

swift
typealias FetchResultHandler = (Data?, Error?) -> Void

func fetchUser(id: Int, completion: FetchResultHandler) {
    // network request
    completion(data, nil)
}

Ray Wenderlich Style Guide کے مطابق، closure کے لیے typealias طریقہ کار کے دستخطوں کی پڑھنے کی اہلیت کو بہتر بناتا ہے، خاص طور پر تفویض پروٹوکولز اور کال بیک پیٹرن میں۔ تاہم، ضرورت سے زیادہ عرفی ناموں سے بچیں — اگر closure ایک جگہ استعمال ہوتا ہے، تو اسے ان لائن اعلان کیا جا سکتا ہے۔

Swift معیاری لائبریری اس طریقہ کار کو فعال طور پر استعمال کرتی ہے۔ مثال کے طور پر، DispatchQueue.WorkItem DispatchWorkItem کے لیے ایک typealias ہے، حالانکہ باہر سے یہ ایک علیحدہ قسم لگتا ہے۔ Closure کے لیے Typealias پڑھنے کی اہلیت کا ایک آلہ ہے — اس کا زیادہ استعمال نہ کریں: فی ماڈیول 3–5 closure عرفی نام ایک معقول حد ہے۔

Typealias اور Generic پیرامیٹرز

Typealias generic پیرامیٹرز شامل کر سکتا ہے، جو generic اقسام کے مخصوص ورژن بناتا ہے۔ یہ خاص طور پر Result، Publisher اور معیاری لائبریری اور Combine کے دیگر generic اقسام کے ساتھ کام کرتے وقت مفید ہے:

swift
typealias FetchResult = Result<Data, Error>
typealias AnyPublisherOfData = AnyPublisher<Data, Error>

func loadData() -> FetchResult {
    // data loading
}

آپ حسب ضرورت generic پیرامیٹرز کے ساتھ typealias بھی بنا سکتے ہیں جو اصل قسم پر منتقل ہوتے ہیں:

swift
typealias NetworkResult<T> = Result<T, NetworkError>

func fetchUser() -> NetworkResult<User> {
    // ...
}

ایک اہم قاعدہ: typealias نئی generic پابندیاں (where شقیں) شامل نہیں کر سکتا — یہ صرف پیرامیٹرز کو اصل قسم پر منتقل کرتا ہے۔ اگر اضافی پابندیوں کی ضرورت ہو، تو ایک generic struct یا class بنائیں۔ Swift by Sundell (2024) کے مطابق، generic کے ساتھ typealias ان منصوبوں میں بار بار آنے والے دستخطوں کو مختصر کرنے کا ایک مثالی طریقہ ہے جو Combine، Result اور async/await کا بھرپور استعمال کرتے ہیں۔

پروٹوکول میں Associatedtype

Associatedtype ایک پروٹوکول کے اندر اعلان کردہ typealias ہے جو ایک منسلک قسم کی تعریف کرتا ہے۔ عام typealias کے برعکس، associatedtype اعلان کے وقت کسی مخصوص قسم سے منسلک نہیں ہوتا — یہ پروٹوکول اپنانے والی ہر قسم کے ذریعے متعین کیا جاتا ہے:

swift
protocol Container {
    associatedtype Item
    var count: Int { get }
    mutating func append(_ item: Item)
}

struct IntBox: Container {
    typealias Item = Int
    // implementation
}

struct StringBox: Container {
    typealias Item = String
    // implementation
}

Associatedtype پروٹوکولز کو اعلان کے مقام پر ٹھوس قسم متعین کیے بغیر generic اقسام کی لچک دیتا ہے۔ یہ بہت سے Swift نمونوں کی بنیاد ہے: Collection (Element)، IteratorProtocol (Element)، Identifiable (ID)۔ مرتب‌کار نفاذ سے خود بخود associatedtype کا اندازہ لگا سکتا ہے، لہٰذا واضح typealias Item = Int اکثر چھوڑ دیا جاتا ہے — Swift طریقہ append کے پیرامیٹر سے Item کو Int کے طور پر اندازہ لگاتا ہے۔

Swift Evolution SE-0195 (2022) کے مطابق، associatedtype پر مشتمل پروٹوکولز کے ساتھ کام کرنے کے لیے غیر شفاف نتیجہ اقسام (some Container) متعارف کرائی گئیں — اس نے PAT (مرتبط اقسام والا پروٹوکول) مسئلہ حل کیا، جو ایسے پروٹوکولز کو متغیر قسم کے طور پر استعمال کرنے سے روکتا تھا۔

Typealias بمقابلہ قسم کا ریپر

بنیادی فرق: Typealias موجودہ قسم کا صرف دوسرا نام ہے، جبکہ ریپر ایک نئی قسم ہے، جو اصل سے معنوی طور پر الگ ہے۔ اگر آپ typealias UserID = Int کا اعلان کرتے ہیں، تو UserID اور Int قابل تبادلہ ہیں — ایک فنکشن جو Int کی توقع رکھتا ہے بغیر کسی غلطی کے UserID قبول کرے گا۔

ایک ریپر struct کے ذریعے بنایا جاتا ہے اور حقیقی قسم کی حفاظت فراہم کرتا ہے:

swift
struct UserID: RawRepresentable {
    let rawValue: Int
}

struct OrderID: RawRepresentable {
    let rawValue: Int
}

// Compilation error: cannot pass OrderID where UserID is expected

Point-Free (2025) کے مطابق، ریپر اس وقت ترجیح دیتے ہیں جب مختلف تصورات ایک ہی بنیادی قسم (UserID بمقابلہ OrderID) سے ظاہر کیے جائیں۔ Typealias اس وقت جائز ہے جب مقصد علیحدگی کے بغیر پڑھنے کی اہلیت ہو: لمبے ناموں کو مختصر کرنا، معنویت کو دستاویز کرنا، associatedtype کے ذریعے نفاذ کو تجریدی بنانا۔ پڑھنے کی سہولت کے لیے typealias منتخب کریں، قسم کی حفاظت کے لیے ریپر منتخب کریں۔

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

Typealias associatedtype سے کیسے مختلف ہے؟

Typealias ایک مخصوص موجودہ قسم کا عرفی نام ہے۔ Associatedtype ایک پروٹوکول کے اندر اعلان کیا جاتا ہے اور اسے پروٹوکول اپنانے والی ہر قسم متعین کرتی ہے — مختلف اقسام ایک ہی پروٹوکول کے لیے مختلف associatedtype استعمال کر سکتی ہیں۔

کیا typealias ایک نئی قسم بناتا ہے؟

نہیں، typealias صرف ایک متبادل نام ہے۔ مرتب‌کار مرتب وقت پر اسے اصل قسم سے بدل دیتا ہے۔ ایک نئی، معنوی طور پر الگ قسم بنانے کے لیے، struct ریپر یا rawValue کے ساتھ enum استعمال کریں۔

کیا typealias کو generic پیرامیٹرز کے ساتھ استعمال کیا جا سکتا ہے؟

ہاں، typealias میں generic پیرامیٹرز شامل ہو سکتے ہیں: typealias Result<T> = Swift.Result<T, Error>۔ Generic پیرامیٹرز اصل قسم پر منتقل ہوتے ہیں۔ Where پابندیاں شامل نہیں کی جا سکتیں — اس کے لیے ایک generic struct استعمال کریں۔

Typealias کہاں اعلان کیا جا سکتا ہے؟

کسی بھی سطح پر: عالمی (فائل میں)، قسم کے اندر (struct/class/enum)، فنکشن کے اندر، پروٹوکول کے اندر (associatedtype کے طور پر)۔ دائرہ کار اعلان کی جگہ سے متعین ہوتا ہے — عالمی typealias پورے ماڈیول میں نظر آتا ہے، مقامی صرف اپنے دائرہ کار میں۔

ریپر کے بجائے typealias کب استعمال کرنا چاہیے؟

لمبے ناموں کو مختصر کرنے اور معنویت کو دستاویز کرنے کے لیے typealias منتخب کریں جب اصل قسم کے ساتھ تبادلہ محفوظ ہو۔ ریپر (struct) منتخب کریں جب آپ کو ایک ہی بنیادی قسم (UserID بمقابلہ ProductID) کے مختلف تصورات کے حادثاتی اختلاط کو روکنے کی ضرورت ہو۔

خلاصہ

  • Typealias — نئی قسم بنائے بغیر موجودہ قسم کا عرفی نام؛ مرتب‌کار اسے اصل سے بدل دیتا ہے
  • نحو: typealias NewName = ExistingType، دائرہ کار — عالمی، قسم کے اندر، فنکشن کے اندر
  • Closure اقسام — typealias دستخط آسان بناتا ہے: typealias Handler = (Int) -> Void
  • Generic — typealias Result، Publisher اور دیگر generic اقسام کو مختصر کرنے کے لیے generic پیرامیٹرز شامل کر سکتا ہے
  • Associatedtype — پروٹوکول کے اندر typealias، ہر اپنانے والی قسم کے ذریعے متعین
  • ریپر سے فرق: typealias اقسام کو الگ نہیں کرتا — UserID اور Int قابل تبادلہ ہیں؛ ریپر (struct) حقیقی قسم کی حفاظت فراہم کرتا ہے
  • بہترین عمل: پڑھنے کی اہلیت کے لیے typealias استعمال کریں، معنوی مرتب غلطیوں کو روکنے کے لیے ریپر استعمال کریں

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

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

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

مزید پڑھیں