Typealias Swift में एक घोषणा है जो बिना नया प्रकार परिभाषित किए किसी मौजूदा प्रकार के लिए एक वैकल्पिक नाम बनाता है। उपनाम संकलन समय पर मूल प्रकार के पूरी तरह से समतुल्य होता है — कंपाइलर मूल प्रकार को हर जगह बदल देता है जहाँ typealias का उपयोग किया जाता है। Swift Language Guide (2025) के अनुसार, typealias का उपयोग लंबे हस्ताक्षरों को छोटा करने, प्रोटोकॉल में associatedtype के माध्यम से आंतरिक प्रकारों को अमूर्त करने और जटिल generic पैरामीटरों को सरल बनाने के लिए किया जाता है। टाइप रैपर के विपरीत, typealias टाइप सुरक्षा नहीं जोड़ता — यह केवल एक उपनाम है जिसे टाइप सिस्टम द्वारा अलग नहीं किया जाता है।
मुख्य बिंदु
typealias NewName = ExistingType — किसी भी स्तर पर घोषित किया जा सकता है (वैश्विक, स्थानीय, प्रकार के अंदर)typealias Result = Swift.Result<Data, Error>typealias Handler = (Int) -> VoidTypealias Swift में एक घोषणा है जो मौजूदा प्रकार के लिए एक वैकल्पिक नाम प्रस्तुत करता है। Typealias घोषित करने के बाद, नए नाम का उपयोग वहाँ किया जा सकता है जहाँ मूल प्रकार की अपेक्षा होती है — कंपाइलर उन्हें समान मानता है। Typealias शब्दार्थ पृथक्करण नहीं जोड़ता: UserID प्रकार (जो String के लिए typealias है) का मान बिना त्रुटि के String की अपेक्षा करने वाले फ़ंक्शन में पास किया जा सकता है।
Typealias के मुख्य उद्देश्य लंबे नामों को छोटा करना, प्रकार के उद्देश्य का दस्तावेज़ीकरण करना और ठोस कार्यान्वयन को अमूर्त करना है। उदाहरण के लिए, typealias JSON = [String: Any] स्पष्ट रूप से इंगित करता है कि एक शब्दकोश JSON संरचना के रूप में उपयोग किया जाता है, और typealias Completion = (Result<Data, Error>) -> Void एक जटिल क्लोज़र हस्ताक्षर को पढ़ने योग्य प्रकार में बदल देता है।
Swift.org (2025) के अनुसार, typealias का मानक पुस्तकालय में व्यापक रूप से उपयोग किया जाता है। उदाहरण के लिए, String, String के लिए एक typealias है (एक विशिष्ट Array<Character>), हालाँकि Swift के आधुनिक संस्करणों में यह कार्यान्वयन छिपा हुआ है। Void खाली टुपल () के लिए एक typealias है, जो फ़ंक्शन हस्ताक्षरों को अधिक पढ़ने योग्य बनाता है।
Typealias का उपयोग प्रकार के शब्दार्थ का दस्तावेज़ीकरण करने के लिए करें, लेकिन याद रखें: यह एक ही आधार प्रकार की विभिन्न अवधारणाओं को मिश्रित होने से नहीं बचाता है। टाइप-सुरक्षित पृथक्करण के लिए, रैपर (struct wrapper) का उपयोग करें।
Typealias कीवर्ड typealias के साथ घोषित किया जाता है, उसके बाद नया नाम, बराबर का चिह्न और मौजूदा प्रकार होता है। मूल रूप:
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 के माध्यम से या डॉट नोटेशन के माध्यम से की जाती है यदि प्रकार ज्ञात हो।
Typealias के सबसे सामान्य उपयोगों में से एक क्लोज़र हस्ताक्षरों को सरल बनाना है। Swift में क्लोज़र प्रकार बोझिल हो सकते हैं, विशेष रूप से Optional और generic पैरामीटरों के साथ। Typealias (Data?, Error?) -> Void को एक पढ़ने योग्य FetchResultHandler में बदल देता है:
typealias FetchResultHandler = (Data?, Error?) -> Void
func fetchUser(id: Int, completion: FetchResultHandler) {
// network request
completion(data, nil)
}
Ray Wenderlich Style Guide के अनुसार, क्लोज़र के लिए typealias विधि हस्ताक्षरों की पठनीयता में सुधार करता है, विशेष रूप से प्रतिनिधित्व प्रोटोकॉल और कॉलबैक पैटर्न में। हालांकि, अत्यधिक उपनामों से बचें — यदि क्लोज़र का उपयोग एक ही स्थान पर किया जाता है, तो इसे इनलाइन घोषित किया जा सकता है।
Swift मानक पुस्तकालय सक्रिय रूप से इस दृष्टिकोण का उपयोग करता है। उदाहरण के लिए, DispatchQueue.WorkItem, DispatchWorkItem के लिए एक typealias है, हालाँकि बाहर से यह एक अलग प्रकार जैसा दिखता है। क्लोज़र के लिए Typealias पठनीयता का एक उपकरण है — इसका अत्यधिक उपयोग न करें: प्रति मॉड्यूल 3–5 क्लोज़र उपनाम एक उचित सीमा है।
Typealias में generic पैरामीटर शामिल हो सकते हैं, जो सामान्य प्रकारों के विशिष्ट संस्करण बनाते हैं। यह Result, Publisher और मानक पुस्तकालय और Combine के अन्य सामान्य प्रकारों के साथ काम करते समय विशेष रूप से उपयोगी है:
typealias FetchResult = Result<Data, Error>
typealias AnyPublisherOfData = AnyPublisher<Data, Error>
func loadData() -> FetchResult {
// data loading
}
आप कस्टम generic पैरामीटरों के साथ typealias भी बना सकते हैं जो मूल प्रकार पर अग्रेषित होते हैं:
typealias NetworkResult<T> = Result<T, NetworkError>
func fetchUser() -> NetworkResult<User> {
// ...
}
एक महत्वपूर्ण नियम: typealias नए generic प्रतिबंध (where clauses) नहीं जोड़ सकता — यह केवल पैरामीटरों को मूल प्रकार पर अग्रेषित करता है। यदि अतिरिक्त प्रतिबंधों की आवश्यकता है, तो एक generic struct या class बनाएं। Swift by Sundell (2024) के अनुसार, generics के साथ typealias उन परियोजनाओं में दोहराए जाने वाले हस्ताक्षरों को छोटा करने का एक आदर्श तरीका है जो Combine, Result और async/await का गहनता से उपयोग करते हैं।
Associatedtype एक प्रोटोकॉल के अंदर घोषित typealias है जो एक संबद्ध प्रकार को परिभाषित करता है। सामान्य typealias के विपरीत, associatedtype घोषणा के समय किसी विशिष्ट प्रकार से बंधा नहीं होता — यह प्रोटोकॉल अपनाने वाले प्रत्येक प्रकार द्वारा निर्दिष्ट किया जाता है:
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 प्रोटोकॉल को घोषणा स्थल पर ठोस प्रकार निर्दिष्ट किए बिना सामान्य प्रकारों का लचीलापन देता है। यह कई 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 UserID = Int घोषित करते हैं, तो UserID और Int विनिमेय हैं — Int की अपेक्षा करने वाला फ़ंक्शन बिना त्रुटि के UserID स्वीकार करेगा।
रैपर struct के माध्यम से बनाया जाता है और वास्तविक टाइप सुरक्षा प्रदान करता है:
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 एक प्रोटोकॉल के अंदर घोषित किया जाता है और प्रोटोकॉल अपनाने वाले प्रत्येक प्रकार द्वारा निर्दिष्ट किया जाता है — विभिन्न प्रकार एक ही प्रोटोकॉल के लिए अलग-अलग associatedtype का उपयोग कर सकते हैं।
नहीं, typealias सिर्फ एक वैकल्पिक नाम है। कंपाइलर संकलन समय पर इसे मूल प्रकार से बदल देता है। एक नया, शब्दार्थ रूप से पृथक प्रकार बनाने के लिए, struct रैपर या rawValue के साथ enum का उपयोग करें।
हाँ, typealias में generic पैरामीटर शामिल हो सकते हैं: typealias Result<T> = Swift.Result<T, Error>. Generic पैरामीटर मूल प्रकार पर अग्रेषित होते हैं। Where-प्रतिबंध नहीं जोड़े जा सकते — इसके लिए एक generic struct का उपयोग करें।
किसी भी स्तर पर: वैश्विक (फ़ाइल में), प्रकार के अंदर (struct/class/enum), फ़ंक्शन के अंदर, प्रोटोकॉल के अंदर (associatedtype के रूप में)। दायरा घोषणा स्थान द्वारा निर्धारित होता है — वैश्विक typealias पूरे मॉड्यूल में दिखाई देता है, स्थानीय केवल अपने दायरे के भीतर।
लंबे नामों को छोटा करने और शब्दार्थ का दस्तावेज़ीकरण करने के लिए typealias चुनें जब मूल प्रकार के साथ विनिमेयता सुरक्षित हो। रैपर (struct) चुनें जब आपको एक ही आधार प्रकार की विभिन्न अवधारणाओं के आकस्मिक मिश्रण को रोकने की आवश्यकता हो: UserID बनाम ProductID।
सारांश
typealias NewName = ExistingType, दायरे — वैश्विक, प्रकार के अंदर, फ़ंक्शन के अंदरtypealias Handler = (Int) -> Voidहम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें