🌟
SwiftでのClosureをプロパティに持つstructを利用したDI方法
元ネタはTCAのチュートリアル
通常のprotocol
を活用したDI以外にもClosure
をプロパティに持つstruct
を活用したDI方法があることを知ったので、備忘録を兼ねて記事を作成しました。
実際のコード
プロダクトコード
struct DIee {
let dier: DIer
func execute() -> String {
return "get String from " + dier.getString()
}
}
struct DIer {
let getString: () -> String
}
func call() {
let diee = DIee(dier: DIer(getString: {
"product code"
}))
print("\(diee.execute())")
}
テストコード
func testExample() throws {
let diee = DIee(dier: DIer(getString: {
"test code"
}))
XCTAssertEqual(diee.execute(), "get String from test code")
}
protocol
でのDIとの比較
TCAのチュートリアルによると、Computed property
を利用したDIでは
The test fails with the same messages, but there is a new one. It tells us that we are using a live dependency in our test without overriding it.
と、テスト時にテストダブルの実装忘れを警告してくれるような作り込みができるようです。
swift-dependenciesあたりにどう実現してるかヒントがありそうな気配がしてます。
その他比較した場合の特徴は分かり次第追記したいと思います。
Discussion