2017-11-02 16 views
0

新しいSwift 4 Codableインターフェイスを使用して、WebサービスからJSONデータを簡単に取得しています。私はデコードを扱うジェネリック型のメソッドを実装しようとしました(私はカスタムメソッドは必要ありません)が、エラーが出ます。ここでエラー「タイプの引数リストで 『(:データから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() 
} 

です。エラーのスクリーンショットを以下に示します。

私には何が欠けていますか?ありがとう!

enter image description here

答えて

2

decode(_:from:)に渡されたタイプが静的に知られている必要があります。 modelType.selfmodelTypeの動的インスタンスですが、そのタイプは静的に制約されません。静的に知られているタイプのT.selfを使用する必要があります。

+0

これは完全に機能しました。修正と説明をありがとう!わからない 。この質問を回答としてマークする方法。 – RMH

+1

@RMH喜んで助けてください。質問に回答としてマークを付ける方法については、https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-workを参照してください。 –

関連する問題