加藤潤(98)23この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。最近生後7ヶ月の娘を見た人から「眉毛が垂れててお父さんそっくりですね〜」と言われるのが定番になっている加藤です。今回はSwiftのDIフレームワークであるSwinjectの話です。Injectionの略で、日本語では「依存性の注入」と訳されます。「DIとは何か」を説明した記事は山ほどありますが、ここでは一番端的に表現している記事を見つけたので引用します。“依存性注入とはインスタンス変数にオブジェクトを与えるということです。本当にただそれだけです。ShoreSwiftにおける現実的なモックより引用。あるオブジェクトが依存しているオブジェクトを外から渡してあげることを意味します。依存しているオブジェクトを中で作らずに外から渡してあげることで、オブジェクト同士を柔軟に組み合わせることが可能になったり、テストしやすくなったりと様々なメリットがあります。SwinjectとはSwinjectはSwiftの軽量なDIフレームワークです。MITライセンスで公開されています。使用するために必要な条件は以下の通りです。本記事の検証環境は以下の通りです。CocoaPodsでインストール可能です。今回はCocoaPodsでインストールしました。installを実行すればOKです。1.0.0'end※Swinjectと一緒にSwinjectStoryboardもインストールしていますが、こちらはStoryboardでインスタンス化されたViewControllerに自動的にDIを行うためのSwinjectの拡張です。必須ではありませんが、Storyboardを使って画面を作るなら入れた方が良いかと思います。Swinjectはバージョン2.0.0、SwinjectStoryboardはバージョン1.0.0がインストールされました。Swinjectの基本的な使い方READMEから基本的な使い方を見ていきます。依存関係を持つモデルを定義する以下のようにAnimalプロトコル及び当該プロトコルに準拠したCatクラスを定義します。}}さらに、Personプロトコル及び当該プロトコルに準拠したPetOwnerクラスを定義します。}}PetOwnerはコンストラクタでAnimalを受け取り、保持しています。PetOwnerはAnimalに対して依存していますが、Animalは具体的な実装を持つclassやstructではなく、プロトコルになっています。このようにDIではプロトコル(抽象)に依存するような作りにします。Swinjectを使ってDIするモデルが定義できたので、DIしてみます。Swinjectを使ったDIは基本的に以下の手順となります。Container(一般的にDIコンテナと言われる)を作成する。Containerに、Service(何かしらに依存しているオブジェクトの型)と、依存性を注入したServiceを生成する処理を登録する。ContainerからServiceを取り出して使用する。Container(一般的にDIコンテナと言われる)を作成する。Containerに、Service(何かしらに依存しているオブジェクトの型)と、依存性を注入したServiceを生成する処理を登録する。ContainerからServiceを取り出して使用する。Tama.resolveの結果はOptional型ですが、ContainerにPerson.selfを登録していて取得できることは明らかであるため、強制アンラップを行なっています。結果からContainerに登録した依存性が解決されていることがわかります。Service登録処理についてServiceは使われる前に事前にContainerに登録しておく必要があります。登録方法はSwinjectStoryboardを使う場合と使わない場合で異なります。説明のために以下のようなUIViewControllerを定義し、アプリ起動時の初期画面として表示する場合を考えます。Person?}上記のUIViewControllerをContainerに登録する方法について、SwinjectStoryboardを使う場合と使わない場合それぞれ説明します。前提として、Main.storyboardにアプリ起動時の初期画面としてPersonViewControllerが登録されているとします。SwinjectStoryboardを使う場合は以下のようにSwinjectStoryboardのextensionでsetup()メソッドを定義し、メソッドの中でServiceをContainerに登録します。SwinjectStoryboardにはデフォルトのコンテナ(defaultContainer)が用意されているため、それを使います。}}ContainerにPersonViewControllerを登録するだけで、SwinjectStoryboardがPersonViewControllerの解決を勝手にやってくれます!便利ですね。SwinjectStoryboardを使わない場合Storyboardを使わずにアプリ起動時の初期画面としてPersonViewControllerを表示する場合を考えます。SwinjectStoryboardを使わない場合は通常、AppDelegateでService登録処理を行います。}こちらは自分でContainerに登録したUIViewControllerを取得する必要があります。おわりに今回はSwinjectを使ってDIを行ってみました。アプリの規模が大きくなるとモジュール間の依存関係は複雑になりがちです。依存関係を一元管理し、変更容易性を高めるためにも使えるのではと思います。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。#cmdevio新型コロナウイルスの感染拡大を受け、本イベントを延期させていただくことになりました(開催時期未定)。お申し込みいただいた皆様には大変申し訳ございませんが、何卒ご理解いただけますようよろしくお願いいたします。AWSについてライトに色んな情報交換をしましょう。カフェ店長のオカノです。今日はオフィスに用があるので、通勤ラッシュを避けて出社しました。この子は新メンバーのさめくんです。在宅勤務が推奨されているのでオフィスが閑散としており、すこしさみしそうです。使いたいときの注意点を書きました。本が出ていたので読んでみたところよかったので紹介させていただきます。