在Swift中将变量更改为子类

时间:2015-09-29 17:51:02

标签: swift inheritance

在Swift中,如果我有一个基类和两个继承它的类,它们有自己的属性。如果我将一个变量分配给基类,然后将其更改为子类,我就无法访问所述属性。这是一个非常愚蠢的例子。这是我能想到的结果。 http://swiftstub.com/927736954/?v=gm

class Animal {
    let alive = true
}

class Human:Animal {
    let socks:Int = 5
}

class Dog:Animal {
    let collar = "fun"
}

var a:Animal!

var letter = "h"

switch letter {
    case "d":
        a = Dog()
    case "h":
        a = Human()
    default:
        a = Animal()
}

print(a is Human) // TRUE
print(a.socks) // :28:7: error: 'Animal' does not have a member named 'socks'

我如何最初将变量设置为基类并将其转换为子类并访问所述子类的属性?

2 个答案:

答案 0 :(得分:5)

你需要向下转换你的变量。因此print(a.socks)应替换为

if a is Human {
  print((a as! Human).socks)
}

或附加变量

if let b = a as? Human {
  print(b.socks)
}

<强> UPD:

您也可以使用guard

来实现这一目标
guard let a = a as? Human
  else { return }
print(a.socks)

答案 1 :(得分:4)

这是面向对象编程中非常常见的场景。

  

R.K.回答是完全正确的。我只想在这里添加另一种方法来实现相同的结果。

您可以使用开关查找变量的正确类型并执行向下转换:

var some : Animal?

some = Human() // or some = Dog() or some = Animal()

switch some {
case let human as Human: print("It's a human with \(human.socks) socks")
case let dog as Dog: print("It's a Dog! The collar says: \(dog.collar)")
default: print("It's some unknown kind of animal")
}

希望这有帮助。