MVVM-координаторы с SwiftUI: проблема с универсальным протоколом просмотра - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь обновить свой шаблон MVVM-Coordinators, чтобы использовать его с SwiftUI и Combine.

Чтобы сохранить абстракцию, я использую ScenesFactory, который обрабатывает создание, ну, в общем, моих сцен, таких какследующее:

final class ScenesFactory {
    let viewModelsFactory = SceneViewModelsFactory()
}

extension ScenesFactory: SomeFlowScenesFactory {
    func makeSomeScene() -> Scene {
        let someSceneInput = SomeSceneInput()
        let someSceneViewModel = viewModelsFactory.makeSomeSceneViewModel(with: someSceneInput)
        let someSceneView = SomeSceneView()

        someSceneView.viewModel = someSceneViewModel

        return BaseScene(view: someSceneView, viewModel: someSceneViewModel)
    }
}

Вот реализация протокола my Scene:

public protocol Scene {
    var view:       some View       { get }
    var viewModel:  ViewModelOutput { get }

    init(view: some View, viewModel: ViewModelOutput)
}

Цель в том, чтобы иметь возможность использовать UIHostingController для представления моего someScene.viewно компилятор выдает ошибку в моем Scene протоколе:

enter image description here Я думал, что смысл ключевого слова some заключается именно в том, чтобы использовать универсальные протоколы в качестве возвращаемого типа.

Чего мне не хватает?

1 Ответ

0 голосов
/ 04 октября 2019

Я думал, что смысл ключевого слова some заключается именно в том, чтобы использовать универсальные протоколы в качестве возвращаемого типа.

Да, но, похоже, это не работает таким образом в protocol декларация, не совсем понятно почему.

Но есть способ это исправить, используйте associatedtype, ограниченный View, и компилятор перестанет жаловаться.

public protocol Scene {
    associatedtype Content: View
    var view: Content { get }
}

struct V: Scene {
    var view: some View {
        EmptyView()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...