2017-01-31 2 views
1

Я новичок в Swift и не могу понять, как десериализовать массив JSON массиву объектов Swift. Я могу десериализовать одного пользователя JSON на объект канала Swift, но не знаю, как это сделать с помощью массива JSON каналов.ResponseCollectionSerializable in swift 3

Моего ResponseCollectionSerializable.swift

import Foundation 
import Alamofire 

public protocol ResponseObjectSerializable { 
    init?(response: HTTPURLResponse, representation: AnyObject) 
} 

extension Request { 
    public func responseObject<T: ResponseObjectSerializable>(completionHandler: Response<T, NSError> -> Void) -> Self { 
     let responseSerializer = DataResponseSerializer<T, NSError> { request, response, data, error in 
      guard error == nil else { return .Failure(error!) } 

      let JSONResponseSerializer = Request.JSONResponseSerializer(options: .AllowFragments) 
      let result = JSONResponseSerializer.serializeResponse(request, response, data, error) 

      switch result { 
      case .Success(let value): 
       if let 
        response = response, 
        let responseObject = T(response: response, representation: value) 
       { 
        return .Success(responseObject) 
       } else { 
        let failureReason = "JSON could not be serialized into response object: \(value)" 
        let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason) 
        return .Failure(error) 
       } 
      case .Failure(let error): 
       return .Failure(error) 
      } 
     } 

     return response(responseSerializer: responseSerializer, completionHandler: completionHandler) 
    } 
} 

public protocol ResponseCollectionSerializable { 
    static func collection(response: HTTPURLResponse, representation: AnyObject) -> [Self] 
} 

extension Alamofire.Request { 
    public func responseCollection<T: ResponseCollectionSerializable>(completionHandler: Response<[T], NSError> -> Void) -> Self { 
     let responseSerializer = DataResponseSerializer<[T], NSError> { request, response, data, error in 
      guard error == nil else { return .Failure(error!) } 

      let JSONSerializer = Request.JSONResponseSerializer(options: .AllowFragments) 
      let result = JSONSerializer.serializeResponse(request, response, data, error) 

      switch result { 
      case .Success(let value): 
       if let response = response { 
        return .Success(T.collection(response: response, representation: value)) 
       } else { 
        let failureReason = "Response collection could not be serialized due to nil response" 
        let error = Error.errorWithCode(.JSONSerializationFailed, failureReason: failureReason) 
        return .Failure(error) 
       } 
      case .Failure(let error): 
       return .Failure(error) 
      } 
     } 

     return response(responseSerializer: responseSerializer, completionHandler: completionHandler) 
    } 
} 

У меня есть проблема: Использования необъявленного типа 'Response' Generic типа '' DataResponseSerializer специализированный слишком много параметров типа (есть 2, но ожидается 1)

enter image description here

Моя модель:

import Foundation 
import ObjectMapper 
import SwiftyJSON 

class AllCnannelModel : ResponseObjectSerializable, ResponseCollectionSerializable{ 

    var id : Int 
    var name: String 
    var url : String 
    var picture : String 
    var category_id: Int 

    public required init?(response: HTTPURLResponse, representation: AnyObject) { 
     self.id = representation["id"] as! Int 
     self.name = representation["name"] as! String 
     self.url = representation["url"] as! String 
     self.picture = representation["picture"] as! String 
     self.category_id = representation["category_id"] as! Int 
    } 

    class func collection(response: HTTPURLResponse, representation: AnyObject) -> [AllCnannelModel] { 
     let postArray = representation as! [AnyObject] 

     return postArray.map({ AllCnannelModel(response:response, representation: $0)! }) 
    } 

} 

проблема:

enter image description here

ответ

0

Этот ответ начинается с the approach that the SwiftyJSON GitHub readme recommends для строительства объекта SwiftyJSON от ответа Alamofire. Вопрос не включал эквивалент вызова Alamofire.request(), показанного ниже. Это устраняет необходимость в некоторых методах в вопросе.

Alamofire.request("(put the URL here)", method: .get).validate().responseJSON { response in 

    switch response.result { 
    case .success(let value): 

     let json = JSON(value) 
     print("JSON: \(json)") 

     if let array = json.array { 
      var channelArray: [AllCnannelModel] = [] 
      for item in array { 
       guard let dictionary = item.dictionaryObject else { 
        continue 
       } 
       if let channel = AllCnannelModel(representation: dictionary) { 
        channelArray.append(channel) 
       } 
      } 
      // Do something with channelArray 
     } 

    case .failure(let error): 
     print(error) 
    } 
} 

AllCnannelModel инициализатор был изменен, чтобы принять словарь, [String: Any].

class AllCnannelModel { 

    var id : Int 
    var name: String 
    var url : String 
    var picture : String 
    var category_id: Int 

    public required init?(representation: [String: Any]) { 
     self.id = representation["id"] as! Int 
     self.name = representation["name"] as! String 
     self.url = representation["url"] as! String 
     self.picture = representation["picture"] as! String 
     self.category_id = representation["category_id"] as! Int 
    } 
}