Как проверить соответствие протоколу со связанным типом в Swift? - PullRequest
0 голосов
/ 12 октября 2018

Когда я хочу проверить, соответствует ли тип простому протоколу, я могу использовать:

if let type = ValueType.self as? Codable.Type {}

Когда протокол имеет связанный тип, например, RawRepresentable имеет RawValue, когда я делаю:

if let type = ValueType.self as? RawRepresentable.Type {}

Компилятор покажет следующую ошибку:

Протокол 'RawRepresentable' можно использовать только как общее ограничение, поскольку он имеет требования к Self или связанные с типами


Итак, как проверить соответствие протоколу связанного типа?

1 Ответ

0 голосов
/ 12 октября 2018

TL; DR
Компилятору не хватает достаточно информации для сравнения типа , пока не будет установлен соответствующий тип .


Когда вы ссылаетесь на простой протокол, компилятор знает его тип с самого начала.Но когда вы ссылаетесь на протокол с ассоциированным типом , компилятор не знает его тип, пока вы не объявите его.

protocol ExampleProtocol {
    associatedtype SomeType
    func foo(param: SomeType)
}

На данный момент для компилятора это выглядит так:

protocol ExampleProtocol {
    func foo(param: <I don't know it, so I'll wait until it's defined>)
}

Когда вы объявляете класс, соответствующий протоколу

class A: ExampleProtocol {
    typealias SomeType = String
    func foo(param: SomeType) {

    }
}

Компилятор начинает видетьэто так:

protocol ExampleProtocol {
    func foo(param: String)
}

и , тогда можно сравнивать типы.

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