2017-09-17 12 views
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 

코드에 위의 재잘 적용 : 어떤 도움 당신은 JSONDecoderdecode 방법의 선언을 모방 할 수

답변

1

을 감상 할 수있다

또는 다음과 같이 작성할 수 있습니다.

static fileprivate func makeNetworkRequest<T: Decodable>(url: URL, type: T.Type, completionHandler: @escaping (_ error: Error?, _ myObject: T?) ->()) { 
    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() 
} 
+0

위대한 swer! 매력처럼 작동했습니다. –