0Pricing
Swift Academy · Pelajaran

Kesesuaian Kondisional

Buat tipe generik sesuai protocol hanya jika batasannya terpenuhi.

Kesesuaian Kondisional adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.

Apa Itu Konformansi Bersyarat

Konformansi bersyarat membuat tipe generik mematuhi protokol hanya ketika parameter tipenya memenuhi batasan tertentu. Contoh klasiknya: Array bersifat Equatable hanya jika Element-nya juga bersifat Equatable.

extension Array where Element: Equatable {
    func allEqual(to x: Element) -> Bool {
        allSatisfy { $0 == x }
    }
}

Contoh Bawaan

Pustaka standar sudah menggunakan ini: [Int] bersifat Equatable karena Int juga bersifat demikian. Dua larik dibandingkan berdasarkan kesamaan setiap elemennya.

let a = [1, 2, 3]
let b = [1, 2, 3]
print(a == b)

Mendeklarasikan Konformansi Bersyarat

Tuliskan ekstensi yang menambahkan kesesuaian dengan protokol menggunakan klausa where. Di sini, pembungkus mematuhi Equatable hanya ketika tipe nilainya juga mematuhinya.

struct Pair<T> {
    let first: T
    let second: T
}

extension Pair: Equatable where T: Equatable {
    static func == (l: Pair, r: Pair) -> Bool {
        l.first == r.first && l.second == r.second
    }
}

print(Pair(first: 1, second: 2) == Pair(first: 1, second: 2))

Mengapa Batasan Itu Penting

Tanpa batasan tersebut, kompiler tidak dapat membuat == secara otomatis, karena membandingkan nilai yang dibungkus mengharuskan nilai itu sendiri dapat dibandingkan. Klausa where memberikan jaminan yang tepat tersebut.

struct Box<T> { let value: T }
extension Box: Equatable where T: Equatable {}

print(Box(value: "hi") == Box(value: "hi"))
print(Box(value: 5) == Box(value: 9))

Pengodean Data Bersyarat

Anda dapat membuat konformansi terhadap Codable secara bersyarat. Kontainer hanya dapat dikodekan jika elemennya juga dapat dikodekan.

struct Wrapper<T> { let payload: T }
extension Wrapper: Codable where T: Codable {}

let w = Wrapper(payload: 42)
let data = try! JSONEncoder().encode(w)
print(String(data: data, encoding: .utf8)!)

Beberapa Batasan

Klausa where dapat mencantumkan beberapa persyaratan yang dipisahkan dengan koma.

struct Stack<T> { var items: [T] = [] }

extension Stack where T: Comparable {
    func maxItem() -> T? { items.max() }
}

var s = Stack<Int>()
s.items = [3, 9, 1]
print(s.maxItem()!)

CustomStringConvertible Bersyarat

Jadikan sebuah tipe dapat dicetak hanya ketika isinya juga demikian, dengan menyusun deskripsi dari elemen-elemennya.

struct Labeled<T> { let label: String; let value: T }

extension Labeled: CustomStringConvertible where T: CustomStringConvertible {
    var description: String { label + ": " + value.description }
}

print(Labeled(label: "Age", value: 30))

Konformansi Bersyarat Bertingkat

Konformansi bersyarat dapat dikomposisikan: larik berisi larik Int bersifat Equatable karena setiap lapisan meneruskan batasan tersebut.

let grid1 = [[1, 2], [3, 4]]
let grid2 = [[1, 2], [3, 4]]
print(grid1 == grid2)

Membatasi dengan Protokol Lain

Klausa where dapat mengharuskan elemen mematuhi protokol yang Anda definisikan, sehingga perilaku yang dibangun berdasarkan protokol tersebut tersedia.

protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }

extension Array where Element: Priced {
    var totalPrice: Double { reduce(0) { $0 + $1.price } }
}

print([Item(price: 1.5), Item(price: 2.5)].totalPrice)

Batasan Tipe yang Sama

Anda dapat membatasi tipe terkait ke tipe tertentu menggunakan ==. Di sini, metode hanya berlaku untuk larik String.

extension Array where Element == String {
    func joinedUpper() -> String {
        map { $0.uppercased() }.joined(separator: "-")
    }
}

print(["a", "b", "c"].joinedUpper())

Cara Kompiler Menggunakannya

Konformansi bersyarat memungkinkan kompiler memberikan manfaat protokol tepat ketika manfaat tersebut valid, sehingga kode generik tetap aman dan dapat digunakan kembali secara maksimal.

struct Optional2<T> { let value: T? }
extension Optional2: Equatable where T: Equatable {
    static func == (l: Optional2, r: Optional2) -> Bool { l.value == r.value }
}
print(Optional2(value: 1) == Optional2(value: 1))

Pemeriksaan Singkat

Uji pemahaman Anda tentang konformansi bersyarat.

Rangkuman

Konformansi bersyarat menggunakan extension Type: Protocol where ... untuk memberikan konformansi hanya ketika parameter tipe memenuhi batasan. Anda telah melihat penerapannya pada Equatable, Codable, dan CustomStringConvertible, dengan batasan protokol, batasan tipe yang sama (==), serta tipe bertingkat. Cara ini menjaga tipe generik tetap aman dan dapat digunakan kembali.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Kesesuaian Kondisional” gratis?

Ya — teks lengkap “Kesesuaian Kondisional” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Kesesuaian Kondisional”?

Buat tipe generik sesuai protocol hanya jika batasannya terpenuhi. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Swift Academy?

Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Kesesuaian Kondisional” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Protocol sebagai Kontrak
  2. Implementasi Bawaan dalam Ekstensi
  3. Komposisi Protocol
  4. Kesesuaian Kondisional
← Kembali ke Swift Academy