0Pricing
Swift Academy · Lektion

Constructor Injection

Übergeben Sie Abhängigkeiten über Initializer.

Constructor Injection ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Constructor Injection

Bei der häufigsten DI-Variante werden Abhängigkeiten über einen Initializer übergeben. Das Objekt erhält bei seiner Erstellung alles, was es benötigt, und speichert diese Abhängigkeiten.

Ein einfaches init

Deklarieren Sie eine gespeicherte Eigenschaft und weisen Sie ihr in init einen Wert zu. Aufrufer müssen die Abhängigkeit bereitstellen, um das Objekt zu erstellen.

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()

Unveränderliche Abhängigkeiten

Wenn Sie für injizierte Eigenschaften let verwenden, werden sie unveränderlich. Eine Abhängigkeit kann dann nach der Erstellung nicht mehr ausgetauscht werden.

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)

Mehrere Abhängigkeiten

Listen Sie mehrere Parameter auf, um mehr als eine Abhängigkeit zu injizieren. Der Initializer dokumentiert damit den vollständigen Anforderungssatz.

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()

Standardwerte für Parameter

Ein Standardwert ermöglicht es Aufrufern, eine Abhängigkeit in der Produktion wegzulassen, während sie in Tests weiterhin überschrieben werden kann.

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

Constructor Injection bei Klassen

Bei Klassen wird dasselbe Muster verwendet. Der Initializer weist jeder Abhängigkeit einen Wert zu, bevor die Instanz verwendet werden kann.

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()

Werte injizieren

Abhängigkeiten müssen keine Objekte sein. Sie können Konfigurationswerte wie eine Basis-URL oder ein Flag auf dieselbe Weise injizieren.

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"))

Composition Root

An einer Stelle nahe dem Einstiegspunkt der App wird der gesamte Objektgraph verdrahtet. Der übrige Code erhält einfach fertig erstellte Abhängigkeiten.

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()

Verborgene globale Zugriffe vermeiden

Constructor Injection ersetzt den Zugriff auf verborgene globale Variablen. Jede Abhängigkeit ist explizit, sodass Sie den Datenfluss nachvollziehen können.

struct Settings { let theme: String }
struct Screen {
    let settings: Settings
    func render() { print("Theme: \(settings.theme)") }
}
Screen(settings: Settings(theme: "dark")).render()

Erforderlich oder optional

Wenn eine Abhängigkeit tatsächlich optional ist, modellieren Sie sie mit einem optionalen Typ. Andernfalls machen Sie sie erforderlich, damit ein Objekt niemals unvollständig konfiguriert existieren kann.

struct Analytics { func track() { print("tracked") } }
struct Flow {
    let analytics: Analytics?
    func step() { analytics?.track() }
}
Flow(analytics: Analytics()).step()
Flow(analytics: nil).step()

Warum Constructor Injection

Sie garantiert ein vollständig initialisiertes Objekt, macht Abhängigkeiten sichtbar und funktioniert mit der Unveränderlichkeit von let. Sie ist in Swift die empfohlene Standardeinstellung.

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))

Schnelltest

Warum wird Constructor Injection häufig bevorzugt?

Zusammenfassung

Constructor Injection übergibt Abhängigkeiten über init und speichert sie normalerweise als unveränderliche let-Eigenschaften. Sie können Objekte oder Werte injizieren, Standardwerte angeben und alles in einer Composition Root verdrahten. Als Nächstes injizieren Sie Protokolle statt konkreter Typen.

Häufig gestellte Fragen

Ist die Lektion „Constructor Injection“ kostenlos?

Ja — der vollständige Text von „Constructor Injection“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Constructor Injection“?

Übergeben Sie Abhängigkeiten über Initializer. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Swift Academy zu starten?

Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.

Wie lange dauert die Lektion „Constructor Injection“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?

Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Warum Dependency Injection?
  2. Constructor Injection
  3. Protocol-basierte Abstraktionen
  4. Abhängigkeiten in Tests mocken
← Zurück zu Swift Academy