先声明,后沮丧

Declaring first, downcasting later

假设我有 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的一些方法,我就会有很多重复的代码。

anObject.methodOfDCOne()

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

你必须先创建subclass类型的对象,这样你才能调用subclass方法。然后将对象分配(向上转换)到基 class 变量:

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
}