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
- Protocol sebagai Kontrak
- Implementasi Bawaan dalam Ekstensi
- Komposisi Protocol
- Kesesuaian Kondisional