0
이 오류를 해결하는 방법?스위프트 - 제네릭을 사용하여 유형 값을 변환 할 수 없습니다.
유형의 값을 변환 할 수 없습니다 '(ApiContainer, ) ->()' 예상 인수 유형 '(ApiContainer <>? 오류?) ->()
서버에서 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()
}
Perfect! 그것은 일했다! 고맙습니다!! –