У меня есть протокол, который определяет возможность извлечения массива объектов с сервера. Result
определяются в Alamofire:Расширение общего протокола и `Self`
protocol BulkFetchable {
static func fetch(limit : Int, skip : Int, completionHandler : ((request : NSURLRequest?, response : NSHTTPURLResponse?, result : Result<[Self]?>) -> Void)) -> Request
}
Я продлить этот протокол с родовой реализацией (игнорировать тот факт, что это конечная точка фиксирована для целей данного вопроса):
extension BulkFetchable where Self : Mappable {
static func fetch(limit: Int, skip: Int, completionHandler: ((request: NSURLRequest?, response: NSHTTPURLResponse?, result: Result<[Self]?>) -> Void)) -> Request {
return Alamofire.request(.GET, "http://localhost:4567/users.json", parameters: ["limit" : limit, "skip" : skip], encoding: .URL, headers: nil).responseArray(completionHandler)
}
}
Я использую расширение Alamofire Request
, который преобразует ответ JSON в качестве дополнительного массива типа T
, где T
принимает Mappable
:
extension Request {
func responseArray <T : Mappable> (completionHandler: (NSURLRequest?, NSHTTPURLResponse?, Result<[T]?>) -> Void) -> Self {
return responseJSON(completionHandler: { (req, res, result) -> Void in
switch result {
case .Success(let json):
completionHandler(req, res, .Success(Mapper<T>().mapArray(json)))
break
case .Failure(let data, let error):
completionHandler(req, res, .Failure(data,error))
break
}
})
}
}
Тогда я даю мой User
модель эта способность:
extension User : BulkFetchable {}
Увы, я получаю сообщение об ошибке:
Protocol 'BulkFetchable' requirement 'fetch(_:skip:completionHandler:)' cannot be satisfied by a non-final class ('User') because it uses 'Self' in a non-parameter, non-result type position
Что я могу сделать, чтобы обойти это? Я бы ожидал, что Self
автоматически станет User
в контексте расширения до User
, но это, вероятно, из-за моего непонимания.
Что такое результат <[Self]? на общий параметр? Как это вообще компилируется? – Sandeep
Привет @GeneratorOfOne, я добавил больше контекста. Он не компилируется - значит, вопрос! – Alex
'Результат 'в Alamofire является общим с 2 параметрами, а не 1, нет? 'public enum Result <Значение, ошибка: ErrorType>' – Brynjar