Swift 4可编码和通用

Mor*_*iak 5 generics swift swift4 codable

我正在使用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)
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在参数类型中T.Type,T与预期类型不符Decodable

如何强迫我decoder接受通用价值?

ahb*_*bou 4

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

如果可能的话,我建议切换到具有支持 Codable 的协议(如Cache)的缓存库