Redux Saga
と SwiftUI
SwiftUI
を利用した開発では Redux
ベースのアーキテクチャとの相性がよいといわれて
います。しかしながら、SwiftUI
の実装や癖などから Apple Platform
においては、私は
必ずしもベストマッチだとは言い切れないとも考えています。
私が iOS
アプリを個人開発する場合、Redux
(ReSwift
)+ MVVM
でアプリ設計をする
ことが多いです。Apple Platform
では MVVM
の選択が無難だが、Redux
の利点も捨て
きれないためです。状態は Redux
で管理して、副作用などは ViewModel
で定義してい
ます。今回自作した Redux Saga
により、副作用も Redux
側で管理できるようになりま
した。ViewModel
は Action
の発行と状態を View
へ渡すだけのシンプルな構造になり、
MVVM
でしばしば問題にされる Fat ViewModel
は解消されました。
しかし、このアーキテクチャはニッチだと自認しています。全員には勧めません。Redux
Saga
の学習コストは比較的高いとされています。Redux
ベースのアーキテクチャに興味
ある方、プロジェクトの構造を大きく変えずにまずは試したい方、いかがでしょうか。
まとめ
本記事は、JavaScript
ベースのライブラリ Redux Saga
を Swift
で実装する方法につい
て解説しました。JavaScript
と Swift
は言語の設計と性質が異なるため、Redux Saga
の完全な再現は難しいです。実際に多くの試作して上手くいかないこともあり、ChatGPT
にも相談しました。完全再現は諦めて、その概念を取り入れ、Swift
の特性を活かす形で
実装を試みて、ようやく形になりました。
今回は middleware, call, take
そして takeEvery
の実装を紹介しました。紙面の都合上
から取り上げなかった他の機能 put, fork, selector, takeLeading
や takeLatest
なども
実装しています。それらの実装を含め、ソースコードは GitHub
で公開しています。
https://github.com/mitsuharu/ReSwiftSagaSample
現段階は開発・検証のためのサンプルコードですが、将来的には OSS
としてリリースし
たいと考えています。Redux
をベースとしたアーキテクチャのライブラリ、たとえば
ReSwift
や TCA
などは、すでに多くのアプリで利用されています。今回紹介した Redux
Saga
も iOS
アプリ開発者に興味を持って頂けたら嬉しいです。
1. https://github.com/redux-saga/redux-saga↩
2. https://github.com/reduxjs/redux↩
3. https://github.com/ReSwift/ReSwift
バージョン 6.1.1
を利用しました↩