Typealias — deklarasi di Swift yang membuat nama alternatif untuk tipe yang ada tanpa mendefinisikan yang baru. Alias sepenuhnya setara dengan tipe asli pada fase kompilasi — kompiler mengganti tipe asli di mana pun typealias digunakan. Menurut Swift Language Guide (2025), typealias digunakan untuk memperpendek tanda tangan panjang, mengabstraksi tipe internal melalui associatedtype dalam protokol dan menyederhanakan parameter generik yang kompleks. Berbeda dengan pembungkus tipe (wrapper), typealias tidak menambah keamanan tipe — ini hanya alias yang tidak dibedakan oleh sistem tipe.
Poin utama
typealias NewName = ExistingType — dapat dideklarasikan di tingkat mana pun (global, lokal, di dalam tipe)typealias Result = Swift.Result<Data, Error>typealias Handler = (Int) -> VoidTypealias — adalah deklarasi di Swift yang memperkenalkan nama alternatif untuk tipe yang ada. Setelah typealias dideklarasikan, nama baru dapat digunakan di mana pun tipe asli diharapkan — kompiler memperlakukannya sebagai identik. Typealias tidak menambah isolasi semantik: nilai tipe UserID (typealias untuk String) dapat diteruskan ke fungsi yang mengharapkan String tanpa kesalahan.
Tujuan utama typealias — memperpendek nama panjang, mendokumentasikan tujuan tipe dan mengabstraksi implementasi konkret. Misalnya typealias JSON = [String: Any] secara eksplisit menunjukkan bahwa kamus digunakan sebagai struktur JSON, dan typealias Completion = (Result<Data, Error>) -> Void mengubah tanda tangan closure yang kompleks menjadi tipe yang mudah dibaca.
Menurut Swift.org (2025), typealias banyak digunakan di perpustakaan standar. Misalnya String — adalah typealias untuk String (Array<Character> khusus), meskipun dalam versi Swift modern implementasi ini disembunyikan. Void — typealias untuk tuple kosong (), yang membuat tanda tangan fungsi lebih terbaca.
Gunakan typealias untuk mendokumentasikan semantik tipe, tetapi ingat: ini tidak melindungi dari pencampuran konsep yang berbeda dari tipe dasar yang sama. Untuk pemisahan tipe yang aman, gunakan pembungkus (struct wrapper).
Typealias dideklarasikan dengan kata kunci typealias, diikuti oleh nama baru, tanda sama dengan dan tipe yang ada. Bentuk dasar:
typealias Name = ExistingType
typealias UserID = Int
typealias JSONDictionary = [String: Any]
Ruang lingkup visibilitas typealias ditentukan oleh tempat deklarasi:
| Tingkat | Contoh | Visibilitas |
|---|---|---|
| Global | typealias Name = String | Seluruh modul (dengan mempertimbangkan access control) |
| Di dalam tipe | struct User { typealias ID = Int } | User.ID — akses melalui tipe |
| Di dalam fungsi | func f() { typealias Local = Int } | Hanya di dalam fungsi |
| Di dalam protokol | protocol P { associatedtype T } | Ditentukan saat konfirmasi |
Typealias di dalam tipe (misalnya User.ID) — pola umum untuk mengelompokkan alias terkait. Ini meningkatkan ruang nama: Order.ID dan User.ID — keduanya Int, tetapi dibaca sebagai konsep yang berbeda. Akses ke typealias bersarang dilakukan melalui User.ID atau melalui titik jika tipenya diketahui.
Salah satu penggunaan typealias yang paling umum — menyederhanakan tanda tangan closure. Tipe closure di Swift bisa rumit, terutama dengan Optional dan parameter generik. Typealias mengubah (Data?, Error?) -> Void menjadi FetchResultHandler yang mudah dibaca:
typealias FetchResultHandler = (Data?, Error?) -> Void
func fetchUser(id: Int, completion: FetchResultHandler) {
// permintaan jaringan
completion(data, nil)
}
Menurut Ray Wenderlich Style Guide, typealias untuk closure meningkatkan keterbacaan tanda tangan metode, terutama dalam protokol delegasi dan pola callback. Namun hindari jumlah alias yang berlebihan — jika closure digunakan di satu tempat, dapat dideklarasikan secara inline.
Perpustakaan standar Swift secara aktif menggunakan teknik ini. Misalnya DispatchQueue.WorkItem — adalah typealias untuk DispatchWorkItem, meskipun dari luar terlihat seperti tipe terpisah. Typealias untuk closure adalah alat keterbacaan, jangan menyalahgunakannya: 3–5 alias closure per modul — batas yang wajar.
Typealias dapat menyertakan parameter generik, menciptakan versi khusus dari tipe yang digeneralisasi. Ini sangat berguna saat bekerja dengan Result, Publisher dan tipe generik lainnya dari perpustakaan standar dan Combine:
typealias FetchResult = Result<Data, Error>
typealias AnyPublisherOfData = AnyPublisher<Data, Error>
func loadData() -> FetchResult {
// memuat data
}
Juga dapat membuat typealias dengan parameter generik sendiri yang diarahkan ke tipe asli:
typealias NetworkResult<T> = Result<T, NetworkError>
func fetchUser() -> NetworkResult<User> {
// ...
}
Aturan penting: typealias tidak dapat menambahkan batasan generik baru (where clauses) — hanya mengarahkan parameter ke tipe asli. Jika batasan tambahan diperlukan, buat struktur generik atau kelas. Menurut Swift by Sundell (2024), typealias dengan generic — cara ideal untuk memperpendek tanda tangan berulang dalam proyek yang secara aktif menggunakan Combine, Result dan async/await.
Associatedtype — adalah typealias yang dideklarasikan di dalam protokol, yang mendefinisikan tipe terkait. Berbeda dengan typealias biasa, associatedtype tidak terikat pada tipe tertentu pada fase deklarasi — ia dikonkretkan oleh setiap tipe yang mengonfirmasi protokol:
protocol Container {
associatedtype Item
var count: Int { get }
mutating func append(_ item: Item)
}
struct IntBox: Container {
typealias Item = Int
// implementasi
}
struct StringBox: Container {
typealias Item = String
// implementasi
}
Associatedtype memberikan protokol fleksibilitas tipe generik tanpa menentukan tipe konkret di tempat deklarasi. Ini adalah dasar dari banyak pola Swift: Collection (Element), IteratorProtocol (Element), Identifiable (ID). Kompiler dapat menyimpulkan associatedtype secara otomatis dari implementasi, oleh karena itu typealias Item = Int eksplisit sering dihilangkan — Swift menyimpulkan Item sebagai Int dari parameter metode append.
Menurut Swift Evolution SE-0195 (2022), opaque result types (some Container) diperkenalkan untuk bekerja dengan protokol yang mengandung associatedtype — ini memecahkan masalah PAT (protocol with associated types), yang tidak dapat digunakan sebagai tipe variabel.
Perbedaan utama: typealias — hanya nama lain untuk tipe yang ada, dan pembungkus (wrapper) — tipe baru, secara semantik terisolasi dari aslinya. Jika Anda mendeklarasikan typealias UserID = Int, maka UserID dan Int dapat dipertukarkan — fungsi yang mengharapkan Int akan menerima UserID tanpa kesalahan.
Pembungkus dibuat melalui struct dan memberikan keamanan tipe yang nyata:
struct UserID: RawRepresentable {
let rawValue: Int
}
struct OrderID: RawRepresentable {
let rawValue: Int
}
// Kesalahan kompilasi: tidak dapat meneruskan OrderID di mana UserID diharapkan
Menurut Point-Free (2025), pembungkus lebih disukai ketika konsep yang berbeda diwakili oleh satu tipe dasar (UserID vs OrderID). Typealias dibenarkan ketika tujuannya adalah keterbacaan tanpa isolasi: memperpendek nama panjang, mendokumentasikan semantik, mengabstraksi implementasi melalui associatedtype. Pilih typealias untuk kenyamanan membaca, pembungkus — untuk keamanan tipe.
Pertanyaan yang sering diajukan
Typealias — alias untuk tipe yang ada secara spesifik. Associatedtype dideklarasikan di dalam protokol dan dikonkretkan oleh setiap tipe yang mengonfirmasi protokol — tipe yang berbeda dapat menggunakan associatedtype yang berbeda untuk protokol yang sama.
Tidak, typealias — hanya nama alternatif. Kompiler menggantinya dengan tipe asli pada fase kompilasi. Untuk membuat tipe baru yang terisolasi secara semantik, gunakan pembungkus struct atau enum dengan rawValue.
Ya, typealias dapat menyertakan parameter generik: typealias Result<T> = Swift.Result<T, Error>. Parameter generik diarahkan ke tipe asli. Batasan where tidak dapat ditambahkan — untuk ini gunakan struktur generik.
Di tingkat mana pun: global (dalam file), di dalam tipe (struct/class/enum), di dalam fungsi, di dalam protokol (sebagai associatedtype). Ruang lingkup visibilitas ditentukan oleh tempat deklarasi — typealias global terlihat di seluruh modul, lokal — hanya dalam ruang lingkupnya sendiri.
Pilih typealias untuk memperpendek nama panjang dan mendokumentasikan semantik, ketika pertukaran dengan tipe asli aman. Pembungkus (struct) — ketika perlu mencegah pencampuran tidak sengaja konsep yang berbeda dari tipe dasar yang sama: UserID vs ProductID.
Ringkasan
typealias NewName = ExistingType, ruang lingkup visibilitas — global, di dalam tipe, di dalam fungsitypealias Handler = (Int) -> VoidKami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga