0Pricing
Swift Academy · Pelajaran

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

  1. Batasan Parameter Tipe
  2. Klausa where pada Fungsi
  3. Membatasi Tipe Terkait
  4. Subskrip dan Ekstensi Generik
← Kembali ke Swift Academy