Я пытаюсь создать пару объектов, которые зависят друг от друга, и у них есть метод, чтобы сбрасывать непосредственно конкретный класс другого объекта. Что-то вроде этого:swift 3 downcast to dynamic class
protocol aProt
{
var bVar:bProt! { get set }
}
protocol bProt
{
var aVar:aProt! { get set }
}
class a: aProt
{
var bVar: bProt!
func bConcrete() -> b {
return bVar as! b
}
}
class b: bProt
{
var aVar: aProt!
func aConcrete() -> a {
return aVar as! a
}
Теперь проблема в том, что я хочу, чтобы это поведение (func aConcrete(),func bConcrete()
) наследуются подклассами а и Ь. Затем я подумал, что идеальный способ сделать это - использовать дженерики, но ... Нет никакого способа сделать это.
класс a: aProt { var bVar: bProt! func bConcrete() -> T { возвращение bVar как! T } }
class b: bProt
{
var aVar: aProt!
func aConcrete<T>() -> T {
return aVar as! T
}
Вы можете сделать это, но когда вы должны использовать его, вы должны выполнить обратное приведение переменной в любом случае, так что нет никакого способа сделать это в чистом образом:
let aObject = a()
let bSubclassObject = a.bConcrete() // The compiler complains it cannot infer the class of T
let bSubclassObject = a.bConcrete() as! bSubclass // this works, but this is exactly which I wanted to avoid... :(
Если вы спускаетесь так, как будто, то что-то сломано. Вам никогда не придется сворачивать с протокола на конкретную реализацию. Для этого нужны протоколы. – Fogmeister
Что должен делать компилятор? Вы говорите «отбрасываете этот объект bVar», а затем продолжаете «... вводить T, но я не собираюсь говорить вам, что такое T». – luk2302
@Fogmeister Я пытаюсь создать общую ссылку от одной к другой (a и b), но в конкретной реализации они всегда будут подклассифицированы, поэтому мне нужно опустить результат –