Unofficial iOS app client for FavQs API. I have been working on this project during my spare time and I'm using it mostly as a playground to play with Swift async/await and the latest version of TCA against a real-world API. It's far from being production ready so many features are missing or not supported yet.
The application follows a clean architecture approach and exposes these layers:
-
Domain
No dependencies, contains models and repository interfaces.
-
UseCase
Very close to Domain and depends on Domain and swift-dependecies for repository registration and DI. It exposes a bunch of functions that can be called to execute the app use cases. Main reasons to have this layer are to have the screaming architecture part of the Domain and to avoid having features using directly the repositories.
-
Persistence
This layer depends only on Domain and is the space for implementing the live repository interfaces.
-
Networking
Implements the repository interfaces using URLSession and calls FavQs API. Internally maps DTOs with JSON details to Domain entities.
-
-
Presentation
This layer exists only logically and contains other three sub-layers. Code in this layer depends on Domain, UseCase, and TCA. The sub-layers are:
-
Feature
Contains the TCA reducers/features. This layer exists to reuse logic in both SwftUI and UIKit environments so no UI framework dependency is allowed.
-
SwiftUIPresentation
Depends on Feature and has SwiftUI implementation of the UI.
-
UIKitImplementation
Similar to SwiftUIPresentation but UIKit implementation of the UI.
-
-
Application
The composition root. Contains the XCode project that depends on the other layers and exposes 2 targets to run the app using SwiftUI or UIKit presentation. It's also the layer from where live repositories injection happens.
Generated using dependecy-graph.
The only dependency that needs some manual steps is Arkana in the Networking implementation of the Persistence layer.
You will need to install it and provide a FavQs API key in the Persistence/Sources/Networking/.env
file (copy the existing .env.template
and rename it) to use the live repositories implementation.
Then run bundle exec arkana
(from Persistence/Sources/Networking
) and you should be good to go.
Contributions are welcome, especially if you notice that I'm doing something completely wrong! If you would like to contribute feel free to raise issues or open pull requests.