SwiftUI. Как сохранить протоколы VIPER, добавляющие EnvironmentObject?
Я пытаюсь использовать архитектуру VIPER с SwiftUI, используя некоторые протоколы, которые я уже использовал с UIKit.
Это мои BasePresenter
а также Assembler
реализации:
class BasePresenter <V, I, R>: NSObject, Presenter {
typealias View = V
typealias Interactor = I
typealias Router = R
var view: View!
var interactor: Interactor!
var router: Router!
func viewDidLoad() {
print("Base presenter: Viewdidload")
}
}
protocol Assembler {
associatedtype CustomView: ViewProtocol
associatedtype CustomInteractor: Interactor
associatedtype CustomPresenter: Presenter
associatedtype CustomRouter: Router
static func assembleView(_ view: CustomView) -> CustomView
}
extension Assembler {
static func assembleView(_ view: CustomView) -> CustomView {
let presenter = CustomPresenter.init()
var view = view
presenter.view = (view as! CustomPresenter.View)
view.presenter = (presenter as! CustomView.Presenter)
let interactor = CustomInteractor.init()
interactor.presenter = (presenter as! CustomInteractor.Presenter)
presenter.interactor = (interactor as! CustomPresenter.Interactor)
let router = CustomRouter.init()
router.presenter = (presenter as! CustomRouter.Presenter)
presenter.router = (router as! CustomPresenter.Router)
return view
}
}
Он отлично работал с представлениями SwiftUI, пока я не захотел добавить environmentObjects. Проблема в том, что если я добавлю это так:
LoginAssembler.assembleView(LoginView()).environmentObject(user)
приложение вылетает, когда я пытаюсь изменить его с помощью "A View.environmentObject(_:) для UserModel может отсутствовать как предок этого представления".
Я попытался изменить инъекцию объекта среды на инициализацию представления, но потом он больше не имеет типа LoginView (это ModifiedContent<...>), и ассемблер вылетает.
let view = view.init().environmentObject(environmentObject)
let presenter = CustomPresenter.init()
print(view is LoginView) // Prints false
Есть идеи, что я могу использовать для сборки модулей и чтобы опция environmentObject работала?
Заранее спасибо!