2016-03-31 2 views
3

я хотел бы использовать быстрые дженерики в пути, описанные ниже:Невозможно преобразовать возвращаемое выражение реализации типа функции родового протокола в

class ResponseContainer { 

} 

protocol DisplayManageable { 

    func getModel<ModelType: ResponseContainer>() -> ModelType? 
} 

class DisplayBaseManager<ObtainedModelType: ResponseContainer>: NSObject, DisplayManageable { 

    var modelObtained: ObtainedModelType? = nil 

    func getModel<ObtainedModelType>() -> ObtainedModelType? { 

     return modelObtained 
    } 
} 

Но у меня есть проблемы с этим кодом, более точно есть проблема в эта линия:

return modelObtained 

И я получаю ошибку:

Cannot convert return expression of type 'ObtainedModelType?' to return type 'ObtainedModelType?'

А теперь мой простой Q неужели я не могу это сделать? Что в этом плохого?

Дженерики в функции протокола и определения классов одинаковы. На мой взгляд, все выглядит хорошо, и логически все в порядке, так почему я не могу это сделать?

ответ

1

Łukasz, я не понимаю, почему он не компилируется, но я нашел способ его скомпилировать. Просто измените заявление о возврате:

return modelObtained as? ObtainedModelType 

Но я все еще жду, чтобы кто-то объяснил причину ошибки в исходном коде.

+1

Что бы сделать это * компилировать *, а значит, в вызове 'manager.getModel()' тип return не зависит от типа 'manager'. Вам нужно будет вызвать 'let model = manager.getModel() как MyModelType?', И это вернет 'nil', если типы не совпадают. –

2

В

func getModel<ObtainedModelType>() -> ObtainedModelType? { ... } 

ObtainedModelType вводит местного общего заполнитель, и что кожевенногоObtainedModelType из определения класса

class DisplayBaseManager<ObtainedModelType: ResponseContainer> 

Это вызывает странное сообщение ищет ошибку

Cannot convert return expression of type 'ObtainedModelType?' to return type 'ObtainedModelType?'

потому что return modelObtained имеет общий тип ObtainedModelType? из определения класса, но ожидаемый возвращаемый тип ObtainedModelType? из определения метода.

То, что вы, вероятно, хотите это протокол с связанного типа

protocol DisplayManageable { 
    associatedtype ModelType: ResponseContainer 
    func getModel() -> ModelType? 
} 

и классом, принимающей этот протокол с ModelType == ObtainedModelType:

class DisplayBaseManager<ObtainedModelType: ResponseContainer>: NSObject, DisplayManageable { 

    var modelObtained: ObtainedModelType? = nil 
    func getModel() -> ObtainedModelType? { 
     return modelObtained 
    } 
}