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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 你可能听过这个术语 :类型擦除。甚至你也用过标准库中的类型擦除(AnySequence)。但是具体什么是类型擦除,...
    CepheusSun阅读 3,233评论 0 5
  • 类型 在Swift中,有两种类型:命名型类型和复合型类型。命名型类型是在定义时可以给定的特定名字的类型。命名型类型...
    silly鸿阅读 754评论 0 0
  • 136.泛型 泛型代码让你可以写出灵活,可重用的函数和类型,它们可以使用任何类型,受你定义的需求的约束。你可以写出...
    无沣阅读 1,658评论 0 4
  • object 变量可指向任何类的实例,这让你能够创建可对任何数据类型进程处理的类。然而,这种方法存在几个严重的问题...
    CarlDonitz阅读 1,020评论 0 5
  • Kotlin 知识梳理系列文章 Kotlin 知识梳理(1) - Kotlin 基础Kotlin 知识梳理(2) ...
    泽毛阅读 2,748评论 0 4

友情链接更多精彩内容