Typealias — Swift-də yeni tip təyin etmədən mövcud tip üçün alternativ ad yaradan bəyannamədir. Alias kompilyasiya mərhələsində orijinal tipə tam ekvivalentdir — kompilyator typealias istifadə olunan hər yerdə orijinal tipi əvəz edir. Swift Language Guide (2025) məlumatına görə, typealias uzun siqnaturaları qısaltmaq, daxili tipləri protokollarda associatedtype vasitəsilə abstraksiya etmək və mürəkkəb generic parametrləri sadələşdirmək üçün tətbiq olunur. Tip sarıcısından (wrapper) fərqli olaraq, typealias tip təhlükəsizliyi əlavə etmir — bu sadəcə tip sistemi tərəfindən fərqləndirilməyən aliasdır.
Əsas məqamlar
typealias NewName = ExistingType — istənilən səviyyədə bəyan edilə bilər (qlobal, lokal, tip daxilində)typealias Result = Swift.Result<Data, Error>typealias Handler = (Int) -> VoidTypealias — Swift-də mövcud tip üçün alternativ ad təqdim edən bəyannamədir. Typealias bəyan edildikdən sonra yeni addan orijinal tipin gözlənildiyi hər yerdə istifadə etmək olar — kompilyator onları eyni hesab edir. Typealias semantik izolyasiya əlavə etmir: UserID tipinin (String üçün typealias) dəyərini String gözləyən funksiyaya xətasız ötürmək olar.
Typealias-in əsas məqsədləri — uzun adları qısaltmaq, tipin təyinatını sənədləşdirmək və konkret tətbiqi abstraksiya etməkdir. Məsələn, typealias JSON = [String: Any] lüğətin JSON strukturu kimi istifadə edildiyini açıq şəkildə göstərir, typealias Completion = (Result<Data, Error>) -> Void isə mürəkkəb closure siqnaturasını oxunaqlı tipə çevirir.
Swift.org (2025) məlumatına görə, typealias standart kitabxanada geniş istifadə olunur. Məsələn, String — String üçün typealiasdır (ixtisaslaşdırılmış Array<Character>), baxmayaraq ki Swift-in müasir versiyalarında bu tətbiq gizlidir. Void — boş tuple üçün typealiasdır (), bu da funksiya siqnaturalarını daha oxunaqlı edir.
Tipin semantikasını sənədləşdirmək üçün typealias istifadə edin, amma unutmayın: bu, eyni əsas tipin müxtəlif konsepsiyalarının qarışmasından qorumur. Tip təhlükəsiz ayrılması üçün sarıcılardan (struct wrapper) istifadə edin.
Typealias açar sözü typealias ilə bəyan edilir, ondan sonra yeni ad, bərabər işarəsi və mövcud tip gəlir. Əsas forma:
typealias Name = ExistingType
typealias UserID = Int
typealias JSONDictionary = [String: Any]
Typealias-in görünmə sahəsi bəyan olunduğu yerlə müəyyən edilir:
| Səviyyə | Nümunə | Görünmə |
|---|---|---|
| Qlobal | typealias Name = String | Bütün modul (access control nəzərə alınmaqla) |
| Tip daxilində | struct User { typealias ID = Int } | User.ID — tip vasitəsilə giriş |
| Funksiya daxilində | func f() { typealias Local = Int } | Yalnız funksiya daxilində |
| Protokol daxilində | protocol P { associatedtype T } | Təsdiqləndikdə konkretləşir |
Tip daxilində typealias (məsələn, User.ID) — əlaqəli aliasları qruplaşdırmaq üçün geniş yayılmış nümunədir. Bu, ad məkanını yaxşılaşdırır: Order.ID və User.ID — hər ikisi Int, lakin fərqli konsepsiyalar kimi oxunur. İç-içə typealias-ə User.ID vasitəsilə və ya tip məlumdursa nöqtə ilə daxil olmaq olar.
Typealias-in ən çox yayılmış tətbiqlərindən biri — closure siqnaturalarını sadələşdirməkdir. Swift-də closure tipləri, xüsusilə Optional və generic parametrlərlə, ağır ola bilər. Typealias (Data?, Error?) -> Void ifadəsini oxunaqlı FetchResultHandler-ə çevirir:
typealias FetchResultHandler = (Data?, Error?) -> Void
func fetchUser(id: Int, completion: FetchResultHandler) {
// şəbək sorğusu
completion(data, nil)
}
Ray Wenderlich Style Guide-ə görə, closure üçün typealias metod siqnaturalarının oxunaqlılığını artırır, xüsusilə deleqasiya protokollarında və callback nümunələrində. Ancaq həddindən artıq aliaslardan çəkinin — closure bir yerdə istifadə olunursa, onu inline bəyan etmək olar.
Swift standart kitabxanası bu üsuldan fəal istifadə edir. Məsələn, DispatchQueue.WorkItem — DispatchWorkItem üçün typealiasdır, baxmayaraq ki kənardan ayrıca tip kimi görünür. Closure üçün typealias oxunaqlılıq alətidir, ondan sui-istifadə etməyin: modul başına 3–5 closure aliası — ağlabatan hədddir.
Typealias generic parametrləri ehtiva edə bilər, ümumiləşdirilmiş tiplərin ixtisaslaşdırılmış versiyalarını yaradır. Bu, xüsusilə standart kitabxana və Combine-dən Result, Publisher və digər generic tiplərlə işləyərkən faydalıdır:
typealias FetchResult = Result<Data, Error>
typealias AnyPublisherOfData = AnyPublisher<Data, Error>
func loadData() -> FetchResult {
// məlumat yüklənməsi
}
Orijinal tipə yönləndirilən öz generic parametrləri ilə də typealias yaratmaq olar:
typealias NetworkResult<T> = Result<T, NetworkError>
func fetchUser() -> NetworkResult<User> {
// ...
}
Vacib qayda: typealias yeni generic məhdudiyyətlər (where clauses) əlavə edə bilməz — o, sadəcə parametrləri orijinal tipə yönləndirir. Əlavə məhdudiyyətlər lazımdırsa, generic struktur və ya sinif yaradın. Swift by Sundell (2024) məlumatına görə, generic ilə typealias — Combine, Result və async/await-dən fəal istifadə edən layihələrdə təkrarlanan siqnaturaları qısaltmaq üçün ideal üsuldur.
Associatedtype — protokol daxilində bəyan edilmiş, assosiativ tipi təyin edən typealiasdır. Adi typealias-dan fərqli olaraq, associatedtype bəyannamə mərhələsində konkret tipə bağlı deyil — o, protokolu təsdiqləyən hər bir tip tərəfindən konkretləşdirilir:
protocol Container {
associatedtype Item
var count: Int { get }
mutating func append(_ item: Item)
}
struct IntBox: Container {
typealias Item = Int
// tətbiq
}
struct StringBox: Container {
typealias Item = String
// tətbiq
}
Associatedtype protokollara bəyannamə yerində konkret tip göstərmədən generic tiplərin çevikliyini verir. Bu, bir çox Swift nümunəsinin əsasını təşkil edir: Collection (Element), IteratorProtocol (Element), Identifiable (ID). Kompilyator associatedtype-i tətbiqdən avtomatik çıxara bilər, buna görə də açıq typealias Item = Int çox vaxt buraxılır — Swift Item-i append metodunun parametrindən Int kimi çıxarır.
Swift Evolution SE-0195 (2022) məlumatına görə, associatedtype ehtiva edən protokollarla işləmək üçün opaque result types (some Container) təqdim edildi — bu, dəyişən tipi kimi istifadə edilə bilməyən PAT (protocol with associated types) problemini həll etdi.
Əsas fərq: typealias — sadəcə mövcud tip üçün başqa addır, sarıcı (wrapper) isə — orijinaldan semantik cəhətdən təcrid olunmuş yeni tipdir. Əgər typealias UserID = Int bəyan etsəniz, UserID və Int bir-birini əvəz edə bilər — Int gözləyən funksiya UserID-ni xətasız qəbul edər.
Sarıcı struct vasitəsilə yaradılır və həqiqi tip təhlükəsizliyi verir:
struct UserID: RawRepresentable {
let rawValue: Int
}
struct OrderID: RawRepresentable {
let rawValue: Int
}
// Kompilyasiya xətası: UserID gözlənən yerdə OrderID ötürülə bilməz
Point-Free (2025) məlumatına görə, müxtəlif konsepsiyalar bir əsas tiplə təmsil olunduqda (UserID vs OrderID) sarıcılar üstünlük təşkil edir. Typealias, məqsəd təcrid olmadan oxunaqlılıq olduqda əsaslandırılır: uzun adı qısaltmaq, semantikanı sənədləşdirmək, associatedtype vasitəsilə tətbiqi abstraksiya etmək. Oxuma rahatlığı üçün typealias, tip təhlükəsizliyi üçün sarıcı seçin.
Tez-tez verilən suallar
Typealias — konkret mövcud tip üçün aliasdır. Associatedtype protokol daxilində bəyan edilir və protokolu təsdiqləyən hər bir tip tərəfindən konkretləşdirilir — müxtəlif tiplər eyni protokol üçün fərqli associatedtype istifadə edə bilər.
Xeyr, typealias — sadəcə alternativ addır. Kompilyator onu kompilyasiya mərhələsində orijinal tiplə əvəz edir. Yeni, semantik təcrid olunmuş tip yaratmaq üçün struct sarıcısı və ya rawValue ilə enum istifadə edin.
Bəli, typealias generic parametrləri ehtiva edə bilər: typealias Result<T> = Swift.Result<T, Error>. Generic parametrlər orijinal tipə yönləndirilir. Where-məhdudiyyətləri əlavə etmək olmaz — bunun üçün generic strukturundan istifadə edin.
İstənilən səviyyədə: qlobal (faylda), tip daxilində (struct/class/enum), funksiya daxilində, protokol daxilində (associatedtype kimi). Görünmə sahəsi bəyannamə yeri ilə müəyyən edilir — qlobal typealias bütün modulda görünür, lokal — yalnız öz əhatə dairəsində.
Typealias-i uzun adları qısaltmaq və semantikanı sənədləşdirmək üçün seçin, orijinal tiplə əvəzlənmə təhlükəsiz olduqda. Sarıcını (struct) — eyni əsas tipin müxtəlif konsepsiyalarının təsadüfən qarışmasının qarşısını almaq lazım olduqda: UserID vs ProductID.
Nəticə
typealias NewName = ExistingType, görünmə sahələri — qlobal, tip daxilində, funksiya daxilindətypealias Handler = (Int) -> VoidAçar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun