Обобщения Swift: неноминальный тип не поддерживает явную инициализацию

Итак, я пытаюсь понять общие протоколы и классы:

protocol ListPresenterType where View.PDO.SW == Dispatcher.SW {
    associatedtype Dispatcher: ListDispatcherType
    associatedtype View: ListViewType

    init(dispatcher: Dispatcher, state: @escaping (_ state: AppState)->(ListState<Dispatcher.SW>))

    func attachView(_ view: View)
    ...
}

И я инициирую это из другого универсального класса:

class AbstractListViewController<Presenter: ListPresenterType, PDO: ListPDOCommonType, ...>: ListViewType, ... where PDO.SW == Presenter.Dispatcher.SW, ... {
    func configure(withBla: bla) {
        ...
        presenter = Presenter(dispatcher: dispatcher, state: state)
    }

    func someFunc() {
        presenter.attachView(self) // ERROR: Cannot invoke 'attachView' with an argument list of type ...
}

Как я понимаю, я пытаюсь инициализировать тип, соответствующий универсальному протоколу, который прекрасно работает, но тип View должен быть несовместим с тем, что я пытаюсь передать ему. attachView(:),

Затем я пытаюсь инициализировать его с конкретным видом, меняя init:

init(dispatcher: Dispatcher, view: View, state: @escaping (_ state: AppState)->(ListState<Dispatcher.SW>)) { 
    self.view = view 
    ... 
}

И в AbstractListViewController:

presenter = Presenter(dispatcher: dispatcher, view: self, state: state)

И получаю эту позорную ошибку:

Non-nominal type 'Presenter' does not support explicit initialization

Вот суть с соответствующими игровыми площадками:

  1. Успешная инициализация (хотя не может вызвать attachView(:)) https://gist.github.com/nikans/0fde838846ffa9ff2da48c923f850625
  2. Ошибка инициализации с вышеупомянутой ошибкой: https://gist.github.com/nikans/53c3ea146ceb12dc8461f7ba8a81793d

Обратите внимание, что каждый пустой протокол на самом деле является общим протоколом, я просто удалил ненужные детали.


Я хотел бы понять:

  1. Что делает "номинальный" тип "неноминальным" внезапно (нечего удивляться, это общий параметр, соответствующий универсальному протоколу, но я не понимаю причинно-следственную связь).
  2. Я что-то слышал о стирании типов, но не совсем понял, применимо ли это здесь.

Благодарю.

1 ответ

Итак, похоже, что в Xcode9 (бета 6) такие ошибки, как Non-nominal type '%type' does not support explicit initialization просто равняется mismatching types ошибка в менее глючном Xcode (если это так): cannot invoke initializer for type '%type' with an argument list of type '...' expected an argument list of type '...'

Другие вопросы по тегам