2017-12-16 7 views
0

このエラーを解決するにはどうすればよいですか?Swift - ジェネリックを使用しているタイプの値を変換できません

型の値を変換できません '(ApiContainer、) - >()' 予想引数の型に「(ApiContainer <> ?,エラー?) - >()

Screenshot showing the error

サーバからのJSONレスポンス:

{ 
    "meta": { 
     "sucess": "yes", 
     "value": "123" 
    }, 
    "result": [ 
     { 
      "name": "Name 1", 
      "postal_code": "PC1", 
      "city": "City 1", 
      "address": "01 Street" 
     }, 
     { 
      "name": "Name 2", 
      "postal_code": "PC2", 
      "city": "City 2", 
      "address": "02 Street" 
     } 
    ] 
} 

構造体

struct Client: Decodable { 
    let name: String 
    let postal_code: String 
    let city: String 
} 

struct Meta: Decodable { 
    let sucess: String 
    let value: String 
} 

struct ApiContainer<T: Decodable>: Decodable 
    let meta: Meta 
    let result: [T] 
} 

私は関数 'のgetAllの要求を行うと(Tは、例えば、クライアントのためにすることができApiContainer)特派構造体を返すことになっている必要があり

func getAll() { 
    makeRequest(endpoint: "http://blog.local:4711/api/all", completionHandler: 
     {(response: ApiContainer<Client>, error) in 
      if let error = error { 
       print("error calling POST on /todos") 
       print(error) 
       return 
      } 
      print(result) 

      //self.tableArray = decodedData.result 

      DispatchQueue.main.async { 
       self.tableView.reloadData() 
      } 
     }) 
    } 

機能getAll()からmakeRequestが呼び出されます

func makeRequest<T>(endpoint: String, completionHandler: @escaping (ApiContainer<T>?, Error?) ->()) { 
    guard let url = URL(string: endpoint) else { 
     print("Error: cannot create URL") 
     let error = BackendError.urlError(reason: "Could not create URL") 
     completionHandler(nil, error) 
     return 
    } 

    let urlRequest = URLRequest(url: url) 
    let session = URLSession.shared 

    let task = session.dataTask(with: urlRequest, completionHandler: { 
     (data, response, error) in 
     guard let responseData = data else { 
      print("Error: did not receive data") 
      completionHandler(nil, error) 
      return 
     } 
     guard error == nil else { 
      completionHandler(nil, error!) 
      return 
     } 

     do { 
      let response = try JSONDecoder().decode(ApiContainer<T>.self, from: responseData) 
      completionHandler(response, nil) 
     } 
       catch { 
        print("error trying to convert data to JSON") 
        print(error) 
        completionHandler(nil, error) 
       } 
    }) 
    task.resume() 
} 

答えて

0

ジェネリックの場合は注釈を付ける必要がありますジェネリックの静的型を明示的に指定するためにクロージャの型を明示しました

makeRequest(endpoint: "http://blog.local:4711/api/all", 
      completionHandler: { (container : ApiContainer<Client>?, error : Error?) in ... 
+0

パーフェクト!出来た!ありがとうございました!! –

関連する問題