我在下面写了 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()