通过Swift 3中的下标访问NSCache

时间:2016-09-19 12:49:46

标签: swift

许多开发人员喜欢扩展NSCache以使其与使用类似代码片段的内容兼容,但这已停止在Swift 3中工作。它目前已被跟踪的已知错误here on 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)
        }
    }
}

1 个答案:

答案 0 :(得分: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)
            }
        }
    }
}

如果必须的话,你可能会遗漏传递内部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)
            }
        }
    }
}