Typealias — Swift-da yangi turni aniqlamasdan mavjud tur uchun muqobil nom yaratadigan deklaratsiya. Alias kompilyatsiya bosqichida asl turga to'liq ekvivalentdir — kompilyator typealias ishlatilgan har bir joyda asl turni almashtiradi. Swift Language Guide (2025) ma'lumotlariga ko'ra, typealias uzun signaturalarni qisqartirish, protokollarda associatedtype orqali ichki turlarni abstraksiyalash va murakkab generic parametrlarni soddalashtirish uchun qo'llaniladi. Tur o'ramidan (wrapper) farqli o'laroq, typealias tur xavfsizligini qo'shmaydi — bu shunchaki tur tizimi tomonidan farqlanmaydigan aliasdir.
Asosiy ma'lumotlar
typealias NewName = ExistingType — har qanday darajada e'lon qilinishi mumkin (global, lokal, tur ichida)typealias Result = Swift.Result<Data, Error>typealias Handler = (Int) -> VoidTypealias — Swift-da mavjud tur uchun muqobil nom kiritadigan deklaratsiya. Typealias e'lon qilingandan so'ng, yangi nomdan asl tur kutilgan har qanday joyda foydalanish mumkin — kompilyator ularni bir xil deb hisoblaydi. Typealias semantik izolyatsiyani qo'shmaydi: UserID turining (String uchun typealias) qiymatini String kutayotgan funksiyaga xatosiz uzatish mumkin.
Typealiasning asosiy maqsadlari — uzun nomlarni qisqartirish, turning maqsadini hujjatlashtirish va aniq amalga oshirishni abstraksiyalash. Masalan, typealias JSON = [String: Any] lug'at JSON strukturasi sifatida ishlatilishini aniq ko'rsatadi, typealias Completion = (Result<Data, Error>) -> Void esa murakkab closure signaturasini o'qiladigan turga aylantiradi.
Swift.org (2025) ma'lumotlariga ko'ra, typealias standart kutubxonada keng qo'llaniladi. Masalan, String — String uchun typealias (ixtisoslashtirilgan Array<Character>), Swiftning zamonaviy versiyalarida bu amalga oshirish yashirin bo'lsa ham. Void — bo'sh tuple uchun typealias (), bu funksiya signaturalarini yanada o'qiladigan qiladi.
Turning semantikasini hujjatlashtirish uchun typealiasdan foydalaning, lekin esda tuting: bu bir xil asosiy turning turli tushunchalarini aralashtirishdan himoya qilmaydi. Tur xavfsiz ajratish uchun o'ramlardan (struct wrapper) foydalaning.
Typealias typealias kalit so'zi bilan e'lon qilinadi, undan keyin yangi nom, tenglik belgisi va mavjud tur keladi. Asosiy shakl:
typealias Name = ExistingType
typealias UserID = Int
typealias JSONDictionary = [String: Any]
Typealiasning ko'rinish sohasi e'lon qilingan joy bilan belgilanadi:
| Daraja | Misol | Ko'rinish |
|---|---|---|
| Global | typealias Name = String | Butun modul (access control hisobga olingan holda) |
| Tur ichida | struct User { typealias ID = Int } | User.ID — tur orqali kirish |
| Funksiya ichida | func f() { typealias Local = Int } | Faqat funksiya ichida |
| Protokol ichida | protocol P { associatedtype T } | Tasdiqlanganda aniqlanadi |
Tur ichidagi typealias (masalan, User.ID) — bog'liq aliaslarni guruhlash uchun keng tarqalgan naqsh. Bu nom maydonini yaxshilaydi: Order.ID va User.ID — ikkalasi ham Int, lekin turli tushunchalar sifatida o'qiladi. Ichki typealiasga User.ID orqali yoki tur ma'lum bo'lsa nuqta orqali kirish mumkin.
Typealiasning eng keng tarqalgan qo'llanilishlaridan biri — closure signaturalarini soddalashtirish. Swiftdagi closure turlari, ayniqsa Optional va generic parametrlar bilan, og'ir bo'lishi mumkin. Typealias (Data?, Error?) -> Void ni o'qiladigan FetchResultHandler ga aylantiradi:
typealias FetchResultHandler = (Data?, Error?) -> Void
func fetchUser(id: Int, completion: FetchResultHandler) {
// tarmoq so'rovi
completion(data, nil)
}
Ray Wenderlich Style Guide ga ko'ra, closure uchun typealias metod signaturalarining o'qilishini oshiradi, ayniqsa delegatsiya protokollari va callback naqshlarida. Biroq, ortiqcha aliaslardan saqlaning — closure bir joyda ishlatilsa, uni inline e'lon qilish mumkin.
Swift standart kutubxonasi bu usuldan faol foydalanadi. Masalan, DispatchQueue.WorkItem — DispatchWorkItem uchun typealias, tashqaridan alohida tur ko'rinishida bo'lsa ham. Closure uchun typealias — o'qish qulayligi vositasi, undan suiiste'mol qilmang: modul uchun 3–5 closure aliasi — oqilona chegara.
Typealias generic parametrlarni o'z ichiga olishi mumkin, umumlashtirilgan turlarning ixtisoslashtirilgan versiyalarini yaratadi. Bu, ayniqsa, standart kutubxona va Combine'dan Result, Publisher va boshqa generic turlar bilan ishlashda foydali:
typealias FetchResult = Result<Data, Error>
typealias AnyPublisherOfData = AnyPublisher<Data, Error>
func loadData() -> FetchResult {
// ma'lumotlarni yuklash
}
Asl turga yo'naltiriladigan o'z generic parametrlari bilan typealias yaratish ham mumkin:
typealias NetworkResult<T> = Result<T, NetworkError>
func fetchUser() -> NetworkResult<User> {
// ...
}
Muhim qoida: typealias yangi generic cheklovlar (where clauses) qo'sha olmaydi — u faqat parametrlarni asl turga yo'naltiradi. Qo'shimcha cheklovlar kerak bo'lsa, generic struktura yoki sinf yarating. Swift by Sundell (2024) ma'lumotlariga ko'ra, generic bilan typealias — Combine, Result va async/await dan faol foydalanadigan loyihalarda takrorlanuvchi signaturalarni qisqartirishning ideal usuli.
Associatedtype — protokol ichida e'lon qilingan, bog'liq turni belgilaydigan typealias. Oddiy typealiasdan farqli o'laroq, associatedtype e'lon qilish bosqichida aniq turga bog'liq emas — u protokolni tasdiqlaydigan har bir tur tomonidan konkretlashtiriladi:
protocol Container {
associatedtype Item
var count: Int { get }
mutating func append(_ item: Item)
}
struct IntBox: Container {
typealias Item = Int
// amalga oshirish
}
struct StringBox: Container {
typealias Item = String
// amalga oshirish
}
Associatedtype protokollarga e'lon qilish joyida aniq turni ko'rsatmasdan generic turlarning moslashuvchanligini beradi. Bu ko'plab Swift naqshlarining asosidir: Collection (Element), IteratorProtocol (Element), Identifiable (ID). Kompilyator associatedtype-ni amalga oshirishdan avtomatik chiqarishi mumkin, shuning uchun aniq typealias Item = Int ko'pincha tashlab ketiladi — Swift Item-ni append metodining parametridan Int sifatida chiqaradi.
Swift Evolution SE-0195 (2022) ma'lumotlariga ko'ra, associatedtype ni o'z ichiga olgan protokollar bilan ishlash uchun opaque result types (some Container) joriy etildi — bu o'zgaruvchi turi sifatida ishlatib bo'lmaydigan PAT (protocol with associated types) muammosini hal qildi.
Asosiy farq: typealias — mavjud tur uchun boshqa nom, o'ram (wrapper) esa — asl nusxadan semantik jihatdan ajratilgan yangi tur. Agar typealias UserID = Int e'lon qilsangiz, UserID va Int bir-birini almashtira oladi — Int kutayotgan funksiya UserID ni xatosiz qabul qiladi.
O'ram struct orqali yaratiladi va haqiqiy tur xavfsizligini beradi:
struct UserID: RawRepresentable {
let rawValue: Int
}
struct OrderID: RawRepresentable {
let rawValue: Int
}
// Kompilyatsiya xatosi: UserID kutilgan joyda OrderID uzatib bo'lmaydi
Point-Free (2025) ma'lumotlariga ko'ra, turli tushunchalar bir asosiy tur bilan ifodalanganda (UserID vs OrderID) o'ramlar afzalroqdir. Typealias maqsad izolyatsiyasiz o'qish qulayligi bo'lganda oqlanadi: uzun nomni qisqartirish, semantikani hujjatlashtirish, associatedtype orqali amalga oshirishni abstraksiyalash. O'qish qulayligi uchun typealias, tur xavfsizligi uchun o'ramni tanlang.
Tez-tez beriladigan savollar
Typealias — aniq mavjud tur uchun alias. Associatedtype protokol ichida e'lon qilinadi va protokolni tasdiqlaydigan har bir tur tomonidan konkretlashtiriladi — turli turlar bir xil protokol uchun turli associatedtype ishlatishi mumkin.
Yo'q, typealias — shunchaki muqobil nom. Kompilyator uni kompilyatsiya bosqichida asl tur bilan almashtiradi. Yangi, semantik ajratilgan tur yaratish uchun struct o'rami yoki rawValue bilan enum dan foydalaning.
Ha, typealias generic parametrlarni o'z ichiga olishi mumkin: typealias Result<T> = Swift.Result<T, Error>. Generic parametrlar asl turga yo'naltiriladi. Where-cheklovlari qo'shib bo'lmaydi — buning uchun generic strukturadan foydalaning.
Har qanday darajada: global (faylda), tur ichida (struct/class/enum), funksiya ichida, protokol ichida (associatedtype sifatida). Ko'rinish sohasi e'lon qilingan joy bilan belgilanadi — global typealias butun modulda ko'rinadi, lokal — faqat o'z doirasida.
Typealiasni uzun nomlarni qisqartirish va semantikani hujjatlashtirish uchun tanlang, asl tur bilan almashtirish xavfsiz bo'lganda. O'ramni (struct) — bir xil asosiy turning turli tushunchalarini tasodifiy aralashtirishning oldini olish kerak bo'lganda: UserID vs ProductID.
Xulosa
typealias NewName = ExistingType, ko'rinish sohalari — global, tur ichida, funksiya ichidatypealias Handler = (Int) -> VoidBiz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.