0Pricing
Swift Academy · Pelajaran

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 default

Injeksi 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

  1. Mengapa Injeksi Dependensi
  2. Injeksi Konstruktor
  3. Abstraksi Berbasis Protocol
  4. Membuat Mock Dependensi dalam Pengujian
← Kembali ke Swift Academy