代理模式、或者协议模式
因为swift泛型还不支持逆变和协变也就不会有真的类型擦除,而这里说的"类型擦除"是指:利用一个具体实现的通用泛型类(参看系统库的AnySequence),去包装具体实现了该泛型协议的类。用以解决不能直接使用泛型协议进行变量定义的问题。具体可以看这篇文章
那个ppt的代码看着不方便,我就简化了一下:
protocol Erasable {
associatedtype DataType
func foo(arg: DataType) -> DataType
}
class AnyErasable<EraseType>: Erasable {
private var fooFunc: (EraseType) -> EraseType
init<Inject: Erasable>(_ obj: Inject) where Inject.DataType == EraseType {
fooFunc = obj.foo
}
func foo(arg: EraseType) -> EraseType {
return fooFunc(arg)
}
}
class MyEraseClass: Erasable {
func foo(arg: Int) -> Int {
return arg * 10
}
}
class MyEraseDelegate<T> {
var val: T
请发表评论