1
네트워크에서 JSON을 다운로드하고 Decodable
프로토콜을 준수하는 Swift 구조체로 테마를 변환하는 API 핸들러를 만들기 위해 일반적인 네트워킹 기능을 만들려고합니다. 현재 내가 명시 적 유형을 사용하고 있습니다 : 나는 완료 처리기에서 반환 된 데이터 객체를 Decodable
에 확인 모든 데이터 유형을 지정하고있을 수있는 일반적인 함수를 만들 바라고일반 디코딩 유형의 네트워킹 호출
struct MyObject : Decodable {
let id : Int
let name : String
}
static fileprivate func makeNetworkRequest(url: URL, completionHandler: @escaping(_ error: Error?, _ myObject: MyObject?) ->()) {
URLSession.shared.dataTask(with: url) { (data, response, error) in
// handle error
do {
let myNewObject = try JSONDecoder().decode(MyObject.self, from: data!)
completionHandler(nil, myNewObject)
}
catch let error {
completionHandler(error, nil)
return
}
}.resume()
}
. 의 라인을 따라 뭔가 :
static fileprivate func makeNetworkRequest<T>(url: URL, type: <<<Decodable Type>>>, completionHandler: @escaping(_ error: Error?, _ myObject: <<<Deocable Object>>>?) ->()) {
URLSession.shared.dataTask(with: url) { (data, response, error) in
// handle error
do {
let myNewObject = try JSONDecoder().decode(<<<Decodable Type>>>.self, from: data!)
completionHandler(nil, myNewObject)
}
catch let error {
completionHandler(error, nil)
return
}
}.resume()
}
그러나, 나는 함수 매개 변수가 올바른지 얻을 수없는 것. 제네릭에 대한 많은 경험이 없습니다.
static fileprivate func makeNetworkRequest<T>(url: URL, type: T.Type, completionHandler: @escaping (_ error: Error?, _ myObject: T?) ->())
where T: Decodable
{
URLSession.shared.dataTask(with: url) { (data, response, error) in
// handle error
do {
let myNewObject = try JSONDecoder().decode(T.self, from: data!)
completionHandler(nil, myNewObject)
} catch let error {
completionHandler(error, nil)
return
}
}.resume()
}
: 정의는이 같은해야
open func decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable
코드에 위의 재잘 적용 : 어떤 도움 당신은 JSONDecoder
의 decode
방법의 선언을 모방 할 수
위대한 swer! 매력처럼 작동했습니다. –