当我要检查类型是否符合简单协议时,可以使用:
if let type = ValueType.self as? Codable.Type {}
当协议具有关联类型时,例如,RawRepresentable
具有RawValue
时,
if let type = ValueType.self as? RawRepresentable.Type {}
编译器将显示以下错误:
协议“ RawRepresentable”只能用作一般约束,因为它具有“自我”或相关类型要求
那么如何检查与关联类型的协议的一致性?
答案 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)
}
然后然后可以比较类型。