Swift:父类类函数是否有可能返回子类的实例



我在下面写了 Swift 代码。

class Animal {
    class func getAnimalByName(name:String) -> ?? {
        if(name == "Cat") {
            return Cat()
        } else {
            return Bird()
        }
    }
}
class Cat: Animal {
    func run() {
        println("run")
    }
}
class Bird: Animal {
    func fry() {
        println("fry")
    }
}

然后我想像下面的代码一样编写,而不使用"作为猫"转换

var cat = Animal.getAnimalByName(name: "Cat")
cat.run()

动物类中应该是什么?

我尝试了AnyObject,但是当我在iPhone模拟器上构建代码时,我收到一个错误,说"methodSignatureForSelector:-前面有麻烦无法识别的选择器 -[Cat 运行]",尽管此编译成功。

如果没有向下投射,就无法做到这一点,因为如果您希望能够调用cat.run(),它必须从某物转到特定类型Cat。返回Animal ,然后您可以使用可选的向下转换或强制向下转换:

// optional
let cat = Animal.getAnimalByName("Cat")
if let cat = cat as? Cat {
    cat.run()
}
// forced
let cat2 = Animal.getAnimalByName("Cat")
(cat2 as! Cat).run()

也就是说,不要做第二个,只做可选的演员表。

你应该向下转换getAnimalByName方法返回的对象,

class Animal {
    class func getAnimalByName(name:String) -> Animal {
        if(name == "Cat") {
            return Cat()
        } else {
            return Bird()
        }
    }
}
class Cat: Animal {
    func run() {
        println("run")
    }
}
class Bird: Animal {
    func fry() {
        println("fry")
    }
}

var cat = Animal.getAnimalByName("Cat") as Cat
cat.run()

最新更新