Skip to content

Instantly share code, notes, and snippets.

@cjnevin
Last active November 5, 2022 23:51
Show Gist options
  • Save cjnevin/98f105d8c35eeeaddcccb07ee6b753be to your computer and use it in GitHub Desktop.
Save cjnevin/98f105d8c35eeeaddcccb07ee6b753be to your computer and use it in GitHub Desktop.
// Abstract
protocol NavigationController {
func push(_ view: View)
}
protocol View {}
protocol Service {
func fetchUser() -> User
func write(user: User)
}
// Concrete
struct User {
let name: String
}
class Router {
let navigationController: NavigationController // abstract
@Dependency(\.userViewFactory) var userViewFactory // abstract
func show(user: User) {
let view = userViewFactory.make(user)
let presenter = PresenterB(interactor: InteractorB(), router: RouterB())
presenter.delegate = view
view.presenter = presenter
navigationController.push(view)
}
}
class Presenter {
weak var delegate: View? // abstract
let interactor: Interactor // concrete
let router: Router // concrete
func prepare() {
interactor.fetchUser()
}
func store(user: User) {
interactor.store(user)
}
func show(user: User) {
router.show(user)
}
}
class Interactor {
weak var delegate: Presenter?
@Dependency(\.service) var service // abstract
func fetchUser() {
delegate?.show(user: service.fetchUser())
}
func store(user: User) {
service.write(user)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment