Subskrip dan Ekstensi Generik
Terapkan batasan pada subskrip dan ekstensi.
Subskrip dan Ekstensi Generik 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.
Subskrip Generik
Subskrip dapat bersifat generik dan memiliki parameter tipenya sendiri yang tidak bergantung pada tipe yang menaunginya. Dengan demikian, satu subskrip dapat melayani banyak tipe masukan.
struct Lookup {
let data = [1, 2, 3, 4, 5]
subscript<S: Sequence>(indices idx: S) -> [Int] where S.Element == Int {
idx.map { data[$0] }
}
}
print(Lookup()[indices: [0, 2, 4]])Mengapa Menggunakan Subskrip Generik
Anda dapat meneruskan Array, Set, atau Range indeks ke subskrip yang sama karena subskrip tersebut menerima Sequence apa pun yang berisi Int.
struct Lookup {
let data = [10, 20, 30, 40]
subscript<S: Sequence>(_ idx: S) -> [Int] where S.Element == Int {
idx.map { data[$0] }
}
}
let l = Lookup()
print(l[0...1])
print(l[[3, 0]])Ekstensi dengan Batasan
Sebuah extension ... where menambahkan anggota yang hanya ada ketika batasannya terpenuhi. Anggota tersebut muncul pada tipe hanya untuk argumen generik yang sesuai.
extension Array where Element: Numeric {
func sumAll() -> Element { reduce(0, +) }
}
print([1, 2, 3].sumAll())
print([1.5, 2.5].sumAll())Ekstensi pada Tipe Elemen Tertentu
Gunakan where Element == String untuk menambahkan pembantu khusus teks hanya pada larik yang berisi teks.
extension Array where Element == String {
func shout() -> [String] { map { $0.uppercased() + "!" } }
}
print(["hi", "bye"].shout())Ekstensi dengan Batasan Protokol
Tambahkan perilaku ketika elemen mematuhi protokol khusus.
protocol Priced { var price: Double { get } }
struct Item: Priced { let price: Double }
extension Collection where Element: Priced {
var total: Double { reduce(0) { $0 + $1.price } }
}
print([Item(price: 2), Item(price: 3)].total)Subskrip Generik yang Mengembalikan Nilai Opsional
Subskrip dapat bersifat generik dan mengembalikan nilai opsional, misalnya untuk mengakses indeks koleksi dengan aman.
extension Array {
subscript(safe i: Int) -> Element? {
indices.contains(i) ? self[i] : nil
}
}
print([1, 2, 3][safe: 1] ?? -1)
print([1, 2, 3][safe: 9] ?? -1)Subskrip Generik pada Kamus
Subskrip generik dapat menerima rangkaian kunci dan mengembalikan nilai yang sesuai.
extension Dictionary {
subscript<S: Sequence>(keys ks: S) -> [Value] where S.Element == Key {
ks.compactMap { self[$0] }
}
}
let d = ["a": 1, "b": 2, "c": 3]
print(d[keys: ["a", "c"]].sorted())Menggabungkan dengan Klausa Pembatas pada Tipe Itu Sendiri
Ekstensi pada tipe generik dapat membatasi tipe yang dibungkus, sehingga menyediakan antarmuka pemrograman yang disesuaikan.
struct Stack<T> { var items: [T] = [] }
extension Stack where T: Comparable {
var peakMax: T? { items.max() }
}
var s = Stack<Int>(); s.items = [3, 9, 1]
print(s.peakMax!)Subskrip Generik dengan Beberapa Parameter
Sebuah subskrip dapat menerima beberapa argumen sekaligus dengan parameter tipenya sendiri.
struct Grid {
let rows = [[1, 2], [3, 4]]
subscript(_ r: Int, _ c: Int) -> Int { rows[r][c] }
}
print(Grid()[1, 0])Hanya Baca vs Baca-Tulis
Seperti properti, subskrip dapat hanya memiliki get, atau memiliki get dan set untuk melakukan perubahan.
struct Pad {
var values = [0, 0, 0]
subscript(i: Int) -> Int {
get { values[i] }
set { values[i] = newValue }
}
}
var p = Pad(); p[1] = 7
print(p.values)Menggabungkan Semuanya
Subskrip generik dan ekstensi dengan batasan memungkinkan Anda membangun antarmuka pemrograman yang ekspresif dan aman terhadap tipe, yang dapat menyesuaikan diri dengan tipe elemen atau argumen apa pun yang digunakan.
extension Array where Element: Comparable {
subscript(topAfterSort i: Int) -> Element { sorted()[i] }
}
print([5, 1, 9, 3][topAfterSort: 0])Pemeriksaan Singkat
Uji pemahaman Anda tentang subskrip generik dan ekstensi dengan batasan.
Rangkuman
Subskrip generik mendeklarasikan parameter tipe dan klausa where sendiri, sehingga satu subskrip dapat menerima banyak tipe masukan. Ekstensi dengan batasan (where Element: ... atau == ...) menambahkan anggota hanya ketika kondisinya terpenuhi. Keduanya bersama-sama membangun antarmuka pemrograman yang aman terhadap tipe dan mudah beradaptasi.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Subskrip dan Ekstensi Generik” gratis?
Ya — teks lengkap “Subskrip dan Ekstensi Generik” 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 “Subskrip dan Ekstensi Generik”?
Terapkan batasan pada subskrip dan ekstensi. 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 “Subskrip dan Ekstensi Generik” 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