swift中的"类型擦除"

代理模式、或者协议模式

因为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
// var delegate: Erasable -- 编译失败
var delegate: AnyErasable<T>? init(_ val: T) {
self.val = val
} func doSomething() -> T {
return (delegate?.foo(arg: val))!
}
} let test = MyEraseDelegate(35)
test.delegate = AnyErasable(MyEraseClass())
print("result: \(test.doSomething())") // 350
 

作者:fuadam1982
链接:https://www.jianshu.com/p/a852865f94fc
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

上一篇:利用Teensy进行em410x卡模拟以及暴力破解em410x类门禁系统


下一篇:ch1_6_6求解门禁系统问题