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 defaultConstructor 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
- Warum Dependency Injection?
- Constructor Injection
- Protocol-basierte Abstraktionen
- Abhängigkeiten in Tests mocken