2017-11-02 3 views
0

웹 서비스에서 JSON 데이터를 간단하게 가져 오는 데 Swift 4 Codable 인터페이스를 사용하고 있습니다. 디코딩을 처리하기 위해 제네릭 형식 메서드를 구현하려고 했으므로 (사용자 지정 메서드가 필요하지 않음) 오류가 계속 발생합니다. 여기에 오류가 "형의 인수 목록 '(: 데이터에서 T를)' '해독'을 호출 할 수 없습니다"읽는 코드내 템플릿이 JSONDecodable과 호환되지 않는 이유는 무엇입니까?

extension StarWarsAPI { 
public func decodeJson<T: Codable>(fetchUrl: URL, modelType: T, completion: @escaping (_ modelObject: Codable?, _ error:StarWarsErrorType?) -> Void){ 

    //guard modelType is Codable else {return completion(nil,nil)} 

    var fetchRequest = URLRequest(url: fetchUrl, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) 

    fetchRequest.httpMethod = "GET" 
    fetchRequest.allHTTPHeaderFields = [ 
     "content-type": "application/json", 
     "cache-control": "no-cache", 
    ] 

    let session = URLSession.shared 
    let fetchDataTask = session.dataTask(with: fetchRequest) { (data, response, error) in 

     guard error == nil else { 
      return completion(nil, StarWarsErrorType.urlResponseError(error: error)) 
     } 
     guard let httpResponse = response as? HTTPURLResponse else { 
      return completion(nil, StarWarsErrorType.NilUrlResponseError()) 
     } 
     guard let data = data else { 
      return completion(nil, StarWarsErrorType.noDataFound) 
     } 
     guard httpResponse.statusCode > 199 && httpResponse.statusCode < 300 else { 
      return completion(nil, StarWarsErrorType.httpErrorCode(code: httpResponse.statusCode)) 
     } 
     var modelObject:Codable? 
     do { 

      let jsonDecoder = JSONDecoder() 
      modelObject = try jsonDecoder.decode(modelType.self, from: data) 
      return completion(modelObject, nil) 
     }catch{ // do nothing } 

      DispatchQueue.main.async { 
       completion(nil, nil) 
      } 
     } 
    } 

    fetchDataTask.resume() 
} 

입니다. 다음은 오류의 스크린 샷입니다.

무엇이 누락 되었습니까? 감사! decode(_:from:)

enter image description here

답변

2

전달 유형은 정적으로 알려진해야합니다. modelType.selfmodelType의 동적 인스턴스이지만 해당 유형은 정적으로 제한되지 않습니다. 정적으로 알려진 유형인 T.self을 사용해야합니다.

+0

이것은 완벽하게 작동했습니다! 고침과 설명에 감사드립니다! 확실하지 않다 . 이 질문을 답으로 표시하는 방법. – RMH

+1

@RMH 기꺼이 도와 드리겠습니다. 질문에 답변으로 표시하는 방법에 대한 지침은 https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work를 참조하십시오. –