swift 3 向下转换为动态 class

swift 3 downcast to dynamic class

我正在尝试创建几个相互依赖的对象,它们必须有一种方法可以直接向下转换另一个对象的具体 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 和 b 的子 class 继承。然后我认为这样做的完美方法是使用泛型,但是......没有办法做到这一点。

class一个:aProt { var bVar: 保护! func bConcrete() -> T { return bVar 作为!吨 } }

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... :(

定义通用函数并添加 where 到 T:

protocol aProt {
    var bVar: bProt! { get set }
}

protocol bProt {
    var aVar:aProt!  { get set }
}

class a: aProt {
    var bVar: bProt!
    func bConcrete<T: b>(_ type: T.Type) -> T? {
        return bVar as? T
    }
}

class b: bProt {
    var aVar: aProt!
    func aConcrete<T: a>(_ type: T.Type) -> T? {
        return aVar as? T
    }
}

class a1: a { }
class b1: b {
    var fullName: String = "new object"
}

let aObj = a()
aObj.bVar = b1()
let bObj = aObj.bConcrete(b1.self)
bObj?.fullName

根据您的要求,调用 bConcrete(b1.self) 可能仍然不够好,但至少您需要知道您希望 return.