class FeatureA { func foo(): String { let b = FeatureB() // Use `FeatureB` return b.bar() + "!!" } } class FeatureB { ... func bar(): String { // do something } } ここでは、FeatureA クラスが FeatureB クラスを利用している。こういう時、 FeatureA は FeatureB に依存していると表現される。FeatureB が存在しなければ、FeatureA は利用できないからだ。 前述のコードは問題なく動作するが、FeatureA のユニットテストをしたい時に問題が起こる。FeatureB をテスト用のモックに差し替えられないのだ。 だから、私達は Protocol という道具を使って、FeatureB を差し替
![【Swift】Bastard Injection の問題点、あるいは依存性逆転の原則について。または needle というDIコンテナの紹介。 - Qiita](https://cdn-ak-scissors.b.st-hatena.com/image/square/b152cfe5e193c304146aeaf2cbf6f4d3e5e9ce73/height=288;version=1;width=512/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png%3Fixlib%3Drb-4.0.0%26w%3D1200%26mark64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUUzJTgwJTkwU3dpZnQlRTMlODAlOTFCYXN0YXJkJTIwSW5qZWN0aW9uJTIwJUUzJTgxJUFFJUU1JTk1JThGJUU5JUExJThDJUU3JTgyJUI5JUUzJTgwJTgxJUUzJTgxJTgyJUUzJTgyJThCJUUzJTgxJTg0JUUzJTgxJUFGJUU0JUJFJTlEJUU1JUFEJTk4JUU2JTgwJUE3JUU5JTgwJTg2JUU4JUJCJUEyJUUzJTgxJUFFJUU1JThFJTlGJUU1JTg5JTg3JUUzJTgxJUFCJUUzJTgxJUE0JUUzJTgxJTg0JUUzJTgxJUE2JUUzJTgwJTgyJUUzJTgxJUJFJUUzJTgxJTlGJUUzJTgxJUFGJTIwbmVlZGxlJTIwJUUzJTgxJUE4JUUzJTgxJTg0JUUzJTgxJTg2REklRTMlODIlQjMlRTMlODMlQjMlRTMlODMlODYlRTIlODAlQTYmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT01NiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWU5MjI1ZWU0MzRmMzc4MmMyMzA5MTQ3Y2EzMWIwMzBh%26mark-x%3D142%26mark-y%3D57%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBZdXN1a2VIb3NvbnVtYSZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9ZWYzODk2N2FkZTQ2MzQzOGU3YTQzMDgxZmMxYmU3ZTg%26blend-x%3D142%26blend-y%3D486%26blend-mode%3Dnormal%26s%3D682ad73c5e0f460fb3b77486ebc57a3d)