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