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

时间:2015-03-11 06:27:12

标签: ios 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")
    }
}

然后我想写下面的代码而不使用“as Cat”投射

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

应该怎么做?在动物课上是吗?

我尝试过AnyObject,但是当我在iphone模拟器上构建代码时,我收到一条错误消息“methodSignatureForSelector: - 提前出现问题 无法识别的选择器 - [Cat run]“虽然这次编译成功了。

2 个答案:

答案 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()

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