Swift 先声明,后下调

Swift 先声明,后下调,swift,downcast,Swift,Downcast,假设我有BaseClass,DerivedClassOne,derivedclastwo,一个神奇的工厂方法giveMeAnObjectOfType(type:String)->BaseClass,以及以下代码 func myBeautifulFunction(index: Int) -> BaseClass { let type : String = self.someArray[index] var anObject : BaseClass switch ty

假设我有
BaseClass
DerivedClassOne
derivedclastwo
,一个神奇的工厂方法
giveMeAnObjectOfType(type:String)->BaseClass
,以及以下代码

func myBeautifulFunction(index: Int) -> BaseClass {
    let type : String = self.someArray[index]
    var anObject : BaseClass

    switch type {

    case "TypeOne":
        // This won't work
        anObject = self.giveMeAnObjectOfType("DerivedClassOne") as! DerivedClassOne
        anObject.methodOfDCOne()

    case "TypeTwo":
        // Neither will this
        anObject = self.giveMeAnObjectOfType("DerivedClassTwo") as! DerivedClassTwo
        anObject.methodOfDCTwo()

    default:
        // Throw a tantrum here
    }

    return anObject
}
这将导致错误,指出对象不包含
methodofdctone()
methodOfDCTwo()
。问题:如何正确地投射对象

基本上,我可以通过在交换机的案例中使用几个return语句来实现同样的效果,但我不喜欢这样。此外,如果我想调用
基类的一些方法,我会有大量重复的代码

anObject.methodOfDCOne()
未编译,因为
methodOfDCOne
不是实例方法 属于
基类
(或其超类)

您必须首先创建子类类型的对象,以便可以调用子类方法。然后将对象分配(向上转换)到基类 变量:

func myBeautifulFunction(index: Int) -> BaseClass {
    let type : String = self.someArray[index]
    let anObject : BaseClass

    switch type {

    case "TypeOne":
        let dc1 = self.giveMeAnObjectOfType("DerivedClassOne") as! DerivedClassOne
        dc1.methodOfDCOne()
        anObject = dc1

    case "TypeTwo":
        let dc2 = self.giveMeAnObjectOfType("DerivedClassTwo") as! DerivedClassTwo
        dc2.methodOfDCTwo()
        anObject = dc2

    default:
        // Throw a tantrum here
        fatalError("Unexpected type")
    }

    return anObject
}

好的,这就解决了。我能从文件中读到一些特别的东西来澄清为什么会发生这种情况吗?@Morpheu5:为什么会发生这种情况?如果
一个对象
被声明为
基类
的一个实例,那么就不能对它调用子类方法。不,我明白了。我想我被一些我记忆不同的旧代码弄糊涂了。无论如何,谢谢:)