【问题标题】:PINCache objectForKey returning NSCoding and can't casting itPINCache objectForKey 返回 NSCoding 并且无法投射它
【发布时间】:2015-07-17 03:50:16
【问题描述】:

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

当我打电话给objectForKey

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

我没有为那个键缓存任何东西,但是 Swift 知道这个对象是一个 NSConding。所以,如果我有一个键值,我没有问题。

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

我已经试过了:

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)
    }
}

【问题讨论】:

    标签: ios swift casting exc-bad-access nscoding


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢 PR :) 现在我可以这样做了:let truckCached = PINDiskCache.sharedCache().objectForKey(TruckCache.key) as? [Truck] ?? [Truck]()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2014-06-04
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多