🌟

SwiftでのClosureをプロパティに持つstructを利用したDI方法

2023/11/04に公開

元ネタは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