5

我正在使用 PINCache 向我的应用程序添加缓存,并且我处于缓存系统调用编码/解码的委托方法的情况。这些方法是通用的,但通用值不明确符合Codable. 因为他们是代表,所以我不能更改签名以使泛型类型符合Codable.

func modelForKey<T : SimpleModel>(_ cacheKey: String?, context: Any?, completion: @escaping (T?, NSError?) -> ()) {
    guard let cacheKey = cacheKey, let data = cache.object(forKey: cacheKey) as? Data, T.self is Codable else {
        completion(nil, nil)
        return
    }

    let decoder = JSONDecoder()
    do {
        let model: T = try decoder.decode(T.self, from: data)
        completion(model, nil)
    } catch {
        completion(nil, nil)
    }
}

使用此代码,我遇到以下错误:

在参数类型中T.TypeT不符合预期类型Decodable

如何强制我decoder接受通用值?

4

5 回答 5

4

由于 Codable 无法在扩展中实现(还没有?),并且 SimpleModel 是 PINCache 的内部模型,因此您无法使其符合 Codable。

如果可能的话,我建议切换到一个支持 Codable 的协议的缓存库,比如Cache

于 2017-10-12T22:43:19.687 回答
4

尝试func modelForKey<T : SimpleModel, Decodable> ...要求该类型被限制为可解码。

于 2017-10-25T05:38:32.817 回答
0

更改此行以检查它是否符合Decodable

guard let cacheKey = ... as? Data, T.self is Decodable else {
于 2017-10-12T13:51:29.557 回答
0

IMO 问题不在于 PINCache。

T.self is Codable不会告诉编译器更多关于 type 的信息T,所以decoder.decode(T.self, from: data)不会通过类型检查,即使T是 a Decodable

我认为分叉 RocketData 将是这里最简单的解决方案(如果您想继续使用 RocketData +Decodable并且您的所有模型都符合Decodable)。使SimpleModel符合Decodable.

于 2017-11-22T19:16:35.553 回答
0
  1. 尝试创建CustomProtocol: Codable, SimpleModel

  2. 如果第 1 点不起作用,请尝试创建自定义类CustomClass: SimpleModel, Codable并使用modelForKey<T : CustomClass>

于 2017-11-27T18:41:57.067 回答