Membatasi Tipe Terkait
Batasi tipe terkait dalam konteks generik.
Membatasi Tipe Terkait adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.
Rangkuman Tipe Terkait
Sebuah protokol dapat mendeklarasikan tipe terkait dengan associatedtype, yaitu pengganti yang diisi oleh tipe yang mematuhinya. Element dalam protokol kontainer merupakan contoh klasik.
protocol Container {
associatedtype Item
var count: Int { get }
func item(at i: Int) -> Item
}Mematuhi dengan Tipe Konkret
Tipe yang mematuhi protokol menetapkan tipe terkaitnya, yang sering kali disimpulkan dari cara tipe tersebut digunakan.
protocol Container {
associatedtype Item
func item(at i: Int) -> Item
}
struct IntBox: Container {
let values: [Int]
func item(at i: Int) -> Int { values[i] }
}
print(IntBox(values: [10, 20]).item(at: 1))Membatasi Tipe Terkait
Tambahkan batasan langsung dalam deklarasi: associatedtype Item: Comparable memaksa tipe item setiap tipe yang mematuhi protokol untuk mendukung perbandingan.
protocol Sorted {
associatedtype Item: Comparable
var items: [Item] { get }
}
struct Nums: Sorted { let items: [Int] }
print(Nums(items: [3, 1, 2]).items.sorted())Menggunakan Batasan
Karena tipe terkait memiliki batasan, ekstensi protokol dapat mengandalkan kemampuan tersebut.
protocol Sorted {
associatedtype Item: Comparable
var items: [Item] { get }
}
extension Sorted {
var smallest: Item? { items.min() }
}
struct Nums: Sorted { let items: [Int] }
print(Nums(items: [5, 2, 8]).smallest!)Klausa Pembatas pada Tipe Terkait
Swift juga mengizinkan klausa where pada tipe terkait untuk menghubungkannya dengan tipe terkait lain atau tipe bertingkat.
protocol Sequence2 {
associatedtype Element
associatedtype Iterator: IteratorProtocol where Iterator.Element == Element
}Membatasi dengan Protokol Lain
Tipe terkait dapat diwajibkan untuk mematuhi protokol yang Anda definisikan, sehingga perilaku dapat ditambahkan secara berlapis.
protocol HasName { var name: String { get } }
protocol Registry {
associatedtype Entry: HasName
var entries: [Entry] { get }
}
struct User: HasName { let name: String }
struct Users: Registry { let entries: [User] }
print(Users(entries: [User(name: "Ada")]).entries[0].name)Beberapa Tipe Terkait
Sebuah protokol dapat mendeklarasikan beberapa tipe terkait, masing-masing dengan batasannya sendiri.
protocol Mapping {
associatedtype Key: Hashable
associatedtype Value
func value(for k: Key) -> Value?
}
struct Phonebook: Mapping {
let data: [String: Int]
func value(for k: String) -> Int? { data[k] }
}
print(Phonebook(data: ["x": 1]).value(for: "x")!)Tipe Terkait Bawaan
Anda dapat memberikan nilai bawaan untuk tipe terkait menggunakan =, yang digunakan jika tipe yang mematuhi protokol tidak menentukannya dengan cara lain.
protocol Producer {
associatedtype Output = String
func make() -> Output
}
struct Hello: Producer {
func make() -> String { "hi" }
}
print(Hello().make())Batasan Mengaktifkan Algoritme Generik
Dengan tipe terkait yang memiliki batasan, ekstensi protokol dapat menerapkan algoritme nyata yang digunakan bersama oleh semua tipe yang mematuhinya.
protocol Scored {
associatedtype Score: Comparable
var scores: [Score] { get }
}
extension Scored {
var best: Score? { scores.max() }
}
struct Game: Scored { let scores: [Int] }
print(Game(scores: [10, 40, 25]).best!)Batasan Tipe yang Sama dalam Ekstensi
Di luar protokol, Anda dapat membatasi tipe terkait lebih lanjut saat memperluas protokol.
protocol Box2 {
associatedtype Content
var content: Content { get }
}
extension Box2 where Content == Int {
var doubled: Int { content * 2 }
}
struct IB: Box2 { let content: Int }
print(IB(content: 7).doubled)Mengapa Perlu Dibatasi
Membatasi tipe terkait adalah cara protokol tetap generik sekaligus berdaya guna: batasan tersebut merupakan janji yang dapat diandalkan oleh ekstensi dan pemanggil.
protocol Listy {
associatedtype E: Equatable
var elements: [E] { get }
}
extension Listy {
func has(_ x: E) -> Bool { elements.contains(x) }
}
struct L: Listy { let elements: [String] }
print(L(elements: ["a", "b"]).has("b"))Pemeriksaan Singkat
Uji pemahaman Anda tentang pembatasan tipe terkait.
Rangkuman
Anda dapat membatasi tipe terkait secara langsung (associatedtype Item: Comparable), menghubungkannya dengan klausa where, mewajibkan kesesuaian dengan protokol, memberikan nilai bawaan dengan =, mendeklarasikan beberapa tipe terkait, serta menyempurnakannya dalam ekstensi. Batasan memungkinkan ekstensi protokol menerapkan algoritme bersama yang aman terhadap tipe.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Membatasi Tipe Terkait” gratis?
Ya — teks lengkap “Membatasi Tipe Terkait” 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 “Membatasi Tipe Terkait”?
Batasi tipe terkait dalam konteks generik. 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 3 dari 4.
Berapa lama pelajaran “Membatasi Tipe Terkait” 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
- Batasan Parameter Tipe
- Klausa where pada Fungsi
- Membatasi Tipe Terkait
- Subskrip dan Ekstensi Generik