6
votes

When I want to check if a type conforms to a simple protocol, I can use:

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

When the protocol has associated type, for example RawRepresentable has RawValue, when I do:

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

Compiler will show the following error:

Protocol 'RawRepresentable' can only be used as a generic constraint because it has Self or associated type requirements


So how to check conformance to protocol with associated type?

1
Common sense... What is RawValue in your case of ValueType? :)Dominik Bucher
This kind of check smells quite objective-c-ish. In a strong type language like Swift the type should be checked at compile time.vadian
@DominikBucher I suppose it can be any typeduan

1 Answers

5
votes

TL;DR
Compiler does not have enough information to compare the type until associated type is set.


When you refer to simple protocol, compiler knows its type from the beginning. But when you refer to protocol with associated type, compiler doesn't know its type until you declare it.

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

At this moment for compiler it looks like this:

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

When you declare a class conforming to the protocol

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

    }
}

Compiler starts to see it like this:

protocol ExampleProtocol {
    func foo(param: String)
}

And then it is able to compare types.