Extension di Swift adalah mekanisme yang memungkinkan penambahan fungsionalitas baru ke tipe yang ada tanpa mengubah kode sumbernya. Ekstensi mendukung metode, properti terhitung, inisialisator, subscript, tipe bersarang, dan implementasi protokol. Menurut Apple Documentation, 2026, ekstensi adalah alat penting untuk mengatur kode dan mematuhi Prinsip Open/Closed dalam proyek Swift.
Poin utama
Extension di Swift adalah konstruksi bahasa yang memungkinkan memperluas tipe yang ada (kelas, struktur, enum, protokol) dengan kemampuan baru. Ini adalah analog dari kategori di Objective-C, tetapi dengan kemampuan lebih banyak.
Extension dapat menambahkan:
Menurut dokumentasi Apple, extension tidak dapat mengganti metode yang ada (dynamic dispatch) dan tidak dapat menambahkan stored properties. Batasan ini menjaga integritas tipe asli.
Extension dideklarasikan dengan kata kunci extension dengan menyebutkan tipe yang diperluas.
extension Double {
var km: Double { return self * 1000.0 }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1000.0 }
}
let distance = 5.0.km
print("5 km = \(distance) meter") // 5000.0
Anda dapat memperluas tidak hanya tipe Anda sendiri, tetapi juga tipe pustaka standar Swift, Foundation, UIKit, dan framework lainnya. Ini menjadikan extension alat yang kuat untuk menambahkan fungsionalitas khusus domain.
Extension memungkinkan penambahan metode instance dan tipe ke tipe yang ada.
extension String {
func isValidEmail() -> Bool {
let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
return self.range(of: emailRegex, options: .regularExpression) != nil
}
static func random(length: Int) -> String {
let letters = "abcdefghijklmnopqrstuvwxyz0123456789"
return String((0..<length).map { _ in letters.randomElement()! })
}
}
let email = "user@example.com"
print(email.isValidEmail()) // true
let code = String.random(length: 8) // "a3f8k2m1"
Metode mutasi memperluas tipe nilai (struct, enum) dan dapat mengubah self. Untuk kelas, mutasi tidak diperlukan. Extension dapat menambahkan metode mutasi bahkan ke tipe pustaka standar.
Extension hanya dapat menambahkan properti terhitung — stored properties dilarang. Ini logis: extension tidak mengelola memori tipe asli.
extension Date {
var isPast: Bool {
return self < Date()
}
var isToday: Bool {
return Calendar.current.isDateInToday(self)
}
}
let someDate = Date().addingTimeInterval(3600)
print(someDate.isPast) // false (satu jam dari sekarang adalah masa depan)
Computed properties di extension tunduk pada aturan yang sama seperti di implementasi utama: properti { get } dan { get set } dapat dibuat. Swift tidak memberlakukan batasan pada jumlah extension untuk satu tipe. Anda dapat mendeklarasikan berapa pun extension untuk satu tipe di file yang berbeda — ini adalah praktik standar dalam proyek besar.
Extension adalah cara yang lebih disukai untuk mengimplementasikan protokol. Alih-alih mengacaukan deklarasi utama tipe, semua metode protokol ditempatkan di extension terpisah.
struct User {
let id: Int
let name: String
let email: String
}
// Extension per protokol — pemisahan bersih
extension User: Equatable {
static func == (lhs: User, rhs: User) -> Bool {
return lhs.id == rhs.id
}
}
extension User: Codable {
enum CodingKeys: String, CodingKey {
case id, name, email
}
}
Pendekatan ini memisahkan tanggung jawab: struktur utama hanya berisi stored properties, extensions — implementasi protokol. Swift bahkan mengizinkan implementasi protokol melalui extension untuk tipe yang tidak kita kendalikan.
Extension bukan hanya fasilitas bahasa, tetapi alat organisasi arsitektural. Penggunaan extensions yang benar membuat kode mudah dibaca dan dipelihara.
// MARK: - Equatable untuk navigasiprivate// MARK: - User + Displayable
extension User: Displayable {
var displayName: String {
return "\(name) (\(email))"
}
}
Menurut Swift API Design Guidelines, extensions meningkatkan keterbacaan: pengembang melihat struktur data di deklarasi utama dan logika — di extensions. Ini sesuai dengan prinsip pemisahan antarmuka (Interface Segregation).
Extension dengan batasan where menambahkan metode hanya untuk tipe tertentu: extension Array where Element: Equatable { func isUnique() -> Bool }. Kode seperti ini ringkas dan aman tipe — metode isUnique hanya muncul di array dengan elemen Equatable, menghilangkan kesalahan pada fase kompilasi dan membuat API lebih bersih, aman, dan mudah dipahami oleh pengembang lain.
Pertanyaan yang sering diajukan
Tidak, extension tidak dapat menambahkan stored properties. Batasan ini fundamental: extension tidak berpartisipasi dalam alokasi memori untuk instance tipe. Untuk stored properties, gunakan deklarasi utama tipe.
Tidak, extension tidak dapat mengganti metode. Upaya mendeklarasikan metode dengan tanda tangan yang sama dengan yang sudah ada akan menyebabkan kesalahan kompilasi. Untuk mengganti, gunakan pewarisan kelas.
Extension menambahkan fungsionalitas tanpa membuat tipe baru. Subclassing membuat hierarki dan mendukung penggantian. Extension tidak memerlukan akses ke kode sumber dan bekerja dengan semua tipe.
Ya, extension dapat menjadi generic jika tipe yang diperluas bersifat generic: extension Array where Element: Numeric. Metode generic dengan parameter tipenya sendiri juga dapat ditambahkan di dalam extension.
Extension tidak mempengaruhi kinerja — metode extension dikompilasi seperti metode biasa. Untuk protokol dengan extension, static dispatch digunakan, yang bisa lebih cepat daripada dynamic dispatch kelas.
Ringkasan
Kami 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