Protocol di Swift — apa itu, sintaks, dan kemampuan

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

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 — kontrak dengan persyaratan untuk struktur, kelas, dan enum
  • Requirements mencakup metode, properti, inisialisator, dan subskrip
  • Protocol Composition memungkinkan menggabungkan beberapa protokol
  • POP — pemrograman berorientasi protokol, alternatif pewarisan
  • Protocol Extensions menambahkan implementasi default untuk metode

Apa itu Protocol di Swift?

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:

  • Metode instance dan tipe (statis)
  • Properti dengan penentu { get } atau { get set }
  • Inisialisator
  • Subskrip
  • Associated types (generik di tingkat protokol)

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.

Sintaks deklarasi protokol

Protocol dideklarasikan dengan kata kunci protocol dengan nama dan body.

swift
protocol Drawable {
    func draw(context: CGContext)
    var boundingBox: CGRect { get }
}

Tipe mengadopsi protokol melalui titik dua setelah nama:

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

Persyaratan metode dan properti

Property requirements ditentukan dengan kata kunci var dan penentu akses { get } atau { get set }.

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

Pewarisan protokol

Protocol dapat mewarisi protokol lain, menambahkan persyaratan baru. Ini menciptakan hierarki kontrak tanpa kaitan kaku dengan kelas.

swift
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

Protocol Composition — mekanisme yang memungkinkan menentukan bahwa tipe harus sesuai dengan beberapa protokol secara bersamaan, tanpa membuat protokol kombinasi baru.

swift
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 sebagai tipe

Protocol dapat digunakan sebagai tipe variabel, parameter fungsi, atau elemen koleksi. Ini disebut existential type.

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

Kesalahan umum dengan protokol

Saat bekerja dengan protocol, pengembang sering melakukan beberapa kesalahan berulang.

  • Mutating terlupa — metode dalam protokol ditandai sebagai mutating, tetapi struktur mengimplementasikannya tanpa kata kunci
  • Protocol as type bukan generic — penggunaan Drawable alih-alih <T: Drawable> di mana tipe konkret diperlukan
  • Circular protocol reference — protokol yang merujuk pada dirinya sendiri melalui associated type, tanpa resolusi yang benar
  • Class-only protocol — penggunaan AnyObject tanpa kebutuhan, yang mengecualikan struct dan enum

Pertanyaan yang sering diajukan

Apa perbedaan protocol dengan abstract class?

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.

Bisakah struct mengadopsi protocol?

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.

Apa itu associated type dalam protokol?

Associated type (associatedtype) — placeholder untuk tipe yang ditentukan sendiri oleh tipe pengimplementasi. Contoh: Collection memiliki associatedtype Element. Ini adalah generik di tingkat protokol.

Bisakah protokol dibatasi hanya untuk kelas?

Ya, tambahkan pewarisan dari AnyObject: protocol MyProtocol: AnyObject. Maka hanya kelas yang dapat mengadopsi protokol ini. Ini berguna untuk referensi weak dan delegat.

Bagaimana cara memeriksa kepatuhan protokol saat runtime?

Gunakan is untuk pemeriksaan dan as? untuk konversi: if let drawable = item as? Drawable. Ini hanya berfungsi untuk protokol tanpa associated types.

Ringkasan

  • Protocol — kontrak untuk metode, properti, inisialisator, dan subskrip
  • Class, struct, enum — semua tipe dapat mengadopsi protokol
  • Pewarisan protokol menciptakan hierarki kontrak tanpa kopling kaku
  • Protocol Composition (&) menggabungkan protokol tanpa pewarisan
  • Existential types (any) dan opaque types (some) — dua cara bekerja dengan protokol
  • POP direkomendasikan Apple sebagai alternatif pewarisan kelas klasik
  • Protocol Extensions memungkinkan menambahkan implementasi default

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