2017-10-12 5 views
2

PINCache를 사용하여 내 앱에 캐시를 추가하고 있으며 캐시 시스템에서 대리/데 코드 방식을 호출하는 상황에 처해 있습니다. 이러한 메서드는 일반적이지만 일반 값은 Codable과 명시 적으로 일치하지 않습니다. 그들은 위임자이므로 일반 형식을 Codable과 일치하도록 서명을 변경할 수 없습니다.Swift 4 Codable & generics

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

가 어떻게 내 decoder이 일반 값을 허용하도록 강제 할 수

이 코드
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) 
    } 
} 

, 나는 다음과 같은 오류가 있어요?

+0

당신이 기능을'호출하는 코드를 추가 시겠어요 사용하려고 만들 modelForKey '도 마찬가지입니까? 감사합니다;) –

답변

3

Codable는 (아직?) 확장에서 구현 될 수 없으며 SimpleModel이 PINCache 내부이기 때문에 당신은 그것을 준수 할 수 없기 때문에 코드 가능.

내가 Cache

0

변경이 라인은 준수하는지 확인 Decodable에 :

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

내 코드와의 차이점은 무엇입니까? 나는'Telfelf'가'복호화 가능'인지 이미 확인하고 있습니다. – Morniak

+0

@Morniak 어디에서 확인할 수 있습니까? – Paolo

+0

내 가드의 마지막 명령어 (라인 2) – Morniak

2

같은 Codable을 지원하는 프로토콜 유형이 복호에 제약을 요구하는 func modelForKey<T : SimpleModel, Decodable> ... 시도와 캐싱 라이브러리로 전환 제안 가능합니다.

0

IMO 문제는 PINCache가 아닙니다.

T.self is Codable

이 유형 T에 대한 컴파일러 더 말하지 않기 때문에 decoder.decode(T.self, from: data)TDecodable 경우에도 유형 검사를 통과하지 않습니다.

저는 RocketData를 위조하는 것이 가장 쉬운 해결책이라고 생각합니다. (RocketData + Decodable을 계속 사용하고 모든 모델이 Decodable을 준수하는 경우). 을 Decodable에 맞추십시오.

0
  1. 시도 점 하나가 작동하지 않는 경우 CustomProtocol: Codable, SimpleModel

  2. 는, 사용자 정의 클래스 CustomClass: SimpleModel, Codable를 만들고 modelForKey<T : CustomClass>

+1

고맙습니다. 편집했습니다. –