Protocol di Swift — adalah kontrak yang mendefinisikan serangkaian persyaratan yang harus dipenuhi oleh semua tipe yang mengadopsinya. Protokol mendasari pemrograman berorientasi protokol (POP) — paradigma yang direkomendasikan Apple untuk Swift di samping OOP klasik. Menurut Apple Documentation, 2026, struktur, kelas, dan enum dapat mengadopsi protokol, yang membuat arsitektur menjadi fleksibel dan dapat diuji.
Poin utama
Protocol — adalah antarmuka abstrak yang menentukan apa yang harus bisa dilakukan tipe, tetapi bukan bagaimana melakukannya. Di Swift, protokol setara dengan antarmuka di Java atau Go, tetapi dengan kemampuan tambahan.
Protokol dapat memerlukan:
{ get } atau { get set }Menurut WWDC 2015, Apple memperkenalkan Protocol-Oriented Programming sebagai pendekatan fundamental untuk arsitektur aplikasi Swift. Tidak seperti OOP, di mana pewarisan kelas menciptakan hierarki yang kaku, POP menawarkan komposisi protokol. Ini memberikan fleksibilitas: satu tipe dapat sesuai dengan beberapa protokol, menerima persyaratan dan implementasinya melalui extensions.
Protocol dideklarasikan dengan kata kunci protocol dengan nama dan body.
protocol Drawable {
func draw(context: CGContext)
var boundingBox: CGRect { get }
}
Tipe mengadopsi protokol melalui titik dua setelah nama:
struct Circle: Drawable {
let center: CGPoint
let radius: CGFloat
func draw(context: CGContext) {
context.addArc(center: center, radius: radius, ...)
}
var boundingBox: CGRect {
CGRect(x: center.x - radius, y: center.y - radius,
width: radius * 2, height: radius * 2)
}
}
Satu tipe dapat mengadopsi beberapa protokol dipisahkan koma: struct MyType: ProtocolA, ProtocolB. Kompiler memeriksa apakah semua persyaratan setiap protokol terpenuhi.
Property requirements ditentukan dengan kata kunci var dan penentu akses { get } atau { get set }.
protocol UserProtocol {
var name: String { get }
var age: Int { get set }
static var maxAge: Int { get }
mutating func updateName(_ newName: String)
}
Kata kunci mutating dalam protokol berarti metode dapat mengubah self. Struktur harus mengimplementasikan metode tersebut sebagai mutating, kelas dapat menghilangkannya. Method requirements ditentukan dengan tanda tangan lengkap termasuk label parameter.
Protocol dapat mewarisi protokol lain, menambahkan persyaratan baru. Ini menciptakan hierarki kontrak tanpa kaitan kaku dengan kelas.
protocol Vehicle {
var speed: Double { get set }
func move()
}
protocol Flyable: Vehicle {
var altitude: Double { get set }
func takeOff()
}
Tipe yang mengadopsi Flyable harus memenuhi persyaratan kedua protokol — baik Vehicle maupun Flyable. Swift mendukung pewarisan ganda protokol: protocol A: B, C.
Protocol Composition — mekanisme yang memungkinkan menentukan bahwa tipe harus sesuai dengan beberapa protokol secara bersamaan, tanpa membuat protokol kombinasi baru.
func render(_ item: Drawable & Animatable) {
item.draw(context: ...)
item.animate(duration: 0.3)
}
Composition (&) bekerja di parameter fungsi, variabel, dan batasan generik. Kompiler memeriksa apakah tipe yang diberikan secara bersamaan memenuhi semua protokol. Composition sering digunakan di SwiftUI: some View — adalah generik dengan composition.
Protocol Composition lebih diutamakan daripada membuat hierarki pewarisan: alih-alih protocol A: B, C dapat mengadopsi langsung B & C. Ini memberikan fleksibilitas dan mengurangi kopling. Composition sangat nyaman di parameter fungsi dan batasan generik, di mana perlu menggabungkan persyaratan sementara tanpa membuat protokol perantara. Ini mengurangi jumlah tipe pembantu dalam kode.
Protocol dapat digunakan sebagai tipe variabel, parameter fungsi, atau elemen koleksi. Ini disebut existential type.
var drawableItem: Drawable
let items: [Drawable] = [Circle(...), Rectangle(...)]
func process(drawables: [any Drawable]) {
for item in drawables {
item.draw(context: ...)
}
}
Kata kunci any (Swift 5.6+) secara eksplisit menunjukkan existential. Tanpa any kompiler memberikan peringatan. Swift juga mendukung some (opaque types) untuk menyembunyikan tipe konkret di balik protokol — ini adalah teknik standar di SwiftUI.
Saat bekerja dengan protocol, pengembang sering melakukan beberapa kesalahan berulang.
Drawable alih-alih <T: Drawable> di mana tipe konkret diperlukanAnyObject tanpa kebutuhan, yang mengecualikan struct dan enumPertanyaan yang sering diajukan
Protocol hanya mendefinisikan persyaratan tanpa implementasi (sampai protocol extensions). Abstract class dapat berisi implementasi dan status. Di Swift tidak ada kelas abstrak — perannya dijalankan oleh protokol dengan extensions.
Ya, struktur, kelas, dan enum — semuanya dapat mengadopsi protokol. Ini adalah dasar POP: Anda tidak wajib menggunakan kelas untuk mengatur arsitektur. Struktur dengan protokol memberikan semantik nilai dan imutabilitas.
Associated type (associatedtype) — placeholder untuk tipe yang ditentukan sendiri oleh tipe pengimplementasi. Contoh: Collection memiliki associatedtype Element. Ini adalah generik di tingkat protokol.
Ya, tambahkan pewarisan dari AnyObject: protocol MyProtocol: AnyObject. Maka hanya kelas yang dapat mengadopsi protokol ini. Ini berguna untuk referensi weak dan delegat.
Gunakan is untuk pemeriksaan dan as? untuk konversi: if let drawable = item as? Drawable. Ini hanya berfungsi untuk protokol tanpa associated types.
Ringkasan
&) menggabungkan protokol tanpa pewarisanany) dan opaque types (some) — dua cara bekerja dengan protokolKami 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