MENU

コンストラクタインジェクションを使用した値渡しありの画面遷移

目次

はじめに

Swiftでは、依存性の注入(Dependency Injection)を使用してビューコントローラーを初期化することができます。この記事では、API通信の結果を次の画面に渡す際に、コンストラクタインジェクションを使用する方法について説明します。具体的には、DetailViewControllerにAPIの結果を渡すために、initメソッドを使用してビューコントローラーを初期化する方法を紹介します。

サンプルコード

まず、DetailViewControllerを定義します。このビューコントローラーには、API通信の結果を格納するプロパティと、初期化のためのコンストラクタが含まれています。

DetailViewController

import UIKit

class DetailViewController: UIViewController {
    var apiResult: YourDataType?

    // コンストラクタインジェクションを使用するためのイニシャライザ
    init(apiResult: YourDataType) {
        self.apiResult = apiResult
        super.init(nibName: nil, bundle: nil)
    }

    // Interface Builderからの初期化に必要
    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // apiResult を使った処理をここに書く
    }
}

解説

  1. プロパティの定義:
    apiResultというプロパティを定義します。このプロパティは、API通信の結果を格納するために使用します。
  2. イニシャライザの定義:
    init(apiResult:)というイニシャライザを定義し、apiResultプロパティを初期化します。このイニシャライザでは、親クラスのイニシャライザsuper.init(nibName:bundle:)を呼び出しています。
  3. required init?(coder:):
    これは、Interface Builderからビューコントローラーを初期化するために必要です。今回はxibファイルを使用しないため、super.init(coder:)だけを呼び出しています。

遷移元のビューコントローラー

次に、MainViewControllerを定義します。このビューコントローラーは、API通信を行い、結果を取得した後にDetailViewControllerに遷移します。

MainViewController

import UIKit

class MainViewController: UIViewController {
    // API通信の結果を保存する変数
    var apiResult: YourDataType?

    override func viewDidLoad() {
        super.viewDidLoad()

        fetchDataFromAPI()
    }

    func fetchDataFromAPI() {
        // API通信を行い、結果を apiResult に保存
        // 例: ネットワークリクエストをして、データを取得する
        NetworkManager.shared.fetchData { result in
            switch result {
            case .success(let data):
                self.apiResult = data
            case .failure(let error):
                print("Error fetching data: \(error)")
            }
        }
    }

    @IBAction func showDetailViewController() {
        guard let apiResult = apiResult else {
            // API結果がまだない場合のエラーハンドリング
            return
        }

        // コンストラクタインジェクションを使用してDetailViewControllerをインスタンス化
        let detailVC = DetailViewController(apiResult: apiResult)
        self.navigationController?.pushViewController(detailVC, animated: true)
    }
}

解説

  1. API通信の結果を保存するプロパティ:
    apiResultというプロパティを定義し、API通信の結果を格納します。
  2. API通信の実装:
    fetchDataFromAPIメソッドを定義し、API通信を行います。通信が成功した場合は、結果をapiResultに保存します。
  3. 画面遷移:
    showDetailViewControllerメソッドを定義し、API結果が存在する場合にDetailViewControllerを初期化して画面遷移を行います。

一番のPOINTとしては、API通信処理はviewDidLoad内で行ってしまうことで、なるべく早くAPIレスポンスを受け取ろうとしている点。また、ボタン押下で次の画面に値渡ししていますが、レスポンスが返ってきていない場合もguard letでケアしている点です。

まとめ

この記事では、API通信の結果を次の画面に渡すためにコンストラクタインジェクションを使用する方法について説明しました。この方法を使用することで、ビューコントローラー間のデータの受け渡しを明確かつ安全に行うことができます。コンストラクタインジェクションを使用することで、依存関係を明示的にすることができ、コードの可読性と保守性を向上させることができます。

このアプローチを適用することで、よりクリーンでモジュール化されたコードベースを実現できるでしょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Rio@iOSエンジニアのアバター Rio@iOSエンジニア 経営者兼モバイルアプリエンジニア

都内のモバイルアプリ開発会社経営者。
モバイルアプリの新規の請負開発及び保守運用を引き受ける。
Denso→Honda→現在
#RxSwift #MVVM #Firebase #Python3

コメント

コメントする

目次