将超类强制转换为其子类

时间:2017-06-12 06:59:12

标签: swift xcode casting

我有一个函数,它接受Being类型的实例。 Being有两个子类:PersonAnimal。我希望函数能够识别两者中的哪一个被传递,并使用特定于每个子类的属性执行某些操作。

我认为这样可行:

func fight(attacker1: Being, attacker2: Being) -> String {
    if attacker1 is Person {
        let name1 = attacker1.name as! Person //Error: Value of type Being has no member name
    } else {
        print("Its not a person")
    }

但它没有。什么是实现我想要的最顺利/最短的方式?

3 个答案:

答案 0 :(得分:6)

您应该创建所需类型的新变量,并将参数放入此变量中。

func fight(attacker1: Being, attacker2: Being) -> String {
    if let att1 = attacker1 as? Person {
        let name1 = att1.name
    } else {
        print("Its not a person")
    }

这样,如果attacker1是Person,您只需将此值保存到att1常量中,稍后您可以将此常量用作 Person 类型的实例。

答案 1 :(得分:2)

虽然@ V.Khambir的代码可行并且可能是更好的解决方案,但它没有指出你的代码问题。您正在尝试将.name投射到Person.name不是attacker1的属性,这就是您收到错误的原因。您要做的是将attacker1转换为Person,然后访问name属性。

func fight(attacker1: Being, attacker2: Being) -> String {
    if attacker1 is Person {
        let name1 = (attacker1 as! Person).name
    } else {
        print("Its not a person")
    }

答案 2 :(得分:0)

由于Being是一个基类,所以它不能访问任何子类属性。首先,您必须检查attacker1和attacker2的类型。例如:如果attacker1属于Person类型,那么您可以将其类型转换为Person类型的实例,然后访问person对象的属性。 注意: - 确保先检查类型,然后输入它,否则它会崩溃。