zoukankan      html  css  js  c++  java
  • 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
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 相关阅读:
    UVALive 3938 一道被我WA了的线段树
    批量删除Zen Cart 无图片商品
    zencart加大数据表字段长度
    CSS字体中英文名称对照表
    zencart产品批量表上传后SEO三要素状态以及特价时间修改
    Linux 文件系统
    VMware Tools 安装步骤
    IDEA安装阿里规约插件
    IDEA 中无法使用 EL 表达式
    Redis主从复制
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10305686.html
Copyright © 2011-2022 走看看