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 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.
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 (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.
| Aspek | POP (Protocol-Oriented) | OOP (Class-based) |
|---|---|---|
| Unit abstraksi | Protocol | Kelas dasar |
| Penggunaan kembali | Protocol extension | Pewarisan |
| Value types | Didukung (struct) | Hanya reference types |
| Penerapan ganda | Protocol composition | Pewarisan ganda (tidak di Swift) |
| Risiko kopling | Rendah (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.
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.
| Karakteristik | Swift Protocol | Java Interface | C++ Abstract Class |
|---|---|---|---|
| Implementasi metode | Ya (extension) | Ya (default methods) | Ya |
| Properti tersimpan | Tidak | Tidak | Ya |
| Value types | Ya | Tidak | Tidak |
| Implementasi ganda | Ya | Ya | Ya |
| Inisialisator | Ya (persyaratan) | Tidak | Ya |
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 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.
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 — 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.
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 — 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.
@protocol Loggable
@required
- (void)logMessage: (NSString *)message;
@optional
- (NSString *)logPrefix;
@end
@interface ConsoleLogger : NSObject
@end
@implementation ConsoleLogger
- (void)logMessage: (NSString *)message {
NSLog(@"[LOG] %@", message);
}
@endTidak 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
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.
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.
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.
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.
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
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