質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

1250閲覧

iOS Clean Architecture での UseCase の 再利用方法

bbdd

総合スコア43

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/08/22 14:05

前提

iOSアプリ設計パターン入門という本の内容を参考にしております。

問題

同じUseCaseを別の画面でも使用する際、UseCaseの生成はどのようにすればよいか。

詳細

下記記載の参考ソースはこちらのものです

例えば下記のようなApplicationクラスを作成し、UseCaseを必要とする際は Application.shared.useCase としてアクセスするとします。
この時、例えばあるPresenterにてuseCase: ReposLikesUseCase!を利用しているとき、他の画面でもuseCase: ReposLikesUseCase!を利用したい場合はどうすれば良いのでしょうか?

useCaseのoutputをpresenterとして登録するので同じインスタンスを利用しようとすると、outputが上書きされてします。

そこで、次のような思考をしているですが、いまいち釈然としておりません。

→ ならば、別のUseCaseを作成し、公開プロパティとしてApplicationに保持する?
→ UseCaseが使用する画面ベースで増えていきそうだが良いのか?
→ UseCaseを作成するクラスを作成する?(UseCaseはPresenterからweak参照されるので、クラス内で変数として保持しnilにならないようにする必要がある?)

同じUseCaseを別の画面でも使用する際、UseCaseの生成の方針について、アドバイス等頂けますと幸いです。

import UIKit class Application { /// Shared instance static let shared = Application() private init() {} // ユースケースを公開プロパティとして保持 private(set) var useCase: ReposLikesUseCase! func configure(with window: UIWindow) { buildLayer() let storyboard = UIStoryboard(name: "Main", bundle: nil) window.rootViewController = storyboard.instantiateInitialViewController() } private func buildLayer() { // -- Use Case useCase = ReposLikesUseCase() // -- Interface Adapters let reposGateway = ReposGateway(useCase: useCase) let likesGateway = LikesGateway(useCase: useCase) // Use Caseとのバインド useCase.reposGateway = reposGateway useCase.likesGateway = likesGateway // -- Framework & Drivers let webClient = GitHubRepos() let likesDataStore = UserDefaultsDataStore(userDefaults: UserDefaults.standard) // Interface Adaptersとのバインド reposGateway.webClient = webClient reposGateway.dataStore = likesDataStore likesGateway.dataStore = likesDataStore // Presenterの作成・バインドは各ViewControllerを生成するクラスが実施 // (本プロジェクトではTabBarControllerのawakeFromNib()) } } protocol ReposPresenterInjectable { func inject(reposPresenter: ReposPresenterProtocol) }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nakasho_dev

2020/08/29 18:00

UseCaseをApplicationに保持する必要はあるのでしょうか。対象のViewControllerにDIする際に生成するのではダメなのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問