Typealias হল Swift-এর একটি ঘোষণা যা নতুন টাইপ সংজ্ঞায়িত না করেই বিদ্যমান টাইপের জন্য একটি বিকল্প নাম তৈরি করে। উপনামটি কম্পাইল সময়ে মূল টাইপের সাথে সম্পূর্ণ সমতুল্য — কম্পাইলার typealias যেখানেই ব্যবহার করা হয় সেখানে মূল টাইপ প্রতিস্থাপন করে। Swift Language Guide (2025) অনুসারে, typealias দীর্ঘ স্বাক্ষর সংক্ষিপ্ত করতে, প্রোটোকলে associatedtype-এর মাধ্যমে অভ্যন্তরীণ টাইপগুলিকে বিমূর্ত করতে এবং জটিল জেনেরিক প্যারামিটার সরলীকরণ করতে ব্যবহৃত হয়। টাইপ র্যাপারের বিপরীতে, 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 এবং জেনেরিক প্যারামিটারের সাথে। 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 জেনেরিক প্যারামিটার অন্তর্ভুক্ত করতে পারে, জেনেরিক টাইপের বিশেষায়িত সংস্করণ তৈরি করে। এটি স্ট্যান্ডার্ড লাইব্রেরি এবং Combine-এর Result, Publisher এবং অন্যান্য জেনেরিক টাইপের সাথে কাজ করার সময় বিশেষভাবে কার্যকর:
typealias FetchResult = Result<Data, Error>
typealias AnyPublisherOfData = AnyPublisher<Data, Error>
func loadData() -> FetchResult {
// data loading
}
আপনি কাস্টম জেনেরিক প্যারামিটার সহ typealias তৈরি করতে পারেন যা মূল টাইপে ফরোয়ার্ড করা হয়:
typealias NetworkResult<T> = Result<T, NetworkError>
func fetchUser() -> NetworkResult<User> {
// ...
}
একটি গুরুত্বপূর্ণ নিয়ম: typealias নতুন জেনেরিক সীমাবদ্ধতা (where clauses) যোগ করতে পারে না — এটি কেবল প্যারামিটারগুলিকে মূল টাইপে ফরোয়ার্ড করে। যদি অতিরিক্ত সীমাবদ্ধতার প্রয়োজন হয়, একটি জেনেরিক struct বা class তৈরি করুন। Swift by Sundell (2024) অনুসারে, জেনেরিক্স সহ 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 জেনেরিক প্যারামিটার অন্তর্ভুক্ত করতে পারে: typealias Result<T> = Swift.Result<T, Error>। জেনেরিক প্যারামিটার মূল টাইপে ফরোয়ার্ড করা হয়। Where-সীমাবদ্ধতা যোগ করা যায় না — এর জন্য একটি জেনেরিক struct ব্যবহার করুন।
যেকোনো স্তরে: বৈশ্বিক (ফাইলে), টাইপের ভিতরে (struct/class/enum), ফাংশনের ভিতরে, প্রোটোকলের ভিতরে (associatedtype হিসেবে)। পরিধি ঘোষণার অবস্থান দ্বারা নির্ধারিত হয় — বৈশ্বিক typealias সম্পূর্ণ মডিউলে দৃশ্যমান, স্থানীয়গুলি কেবল তাদের পরিধির মধ্যে।
দীর্ঘ নাম সংক্ষিপ্ত করতে এবং শব্দার্থ ডকুমেন্ট করতে typealias চয়ন করুন যখন মূল টাইপের সাথে বিনিময়যোগ্যতা নিরাপদ। র্যাপার (struct) চয়ন করুন যখন আপনাকে একই বেস টাইপের বিভিন্ন ধারণার আকস্মিক মিশ্রণ প্রতিরোধ করতে হবে: UserID বনাম ProductID।
সারসংক্ষেপ
typealias NewName = ExistingType, পরিধি — বৈশ্বিক, টাইপের ভিতরে, ফাংশনের ভিতরেtypealias Handler = (Int) -> Voidআমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন