Injeksi Konstruktor
Teruskan dependensi melalui penginisialisasi.
Injeksi Konstruktor adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.
Injeksi Konstruktor
Gaya DI yang paling umum meneruskan dependensi melalui penginisialisasi. Objek menerima semua hal yang dibutuhkannya saat dibuat dan menyimpannya.
Inisialisasi Dasar
Deklarasikan properti tersimpan dan tetapkan nilainya dalam init. Pemanggil harus menyediakan dependensi untuk membuat objek tersebut.
struct Greeter { func hi() -> String { "Hi" } }
struct View {
let greeter: Greeter
init(greeter: Greeter) { self.greeter = greeter }
func show() { print(greeter.hi()) }
}
View(greeter: Greeter()).show()Dependensi Tidak Dapat Diubah
Menggunakan let untuk properti yang diinjeksi membuatnya tidak dapat diubah, sehingga dependensi tidak dapat ditukar setelah konstruksi.
struct Engine { let hp: Int }
struct Car {
let engine: Engine // cannot change later
init(engine: Engine) { self.engine = engine }
}
let c = Car(engine: Engine(hp: 150))
print(c.engine.hp)Beberapa Dependensi
Cantumkan beberapa parameter untuk menginjeksi lebih dari satu objek pendukung. Penginisialisasi tersebut mendokumentasikan seluruh persyaratan.
struct DB { func get() -> Int { 7 } }
struct Cache { func put(_ v: Int) { print("cached \(v)") } }
struct Service {
let db: DB
let cache: Cache
init(db: DB, cache: Cache) { self.db = db; self.cache = cache }
func run() { cache.put(db.get()) }
}
Service(db: DB(), cache: Cache()).run()Nilai Parameter Bawaan
Nilai bawaan memungkinkan pemanggil menghilangkan dependensi dalam produksi, sekaligus tetap mengizinkan penggantian dalam pengujian.
struct Logger { func log(_ m: String) { print(m) } }
struct Service {
let logger: Logger
init(logger: Logger = Logger()) { self.logger = logger }
func run() { logger.log("go") }
}
Service().run() // uses defaultInjeksi Konstruktor Kelas
Kelas mengikuti pola yang sama. Penginisialisasi menetapkan setiap dependensi sebelum instans dapat digunakan.
class Mailer { func send() { print("sent") } }
class Signup {
let mailer: Mailer
init(mailer: Mailer) { self.mailer = mailer }
func go() { mailer.send() }
}
Signup(mailer: Mailer()).go()Menginjeksi Nilai
Dependensi tidak harus berupa objek. Anda dapat menginjeksi nilai konfigurasi seperti URL dasar atau penanda dengan cara yang sama.
struct Client {
let baseURL: String
init(baseURL: String) { self.baseURL = baseURL }
func endpoint(_ p: String) -> String { baseURL + p }
}
print(Client(baseURL: "https://api").endpoint("/users"))Akar Komposisi
Satu tempat di dekat titik masuk aplikasi merangkai seluruh graf objek. Bagian lainnya cukup menerima dependensi yang sudah disiapkan.
struct DB { func count() -> Int { 3 } }
struct Repo { let db: DB; func n() -> Int { db.count() } }
struct App { let repo: Repo; func run() { print(repo.n()) } }
// Composition root:
let app = App(repo: Repo(db: DB()))
app.run()Menghindari Global Tersembunyi
Injeksi konstruktor menggantikan akses global yang tersembunyi. Setiap dependensi bersifat eksplisit, sehingga Anda dapat melacak aliran data.
struct Settings { let theme: String }
struct Screen {
let settings: Settings
func render() { print("Theme: \(settings.theme)") }
}
Screen(settings: Settings(theme: "dark")).render()Wajib vs Opsional
Jika suatu dependensi benar-benar opsional, modelkan dengan tipe opsional; jika tidak, wajibkan dependensi tersebut agar objek tidak pernah ada dalam keadaan konfigurasi yang tidak lengkap.
struct Analytics { func track() { print("tracked") } }
struct Flow {
let analytics: Analytics?
func step() { analytics?.track() }
}
Flow(analytics: Analytics()).step()
Flow(analytics: nil).step()Mengapa Injeksi Konstruktor
Injeksi ini menjamin objek telah diinisialisasi sepenuhnya, membuat dependensi terlihat, dan bekerja dengan sifat tidak dapat diubah dari let. Injeksi konstruktor adalah pilihan bawaan yang disarankan di Swift.
struct Adder { func add(_ a: Int, _ b: Int) -> Int { a + b } }
struct Calc {
let adder: Adder
init(adder: Adder) { self.adder = adder }
}
print(Calc(adder: Adder()).adder.add(4, 5))Pemeriksaan Singkat
Mengapa injeksi konstruktor sering lebih disukai?
Rangkuman
Injeksi konstruktor meneruskan dependensi melalui init dan menyimpannya, biasanya sebagai properti let yang tidak dapat diubah. Anda dapat menginjeksi objek atau nilai, menyediakan nilai bawaan, dan merangkai semuanya dalam akar komposisi. Berikutnya Anda akan menginjeksi protokol, bukan tipe konkret.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Injeksi Konstruktor” gratis?
Ya — teks lengkap “Injeksi Konstruktor” 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 “Injeksi Konstruktor”?
Teruskan dependensi melalui penginisialisasi. 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 2 dari 4.
Berapa lama pelajaran “Injeksi Konstruktor” 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
- Mengapa Injeksi Dependensi
- Injeksi Konstruktor
- Abstraksi Berbasis Protocol
- Membuat Mock Dependensi dalam Pengujian