Ограничение с классами, полученными из родовых классов в быстрых
Я пытаюсь получить свой класс из родового класса:
class foo<T> {}
class bar : foo<Int> {}
Но этот код не скомпилирован с ошибкой en:
Классы, полученные из общих классов, также должны быть общими
Как избежать этого ограничения? Возможно ли это?
Ответы
Ответ 1
Ssreg,
К сожалению, это официальный:
Вы можете подклассифицировать общий класс, но подкласс также должен быть общий класс.
Будем надеяться, что Apple исправит это в будущей версии.
Между тем, рассмотрим это как возможность использовать aggregation вместо подкласса.
Примечание:
В качестве плохой версии решения можно использовать typealias
:
class foo<T> {}
class bar<Int> : foo<Int> {}
typealias Bar = bar<Int>
Таким образом, остальная часть кода может быть написана так же, как если бы Apple уже исправила вопрос.
Ответ 2
Альтернативой typealias
решению является буквально взять документацию:
Вы можете подклассифицировать общий класс, но подкласс также должен быть общий класс.
Итак, мы делаем подкласс общим классом, но другого типа, который мы ничем не используем.
class foo<T> {
func doSomething(t:T) -> T {
return t;
}
}
class bar<S> : foo<Int> {
override func doSomething(t:Int) -> Int {
return t * t;
}
}
let b : bar = bar<AnyObject>()
b.doSomething(5) // 25 instead of 5
Я предпочитаю использовать этот подход при использовании typealias
, потому что он не загрязняет пространство имен дополнительным типом. Это имеет особое значение, если подкласс (bar
) означает public
или internal
.
Edit
В документации больше не содержится фраза об ограничении общих подклассов. Надеюсь, это означает, что Apple планирует изменить это раньше, чем позже.
Ответ 3
В Swift 2 можно подклассифицировать общий класс:
class Something {}
class Base<T> {}
class Fancy : Base<Something> {}
Ответ 4
У меня была такая же проблема, и я нашел решение!
class SomeType {
}
class Foo<T> {
}
class Bar<T: SomeType>: Foo<T> {
}
Теперь вы можете сделать:
let bar = Bar()
Это будет тип по умолчанию для типа SomeType. Единственным недостатком является то, что вы можете сделать это только для типов подкласса. Поэтому для Int
это не сработает.