SwiftUI. Как сохранить протоколы VIPER при добавлении EnvironmentObject? - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь использовать архитектуру 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?

Заранее спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...