Extension di Swift: apa itu, sintaksis dan cara menambahkan metode

Penulis: IT Sectr Diterbitkan: 2026-06-18 Waktu membaca: 6 mnt

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 — penambahan fungsionalitas ke tipe yang ada tanpa mengubah aslinya
  • Computed properties — ditambahkan melalui extension, stored — tidak
  • Protocol conformance — implementasi protokol melalui extension untuk tipe apa pun
  • Organisasi kode — extensions mengelompokkan logika terkait berdasarkan protokol
  • Open/Closed — extensions mengimplementasikan prinsip keterbukaan untuk perluasan

Apa itu Extension di Swift?

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:

  • Properti terhitung instance dan tipe
  • Metode instance dan tipe
  • Inisialisator (convenience init)
  • Subscript
  • Tipe bersarang
  • Protocol conformances

Menurut dokumentasi Apple, extension tidak dapat mengganti metode yang ada (dynamic dispatch) dan tidak dapat menambahkan stored properties. Batasan ini menjaga integritas tipe asli.

Sintaksis ekstensi

Extension dideklarasikan dengan kata kunci extension dengan menyebutkan tipe yang diperluas.

swift
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.

Menambahkan metode melalui extension

Extension memungkinkan penambahan metode instance dan tipe ke tipe yang ada.

swift
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.

Computed Properties di extension

Extension hanya dapat menambahkan properti terhitung — stored properties dilarang. Ini logis: extension tidak mengelola memori tipe asli.

swift
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.

Implementasi protokol melalui extension

Extension adalah cara yang lebih disukai untuk mengimplementasikan protokol. Alih-alih mengacaukan deklarasi utama tipe, semua metode protokol ditempatkan di extension terpisah.

swift
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 dan organisasi kode

Extension bukan hanya fasilitas bahasa, tetapi alat organisasi arsitektural. Penggunaan extensions yang benar membuat kode mudah dibaca dan dipelihara.

  • Pengelompokan berdasarkan protokol — setiap protokol di extension terpisah
  • Marka (MARK)// MARK: - Equatable untuk navigasi
  • Pemisahan file — extensions untuk protokol berbeda di file terpisah
  • Private helpers — metode pribadi di extension ditandai dengan private
swift
// 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

Bisakah extension menambahkan stored properties?

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.

Bisakah metode yang ada diganti melalui extension?

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.

Apa perbedaan extension dengan subclassing?

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.

Bisakah extension menjadi generic?

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.

Bagaimana extension mempengaruhi kinerja?

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

  • Extension menambahkan computed properties, metode, protokol, dan subscript
  • Stored properties dilarang — extension tidak mengalokasikan memori
  • Protocol conformance melalui extension — standar organisasi kode di Swift
  • Open/Closed Principle — tipe terbuka untuk perluasan, tertutup untuk modifikasi
  • Generic extensions dengan where clauses memberikan perilaku khusus
  • Readability — extensions mengelompokkan logika berdasarkan protokol dan fungsi

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.

Diskusikan proyek

Baca juga