Из-за отсутствия ковариации Swift мне нужно некоторое обходное решение. Я прихожу из Java-мира, поэтому я инстинктивно пытался создать ограничение от одного типа к другому родовому типу.Общий параметр, ограниченный другим общим параметром
Так что я написал следующий класс:
class Factory<T: AnyObject> {
let factoryClosure:() -> T
init(closure:() -> T) {
factoryClosure = closure
}
init<CHILD: T>(childFactory: Factory<CHILD>) {
factoryClosure = {() -> T in
return otherFactory.create()
}
}
func create() -> T {
return factoryClosure()
}
}
я ожидал, чтобы это работало нормально. У меня есть T
и CHILD
должен быть подклассом T
. Компилятор Swift однако не согласен и показывает следующую ошибку на линии с init<CHILD: T>
.
Наследование от непротокольного, не-класса «T»
Я попытался родовое наследование параметров в другом сценарии, а также. Добавление следующего класса в класс (и удаление init, вызывающего ошибку компиляции).
func to<OTHER where OTHER: AnyObject, T: OTHER>() {
}
Это дает в основном тот же результат.
типа «Т» вынужден типа без протокола «OTHER»
Все, что я, хотя может работать не сделал, и закончилась с подобным сообщением об ошибке. Это ошибка в Swift? Или я чего-то не хватает? Или это особенность Свифта и никогда не будет работать, как я думал?
Что вы на самом деле пытаетесь достичь? Фактическая цель, а не какой-то код, который пытается достичь указанной неустановленной цели. –
Цель, которую я пытаюсь достичь, - это иметь что-то, что позволило бы мне обходиться без ковариантности (если я правильно напомню этот термин). В Java я бы использовал 'Factory extends MyObject> 'и может проходить в любом экземпляре' Factory', который будет иметь параметр типа 'MyObject' или его дочерних элементов. –
Это все еще звучит как средство, а не конец. Какова фактическая цель? –