2017-02-17 13 views
0

У меня есть класс А:Swift Generic класс не может назначить подкласс

class A<T: MyTypeClass> 
{ 
} 

и класс B

class B<T: MyTypeClassSubclass>: A<T> 
{ 
} 

позволяет сказать, что MyTypeClassSubclass расширяет MyTypeClass

Swift не позвольте мне сделать что-то вроде:

var variable: A<MyTypeClass> = B<MyTypeClassSubclass>() 

если я пишу что-то вроде:

var variable: A<MyTypeClass> = B<MyTypeClassSubclass>() as! A<MyTypeClass> 

Компилятор дают только предупреждение и приложение аварий во время выполнения.

Я пробовал с стиранием типа, но это не работает, потому что в моем случае он начинается с класса. Ведьма уже является общей.

Как я могу решить эту проблему?

+1

Этот [Swift: сгенерируйте родовой тип в тот же общий тип, но с подклассом связанного типа] (http://stackoverflow.com/questions/33752968/swift-cast-generic-type-into-same-generic-type -but-with-a-subclass-of-associate) может помочь –

+1

См. особенно опубликованную статью блога. https://www.mikeash.com/pyblog/friday-qa-2015-11-20-covariance-and-contravariance.html. Короткий ответ заключается в том, что создание этого коварианта потенциально возможно (на языках, отличных от Swift, таких как Scala), но это сложная языковая функция, которая корректно работает с безопасностью типа, а у Swift ее нет. Вы не можете этого сделать. Смешивание подклассов с нетривиальными дженериками очень часто приведет вас в угол. Во избежание этого, вы должны переконфигурировать протоколы или тип ластиков, а не подклассы. –

ответ

1

Ни супертипы, ни подтипы в Swift не допускаются при работе с общими типами. Типы должны быть одинаковыми при использовании дженериков в контексте подклассов.