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

來源:简书

简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。