因?yàn)閟wift泛型還不支持逆變和協(xié)變也就不會(huì)有真的類型擦除,而這里說的"類型擦除"是指:利用一個(gè)具體實(shí)現(xiàn)的通用泛型類(參看系統(tǒng)庫的AnySequence),去包裝具體實(shí)現(xiàn)了該泛型協(xié)議的類。用以解決不能直接使用泛型協(xié)議進(jìn)行變量定義的問題。具體可以看這篇文章
那個(gè)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