В чем проблема с моим обобщенным протоколом c в Swift? - PullRequest
0 голосов
/ 20 февраля 2020

Не могу понять, как работают типы протоколов c в Swift. То же решение в Java или Kotlin будет работать без проблем.

protocol ResultProtocol {
   associatedtype T: ResultTypeProtocol
   var result: T? { get set }
}

protocol ResultTypeProtocol {
   func didGet()
}


protocol InteractorProtocol: ResultProtocol where T == InteractorResultProtocol {
   func someLogicRelatedToInteractor()
}

protocol InteractorResultProtocol: ResultTypeProtocol {
   func interactorResult()
}

class Interactor: InteractorProtocol {
  typealias T = InteractorResultProtocol

  var result: InteractorResultProtocol?

  func someLogicRelatedToInteractor() {}
}

Я получаю 2 ошибки в моем коде. Во-первых, когда я помещаю ограничение generi c на другой протокол Error on type constraint

Вторая ошибка заключается в том, что мой класс Interactor не соответствует протоколу. Когда я нажимаю «исправить», он добавляет еще один «typealias T = type» и хочет, чтобы я снова указал T. Interactor doesn't conform to protocol

Я хочу знать, есть ли другой способ добиться этого в Swift или как решить эту проблему. Идея заключается в том, чтобы расширить мои интерактивные классы с помощью свойства свойства generi c, которое используется в качестве делегата для других слоев. Interactor используется через его протокол и внедряется во все другие классы.

1 Ответ

2 голосов
/ 20 февраля 2020

Как сказано в @vadian: «Тип typealias должен быть конкретным, а не протоколом». Но если вы хотите, чтобы этот класс использовался с другим InteractorResultProtocol, то вы также можете использовать generi c для класса Interactor. И определите T позже.

class Interactor<ResultProtocolType: InteractorResultProtocol>: InteractorProtocol {
    typealias T = ResultProtocolType
    var result: ResultProtocolType?
    func someLogicRelatedToInteractor() {}
}

Использование:

struct MyInteractorResultProtocol: InteractorResultProtocol {
    func interactorResult() {}
    func didGet() {}
}
let interactor = Interactor<MyInteractorResultProtocol>()
...