先声明,后来向下倾斜

时间:2015-12-18 19:08:03

标签: swift downcast

说我有BaseClassDerivedClassOneDerivedClassTwo,一个神奇的工厂方法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
}

这将导致错误,指出anObject不包含methodOfDCOne()methodOfDCTwo()。问题:如何正确投射物体?

基本上,我可以通过在switch的情况下使用几个return语句来达到同样的效果,但我不喜欢它的外观。此外,如果我想调用BaseClass的某些方法,我会有大量的重复代码。

1 个答案:

答案 0 :(得分:0)

anObject.methodOfDCOne()

无法编译,因为methodOfDCOne不是实例方法 BaseClass(或其超类)。

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

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
}