Protocol — apa itu, protokol dan delegasi di iOS

Penulis: IT Sectr Diterbitkan: 2026-02-18 Waktu membaca: 10 mnt

Protocol — adalah sekumpulan persyaratan (properti dan metode) yang harus dipenuhi oleh tipe yang mengimplementasikan protokol tersebut. Di Swift, protokol adalah elemen sentral dari Protocol-Oriented Programming (POP), memungkinkan polimorfisme tanpa pewarisan. Menurut data Swift.org (2025), protokol digunakan di 85% tipe pustaka standar Swift. Di Objective-C, @protocol memainkan peran serupa, namun dengan batasan — hanya untuk kelas.

Poin Utama

  • Protocol — kontrak yang mendefinisikan antarmuka yang harus diimplementasikan oleh struktur, kelas, atau enumerasi
  • Protocol-Oriented Programming — paradigma Swift di mana protokol dan ekstensi protokol menggantikan hierarki pewarisan yang dalam
  • Protocol extension — implementasi metode secara default, membuat metode protokol menjadi opsional tanpa @objc
  • Associated types — protokol umum dengan tipe terkait untuk bekerja secara type-safe dengan berbagai tipe data
  • Protocol composition — menggabungkan beberapa protokol melalui operator & untuk deskripsi persyaratan yang tepat

Apa itu protokol di Swift?

Protocol di Swift — adalah antarmuka abstrak yang mendefinisikan persyaratan yang harus dipenuhi oleh suatu tipe. Protokol dapat memerlukan properti (dengan getter/setter), metode (instance dan tipe), inisialisator, dan subscript. Tidak seperti kelas, protokol dapat diimplementasikan oleh struktur, enumerasi, dan kelas — ini memberikan fleksibilitas yang tidak tersedia dalam bahasa berbasis kelas murni.

Swift
protocol Drawable {
    var boundingRect: CGRect { get }
    mutating func draw(in context: CGContext)
}

struct Circle: Drawable {
    var center: CGPoint
    var radius: CGFloat
    
    var boundingRect: CGRect {
        CGRect(x: center.x - radius, y: center.y - radius,
               width: radius * 2, height: radius * 2)
    }
    
    func draw(in context: CGContext) {
        context.addEllipse(in: boundingRect)
    }
}

Struktur Circle mengimplementasikan protokol Drawable, menyediakan properti boundingRect dan metode draw(in:). Berkat protokol, figur apa pun yang mengimplementasikan Drawable dapat diproses secara seragam — ini adalah polimorfisme tanpa pewarisan dari kelas dasar bersama.

Protocol-Oriented Programming: paradigma Swift

Protocol-Oriented Programming (POP) — paradigma yang diajukan oleh Apple di WWDC 2015 sebagai alternatif untuk pewarisan kelas. Dalam POP, protokol adalah alat abstraksi utama, dan ekstensi protokol (protocol extensions) menyediakan implementasi default. Ini memecahkan masalah «pewarisan berlian» dan memungkinkan memperluas tipe yang ada tanpa memodifikasi kode sumber.

AspekPOP (Protocol-Oriented)OOP (Class-based)
Unit abstraksiProtocolKelas dasar
Penggunaan kembaliProtocol extensionPewarisan
Value typesDidukung (struct)Hanya reference types
Penerapan gandaProtocol compositionPewarisan ganda (tidak di Swift)
Risiko koplingRendah (kopling lemah)Tinggi (hierarki kaku)

Menurut blog Apple Swift (2025), struktur mencakup 70% tipe dalam aplikasi Swift modern. POP adalah alasan utama pergeseran ini: protokol memungkinkan struktur mendapatkan perilaku polimorfik tanpa beralih ke kelas.

Protocol vs abstract class vs interface

Protokol Swift menempati posisi antara interface Java dan kelas abstrak C++. Mereka dapat berisi implementasi (melalui extension), tetapi tidak memiliki status (properti tersimpan). Mari kita lihat perbedaannya dengan contoh tiga bahasa.

KarakteristikSwift ProtocolJava InterfaceC++ Abstract Class
Implementasi metodeYa (extension)Ya (default methods)Ya
Properti tersimpanTidakTidakYa
Value typesYaTidakTidak
Implementasi gandaYaYaYa
InisialisatorYa (persyaratan)TidakYa

Perbedaan utama: Swift Protocol dapat memerlukan inisialisator dan subscript, yang tidak tersedia di Java Interface. Namun protokol tidak dapat menyimpan status — ini tetap menjadi hak prerogatif tipe yang mengimplementasikan protokol.

Associated Types dan Generics dalam protokol

Associated Type (tipe terkait) — tipe umum di dalam protokol yang dikonkretkan oleh tipe yang mengimplementasikannya. Ini memungkinkan pembuatan protokol type-safe tanpa menentukan tipe data spesifik. Tipe terkait bekerja bersama dengan generics Swift.

Swift
protocol Container {
    associatedtype Item
    var count: Int { get }
    mutating func append(_ item: Item)
    subscript(i: Int) -> Item { get }
}

struct IntStack: Container {
    var items: [Int] = []
    var count: Int { items.count }
    typealias Item = Int
    
    mutating func append(_ item: Int) {
        items.append(item)
    }
    
