在 Swift 中将变量改为子类

5

在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个回答

7
你需要将变量向下转换。所以print(a.socks)应该替换为
if a is Human {
  print((a as! Human).socks)
}

或者使用其他变量。
if let b = a as? Human {
  print(b.socks)
}

更新:

你也可以使用guard实现这个功能:

guard let a = a as? Human
  else { return }
print(a.socks)

4

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

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

您可以使用switch语句来查找变量的正确类型并执行向下转型:

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")
}

希望这能帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接