Реализуйте PAT для определенного связанного типа - PullRequest
0 голосов
/ 16 декабря 2018

Предположим, у вас есть PAT:

protocol PAT {
    associatedtype T
    func provide() -> T
}

и другой протокол, который использует этот протокол в качестве ограничения типа:

protocol RegularProtocol {
    func consume<P: PAT>(_ pat: P) -> P.T
}

Есть ли способ реализовать этот второй протоколдля определенного ассоциированного типа ПАТ?Например, было бы здорово иметь его, если бы было возможно что-то вроде:

struct Consumer: RegularProtocol /*!*/ where RegularProtocol.T == () /*!*/ {
    func consume<P: PAT>(_ pat: P)  {
        // ...
    }
}

Я не нашел способа сделать что-то подобное, и я предполагаю, что необходимо переосмысление архитектуры.Но в любом случае, я что-то пропустил?

Любой совет по поводу таких ситуаций приветствуется!Спасибо!

1 Ответ

0 голосов
/ 16 декабря 2018

Одной из возможностей является добавление associatedType к RegularProtocol:

protocol PAT {
    associatedtype T
    func provide() -> T
}

protocol RegularProtocol {
    associatedtype T
    func consume<P: PAT>(_ pat: P) -> T where P.T == T
}

struct Consumer: RegularProtocol {
    typealias T = Int
    func consume<P: PAT>(_ pat: P) -> T where P.T == T {
      return pat.provide() * 10
    }
}

Обратите внимание, что RegularProtocol без связанного типа должно будет принимать все типы PAT, поэтому вы не можете реализовать его частичнотолько для некоторых типов.

...