1.2.3 类型擦除

但是在使用关联类型的时候需要注意,当声明一个使用了关联属性的协议对象作为属性时,会先出现no initializers的提示,接着会提示error: protocol 'HTNState' can only be used as a generic constraint because it has Self or associated type requirements。其意思是HTNState协议只能作为泛型约束使用,因为它包含了Self或关联类型。

代码如下:

class stateDelegate<T> {
    var state: T
    var delegate: HTNState
}

那么这个问题该如何处理呢?答案是通过类型擦除来解决,添加一个中间层在代码中,让这个抽象的类型具体化。实际上在Swift的标准库里就有对类型擦除的运用,比如AnySequence协议。