У меня есть класс А: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>
Компилятор дают только предупреждение и приложение аварий во время выполнения.
Я пробовал с стиранием типа, но это не работает, потому что в моем случае он начинается с класса. Ведьма уже является общей.
Как я могу решить эту проблему?
Этот [Swift: сгенерируйте родовой тип в тот же общий тип, но с подклассом связанного типа] (http://stackoverflow.com/questions/33752968/swift-cast-generic-type-into-same-generic-type -but-with-a-subclass-of-associate) может помочь –
См. особенно опубликованную статью блога. https://www.mikeash.com/pyblog/friday-qa-2015-11-20-covariance-and-contravariance.html. Короткий ответ заключается в том, что создание этого коварианта потенциально возможно (на языках, отличных от Swift, таких как Scala), но это сложная языковая функция, которая корректно работает с безопасностью типа, а у Swift ее нет. Вы не можете этого сделать. Смешивание подклассов с нетривиальными дженериками очень часто приведет вас в угол. Во избежание этого, вы должны переконфигурировать протоколы или тип ластиков, а не подклассы. –