通过Swift 3中的下标访问NSCache

Eri*_*rik 7 swift

许多开发人员喜欢扩展NSCache以使其与使用类似代码片段的内容兼容,但是这已经停止在Swift 3中工作.它目前是在Swift.org上跟踪的已知错误.与此同时,有没有人找到另一种方法来获得相同的结果?我不想改变我的整个代码库,但我也不知道这个bug会在多长时间内得到解决

// Allows using subscripts on NSCache, like a dictionary
extension NSCache {
subscript(key: AnyObject) -> AnyObject? {
    get {
        return object(forKey: key as! KeyType)
    }
    set {
        if let value: AnyObject = newValue {
            setObject(value as! ObjectType, forKey: key as! KeyType)
        } else {
            removeObject(forKey: key as! KeyType)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

pai*_*aiv 4

在SR-2104修复之前可能的解决方法:

选项1

当您可以用任意类(而不是继承自 )替换缓存对象时NSCache,您可以包装NSCache在通用容器中,并转发必要的方法:

class WrappedCache<Key, Value> where Key: AnyObject, Value: AnyObject {

    let cache = NSCache<Key, Value>()

    subscript(key: Key) -> Value? {
        get {
            return cache.object(forKey: key)
        }
        set {
            if let newValue = newValue {
                cache.setObject(newValue, forKey: key)
            }
            else {
                cache.removeObject(forKey: key)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

cache如果必须的话,你可能会逃避传递内在价值。

选项2

当您必须引用NSCache,并且特定缓存类型的数量有限时,您可以对它们进行专门化,每个缓存类型都有自己的下标实现:

class NumberCache : NSCache<NSString, NSNumber> {

    subscript(key: NSString) -> NSNumber? {
        get {
            return object(forKey: key)
        }
        set {
            if let newValue = newValue {
                setObject(newValue, forKey: key)
            }
            else {
                removeObject(forKey: key)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)