Я не знаю, что вы пытаетесь сделать, но, конечно, это невозможно. из вашего примера вы пытаетесь создать Bar
класс с generic
. и что это не подходящий способ создания объекта generic
, потому что создание объекта generic
состоит в том, чтобы заставить объект принимать любой тип.
Вот краткое объяснение generic
из Википедии .
В первом абзаце, который гласит: " Универсальное программирование - это стиль компьютерного программирования, в котором алгоритмы пишутся в терминах типов , которые будут определены позже", , которые затем создаются при необходимости для определенных типов, предоставляемых в качестве параметров . "
очень ясно, в чем смысл to-be-specified-later
, верно :)
Вернуться к вашему примеру:
class Bar<F: Foo> {
let foo: F
init() {
// Error, cannot assign value of type 'FooClass' to type 'F'
foo = FooClass()
}
}
Из приведенного выше кода это параметр типа F
, который имеет ограничение на тип Foo
. и вы пытаетесь создать экземпляр переменной foo
с конкретной реализацией, то есть FooClass
. и это невозможно, поскольку переменная foo
имеет тип F
(абстрактный). конечно, мы можем уменьшить его, например, foo = FooClass() as! F
, но тогда foo
ограничивается только FooClass
, так зачем тогда вообще беспокоиться об общем?
Надеюсь, это поможет :)