слабое свойство, соответствующее протоколу с общим ограничением - PullRequest
0 голосов
/ 27 января 2019

Я написал упрощенную версию аналогичной реализации, с которой у меня проблема.Кто-нибудь знает, почему это так и в конечном итоге, как обойти?

ПРИМЕЧАНИЕ: код является лишь примером, чтобы сделать его максимально простым

protocol Alertable {
   associatedtype Alert

   func show(alertOfType alertType: Alert)
}
protocol ViewControllerDelegate: class, Alertable {
}

final class MyViewController: UIViewController {

   // MARK: - Types

   enum AlertType {
      case alert
      case warning
   }
}

extension MyViewController: ViewControllerDelegate {
   typealias Alert = AlertType   // ! here i specify the associated type !

   func show(alertOfType alertType: Alert) {
      // code..
   }
}

Пока все хорошо.Но здесь я получаю ошибки:

final class ViewModel {

   // ERROR: Protocol 'ViewControllerDelegate' can only be used as a generic constraint because it has Self or associated type requirements.
   weak var viewController: ViewControllerDelegate?

   init(viewController: ViewControllerDelegate?) {
      self.viewController = viewController
   }

   private func someFunction() {

      // ERROR: Member 'show' cannot be used on value of protocol type 'NewsFeedViewControllerInput'; use a generic constraint instead.
      viewController?.show(alertOfType: .warning)

      // code..
   }
}

Спасибо

1 Ответ

0 голосов
/ 27 января 2019

У вас было небольшое недоразумение.Когда вы определяете:

protocol ViewControllerDelegate: class, Alertable {}

extension MyViewController: ViewControllerDelegate {
    typealias Alert = AlertType   // ! here i specify the associated type !

    func show(alertOfType alertType: Alert) {
        // code..
    }
}

typealias определяется в MyViewController, но не ViewControllerDelegate.Непонятно, зачем вам нужно ViewControllerDelegate в этом вопросе, но, возможно, что-то, чего мы не видим в реальном приложении.

В ViewModel, измените с ViewControllerDelegate на MyViewController:

final class ViewModel {
    weak var viewController: MyViewController?
    // ...
}

Еще одна вещь, хотя и не связанная с ошибкой: вы используете множество final class es.Должны ли они быть struct s вместо?

...