swift中的"類型擦除"

因?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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 你可能聽過這個(gè)術(shù)語 :類型擦除。甚至你也用過標(biāo)準(zhǔn)庫中的類型擦除(AnySequence)。但是具體什么是類型擦除,...
    CepheusSun閱讀 3,233評論 0 5
  • 類型 在Swift中,有兩種類型:命名型類型和復(fù)合型類型。命名型類型是在定義時(shí)可以給定的特定名字的類型。命名型類型...
    silly鴻閱讀 754評論 0 0
  • 136.泛型 泛型代碼讓你可以寫出靈活,可重用的函數(shù)和類型,它們可以使用任何類型,受你定義的需求的約束。你可以寫出...
    無灃閱讀 1,658評論 0 4
  • object 變量可指向任何類的實(shí)例,這讓你能夠創(chuàng)建可對任何數(shù)據(jù)類型進(jìn)程處理的類。然而,這種方法存在幾個(gè)嚴(yán)重的問題...
    CarlDonitz閱讀 1,020評論 0 5
  • Kotlin 知識梳理系列文章 Kotlin 知識梳理(1) - Kotlin 基礎(chǔ)Kotlin 知識梳理(2) ...
    澤毛閱讀 2,749評論 0 4

友情鏈接更多精彩內(nèi)容