    subscript(i: Int) -> Int {
        items[i]
    }
}

func sum<C: Container>(_ container: C) -> C.Item where C.Item: Numeric {
    // badan fungsi
}

Container — protokol dengan associatedtype Item. IntStack mengimplementasikannya, menentukan typealias Item = Int. Fungsi generik sum menggunakan batasan where untuk bekerja hanya dengan container numerik. Associated types membuat protokol menjadi umum tanpa kehilangan type-safety.

Protocol composition dan ekstensi protokol

Protocol composition — menggabungkan beberapa protokol melalui operator &. Tipe yang sesuai dengan komposisi harus mengimplementasikan semua protokol yang digabungkan. Ini menggantikan pewarisan ganda, yang tidak ada di Swift, dan memungkinkan spesifikasi persyaratan yang tepat untuk parameter fungsi.

Swift
protocol Named { var name: String { get } }
protocol Aged { var age: Int { get } }

struct Person: Named, Aged {
    let name: String
    let age: Int
}

func greet(_ entity: Named & Aged) {
    print("Halo, \(entity.name), usia \(entity.age)!")
}

// Protocol extension — implementasi default
extension Named {
    func introduce() {
        print("Nama saya \(name)")
    }
}

Protocol extension menyediakan implementasi metode secara default. Tipe yang mengimplementasikan protokol dapat menimpa metode extension — dalam hal ini implementasinya sendiri yang dipanggil. Ini adalah mekanisme yang digunakan Swift untuk mengimplementasikan metode opsional tanpa @objc.

@protocol di Objective-C: perbedaan dari Swift

@protocol di Objective-C — pendahulu Swift Protocol, namun dengan keterbatasan signifikan. Protokol Objective-C hanya tersedia untuk kelas (bukan untuk struktur atau enumerasi) dan menggunakan pengiriman dinamis melalui message passing. Metode dapat berupa @required (default) atau @optional.

Objective-C
@protocol Loggable
@required
- (void)logMessage: (NSString *)message;
@optional
- (NSString *)logPrefix;
@end

@interface ConsoleLogger : NSObject 
@end

@implementation ConsoleLogger
- (void)logMessage: (NSString *)message {
    NSLog(@"[LOG] %@", message);
}
@end

Tidak seperti Swift, protokol Objective-C tidak mendukung associated types, generics, protocol extensions, dan value types. Mereka tetap menjadi mekanisme abstraksi kelas, sementara Swift Protocol adalah alat polimorfisme lengkap untuk semua tipe.

Pertanyaan Umum

Apa perbedaan protokol dengan kelas abstrak?

Protocol tidak dapat menyimpan status (properti tersimpan) — hanya persyaratan untuk properti. Abstract class dapat berisi bidang dengan data. Protocol dapat diimplementasikan oleh struktur dan enumerasi, abstract class — hanya oleh kelas. Di Swift, protokol adalah alat abstraksi utama, kelas lebih jarang digunakan.

Apa itu Protocol-Oriented Programming?

POP — paradigma di mana protokol dan ekstensi protokol menggantikan hierarki pewarisan yang dalam. Alih-alih kelas dasar yang diwarisi oleh semua subkelas, POP menggunakan komposisi protokol dengan implementasi default melalui extension. Ini mengurangi kopling dan meningkatkan penggunaan kembali kode.

Bisakah protokol mewarisi protokol lain?

Ya, protokol Swift mendukung pewarisan. protocol SerializableDrawable: Drawable, Codable — protokol yang menggabungkan persyaratan Drawable dan Codable. Tipe yang mengimplementasikan SerializableDrawable harus memenuhi persyaratan semua protokol dalam hierarki. Ini berbeda dari class inheritance — protokol tidak memiliki leluhur bersama.

Apa itu any dan some dalam konteks protokol?

some (opaque type) menjamin bahwa fungsi mengembalikan satu tipe konkret yang sesuai dengan protokol. any (existential type) memungkinkan menyimpan tipe apa pun yang sesuai dengan protokol. some digunakan untuk mempertahankan identitas tipe, any — untuk koleksi heterogen. some muncul di Swift 5.1, any — di Swift 5.7.

Bagaimana cara memeriksa kesesuaian protokol di Swift?

Gunakan is untuk pemeriksaan dan as? untuk konversi: if let drawable = object as? Drawable { drawable.draw(in: ctx) }. Di Objective-C digunakan conformsToProtocol:. Swift juga mendukung pemeriksaan is untuk protokol tanpa associated types.

Kesimpulan

  • Protocol — kontrak yang mendefinisikan persyaratan untuk properti, metode, inisialisator, dan subscript bagi tipe yang mengimplementasikan
  • Protocol-Oriented Programming menggantikan pewarisan kelas dengan komposisi protokol dengan ekstensi
  • Protocol extension menyediakan implementasi default, membuat metode opsional tanpa @objc
  • Associated types memungkinkan pembuatan protokol umum dengan konkretisasi tipe di sisi implementasi
  • Protocol composition melalui & menggabungkan persyaratan beberapa protokol
  • Objective-C @protocol terbatas pada kelas dan tidak mendukung associated types, generics, dan value types
  • Rekomendasi: gunakan protokol sebagai alat abstraksi utama di Swift, terapkan kelas hanya ketika reference semantics diperlukan

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