许多开发人员喜欢扩展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)
}
}
}
答案 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)
}
}
}
}