2015-08-31 4 views
1

У меня есть протокол, который определяет возможность извлечения массива объектов с сервера. 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, но это, вероятно, из-за моего непонимания.

+0

Что такое результат <[Self]? на общий параметр? Как это вообще компилируется? – Sandeep

+0

Привет @GeneratorOfOne, я добавил больше контекста. Он не компилируется - значит, вопрос! – Alex

+0

'Результат 'в Alamofire является общим с 2 параметрами, а не 1, нет? 'public enum Result <Значение, ошибка: ErrorType>' – Brynjar

ответ

5

Я делал что-то подобное и наткнулся на ту же ошибку.

Мое ограниченное понимание этого (который поставляется в основном из двух видео, записанных на WWDC 2015 here и here) предполагает, что ваш класс пользователя должен быть объявлен как:

final class User {...}

Это было бы из-за вызов fetch() не должен быть переопределен подклассом.

fetch() должен возвращать гомогенный массив Самости (в данном случае User) и если User был подклассы (и fetch() перекрываться) она возвращает массив подкласса. Или в легкомысленном мире массив User и его подклассы. Не то, что ожидал суперкласс BulkFetchable!

Смежные вопросы