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

  • 相关阅读:
    JavaScript正则表达式(四)
    JavaScript三元运算符以及运算符顺序
    JavaScript进制转换
    JavaScript赋值运算符和关系运算符
    JavaScript输出
    hadoop1.2.1的安装
    SSH免费登录
    使用java poi解析表格
    【深入理解JVM】:Java类继承关系中的初始化顺序
    解决yum安装mysql时Requires: libc.so.6(GLIBC_2.17)(64bit)
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10305686.html
Copyright © 2011-2022 走看看