如何在Swift中检查与关联类型的协议的一致性?

时间:2018-10-12 09:42:35

标签: swift swift-protocols associated-types

当我要检查类型是否符合简单协议时,可以使用:

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

当协议具有关联类型时,例如,RawRepresentable具有RawValue时,

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

编译器将显示以下错误:

  

协议“ RawRepresentable”只能用作一般约束,因为它具有“自我”或相关类型要求


那么如何检查与关联类型的协议的一致性?

1 个答案:

答案 0 :(得分:5)

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)
}

然后然后可以比较类型。