Повторно использовать связанный тип из протокола в другом протоколе - PullRequest
0 голосов
/ 17 ноября 2018

Это мой код:

protocol Requester {
    associatedtype requestType

    var response: ((requestType) -> ())? { get set }
}

protocol RequestProcesser: AnyObject {
    // Is it possible to define a associated type that is equal to the associated type of Requester?
    associatedtype requester: Requester

    // This associatedtype should always be equal to Requester.requestType
    associatedtype requestType

    var request: requester { get set }
}

extension RequestProcesser {
    func process() {
        request.response = { response in

            // Now I need to cast...
            // Is there any way around this?
            // the type of the response should be equal to requestType so the cast can be omitted right?
            let x = response as! requestType
        }
    }
}

Как вы можете прочитать в комментариях к коду, мне интересно, могу ли я ограничить связанные типы таким образом, чтобы они были равны другим связанным типам в другом протоколе.Цель состоит в том, чтобы опустить актерский состав.Теперь реализующий класс может выбрать другой тип для requestType, что приведет к падению.

1 Ответ

0 голосов
/ 17 ноября 2018

Связанный тип requestType не является обязательным в протоколе RequestProcessor, поскольку он неявный, основанный на связанном типе requester.

Вы должны просто иметь возможность определить RequestProcessorтакой протокол:

protocol RequestProcesser: AnyObject {
    associatedtype requester: Requester
    var request: requester { get set }
}

И используйте его так:

class MyRequester: Requester {
    typealias requestType = Int
    var response: ((Int) -> ())?
}

class MyRequestProcessor: RequestProcesser {
    typealias requester = MyRequester
    var request = MyRequester()
} 

Теперь параметр закрытия response в методе process() примет связанный типMyRequester протокол (в данном случае Int), поэтому приведение не требуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...