我在下面编写了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")
}
}
然后我想写下面的代码而不使用“as Cat”投射
var cat = Animal.getAnimalByName(name: "Cat")
cat.run()
应该怎么做?在动物课上是吗?
我尝试过AnyObject,但是当我在iphone模拟器上构建代码时,我收到一条错误消息“methodSignatureForSelector: - 提前出现问题 无法识别的选择器 - [Cat run]“虽然这次编译成功了。
答案 0 :(得分:0)
您应该向下转换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()
答案 1 :(得分:0)
如果没有向下转发,就无法执行此操作,因为如果您希望能够调用Cat
,则必须从某些转到特定类型cat.run()
。返回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()
那就是说,不要做第二个,只做可选的演员。