2017-12-16 3 views
0

이 오류를 해결하는 방법?스위프트 - 제네릭을 사용하여 유형 값을 변환 할 수 없습니다.

유형의 값을 변환 할 수 없습니다 '(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

Perfect! 그것은 일했다! 고맙습니다!! –

관련 문제