最近、少しばかりKotlinでAndroid開発をしているときにSwift以上にKotlinの方がDIの文化が進んでそうだな(主にDaggerとか)と思ったんですが、意外とちゃんと時間をとってSwiftのDIについて調べていないなと思ったので時間をとって記事にした次第です。
Dependency Injectionとは
名前の格好良さとか複雑さに惑わされて欲しくはないので言いますが、
ただ外部から値を渡して上げて受け取った物(主にclass)は受け取ったことを前提に記述することできる
ただそれだけです。
実際にcodeに起こしたときはこんな感じです。
class Hoge {
var name: String
init(name: String) {
self.name = name
}
}
let hoge = Hoge(name: "hogehoge")
これが一番シンプルなDIと言えると思います。DIってなんだろうと思って検索した場合は、これは当たり前のことだし、これをDIっていうの思った人も少なくないと思います。ライブラリを使うとコンテナ
とかファクトリ
とかいろいろな単語が出てきて混乱するかもしれませんが、DIという手法をより有効的に使用するための要素でその手法本体ではありません。
それでもまだ信じられない人はこの記事をみてみることを推奨します
この記事は以前私が書いた物ですが、UITableView
を使うときにUITableViewCell
をdequeue
(呼び出す)するタイミングでパラメータを挿入しているだけです。上のサンプルコードでもname
を挿入しているのと同様です。
しかし、これだけではおわりません。いまの説明で完全に理解するにはDIのDの方、Dependency
への理解が不十分です。ここでいうDependency
とはSingleton
であると考えて良いです。
Singletonについて
Singleton
とはその物(class, protocol)が実行時に一つのオブジェクトにのみ依存することを約束することです。ここでSwiftにおいてSingletonを約束するために必要なのがコンテナという概念です。これ以上深く話すには実際にDIのライブラリ等でDIのコンテナの解釈のもと、ライブラリが作られているかで少し変わってきます。思想の問題です。
Swiftで書かれているDIのライブラリ
コンテナを用いる場合
一番使われれているであろうライブラリ
https://github.com/Swinject/Swinject使ったことないけど良さそう
https://github.com/ivlevAstef/DITranquillity
コンテナを用いない場合
Uberが作成しているライブラリ(バージョンが1.0未満なので安心して使えるか微妙)
https://github.com/uber/needle星の数は多いけど少し前から更新が止まってるので不安(8/20時点)
https://github.com/square/Cleanse