ios - PINCache objectForKey 返回 NSCoding 并且无法转换它

标签 ios swift casting exc-bad-access nscoding

我正在使用 PINCache ( https://github.com/pinterest/PINCache ) 将一些对象缓存到我的应用程序中。所以,使用 objC 是完美的,但是当我想用 swift 转换时,我有 EXC_BAD_ACCESS

当我调用 objectForKey

- (id <NSCoding>)objectForKey:(NSString *)key;

我没有为该键缓存任何内容,但 Swift 知道该对象是一个 NSConding。因此,如果我将值放入键中,我就没有问题。

那么,我如何转换这个 NSCoding 结果并与 nil 值进行比较。我只需要知道从 PINCache 返回的对象是否为 nil(从不缓存)。

我已经试过了:

private func setupTrucks() {
    let trucksCached: AnyObject? = PINDiskCache.sharedCache().objectForKey(TruckCache.key)
    if let _truck = trucksCached as? [Truck] { //EXC_BAD_ACCESS here
        print(_truck)
    }
}

private func setupTrucks() {
    let trucksCached = PINDiskCache.sharedCache().objectForKey(TruckCache.key) as [Truck] //EXC_BAD_ACCESS here
    if trucksCached.count > 0 {
        print(_truck)
    }
}

最佳答案

看起来 PINCache 没有将同步 objectForKey: 方法的返回类型定义为 __nullable。否则 Swift 就不知道返回类型是可选的。

我提交了一个已经被接受的 PR,应该可以解决这个问题。您现在应该可以执行以下操作:

let trucksCached: AnyObject? = PINDiskCache.sharedCache().objectForKey("truck_key")
if let _truck = trucksCached as? Truck {
    print(_truck)
}

关于ios - PINCache objectForKey 返回 NSCoding 并且无法转换它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31468121/

相关文章:

ios - SWRevealViewController - 在@IBAction 下手动显示它

ios - 查看角半径问题

ios - 带有 NavigationLink 和按钮的 SwiftUI 列表

xcode - 无法使用 Dictionary<Generic, Generic> 类型的参数列表调用 <function>

JavaScript If/Else 条件和比较 - 差异

objective-c - 从 TableView 初始化的 JTRevealSidebar

ios - 我可以在 Storyboard中看到我的自定义字体,但字体在 iOS 模拟器中没有变化?

ios - 使用 GPUImage 捕捉时减少不必要的运动模糊

c++ - 不能 dynamic_cast

c# - 在 C# 中强制将一种程序集类型转换为另一种程序集类型