2017-10-12 57 views
2

我正在使用PINCache向我的應用程序添加緩存,並且我處於委託編碼/解碼方法由緩存系統調用的情況。 這些方法是通用的,但通用值不明確符合Codable。因爲他們是委託人,所以我無法更改簽名以使通用類型符合CodableSwift 4 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) 
    } 
} 

有了這個代碼,我有以下錯誤:

In argument type T.Type , T does not conform to expected type Decodable

我怎麼能強迫我decoder接受通用的價值?

+0

能否請您添加代碼調用該函數'modelForKey '以及?謝謝;) –

回答

3

由於可編碼不能擴展來實現的(沒有?),並自SimpleModel是內部PINCache你不能使其符合可編碼的。

如果可能的話,我建議使用支持可編碼像Cache

0

改變這一行來檢查它是否符合Decodable

guard let cacheKey = ... as? Data, T.self is Decodable else { 
+0

我的代碼有什麼區別?我已經在檢查'T.self'是否是'Decodable'。 – Morniak

+0

@Morniak你在哪裏檢查? – Paolo

+0

我的警衛的最後一條指令(第2行) – Morniak

2

協議嘗試func modelForKey<T : SimpleModel, Decodable> ...,要求類型被限制爲可解碼切換到高速緩存庫。

0

IMO問題不在PINCache中。

T.self is Codable不告訴編譯器更多類型T,所以decoder.decode(T.self, from: data)將不會通過類型檢查,即使TDecodable

我認爲分叉RocketData將是最簡單的解決方案(如果您想繼續使用RocketData + Decodable並且所有模型符合Decodable)。使SimpleModel符合Decodable

0
  1. 嘗試創建CustomProtocol: Codable, SimpleModel

  2. 如果點1沒有工作,嘗試創建自定義類CustomClass: SimpleModel, Codable,並使用modelForKey<T : CustomClass>

+1

謝謝,我編輯它 –