Создание реактивного расширения для Alamofire и Argo

Привет у меня есть проблема с моим реактивным расширением для Alamofire

Вот:

extension Alamofire.Manager{

    func rac_jsonRequest<T : Decodable, G : ErrorType>(method: Alamofire.Method,_ URLString: URLStringConvertible, parameters: [String: AnyObject]? = nil, encoding: ParameterEncoding = .URL, headers: [String: String]? = nil) -> SignalProducer<T,G> {

        SignalProducer<T,G> { sink, disposable in
            let request = self.request(method, URLString, parameters: parameters, encoding: encoding, headers: headers).responseJSON { response in
                if let JSON = response.result.value{
                    if let decoded : T = decode(JSON){ //ERROR THIS
                        sink.sendNext(decoded)
                        sink.sendCompleted()
                    }
                }
            }
            disposable.addDisposable({request.cancel()})
        }
    }
}

Я получаю эту ошибку:

Ни один из кандидатов 'декодирования' не приводит к ожидаемому типу контекстного результата 'T?

1 ответ

Это вызвано общим T не является полным / недостаточно строгим для связанного типа. decode Функция, которую вы пытаетесь использовать, указывается следующим образом:

func decode<T: Decodable where T == T.DecodedType>(_ object: AnyObject) -> T?

Экстра where предложение - это то, чего не хватает в вашей реализации. Изменение этого должно исправить это:

func rac_jsonRequest<T : Decodable, G : ErrorType where T == T.DecodedType>(method: Alamofire.Method,_ URLString: URLStringConvertible, parameters: [String: AnyObject]? = nil, encoding: ParameterEncoding = .URL, headers: [String: String]? = nil) -> SignalProducer<T,G> {
Другие вопросы по тегам