Loading...
Published 2022-03-19

Swift - 类型转换

在 Swift 中,类型转换(Type Casting)指的是检查一个实例的类型,或将该实例视为其超类或子类之一的过程。

Swift 提供了两种类型转换方式:

  • 通过类型检查来检查实例的类型是否与特定的类型相同(或是子类或父类):使用 is 和 as 操作符来完成类型检查。

    • is 操作符用于检查一个实例是否属于某个特定类型或其子类。返回值为布尔类型。
    • as? 操作符用于尝试将实例转换为特定类型。如果转换成功,返回一个可选类型的实例,否则返回 nil。
    • as! 操作符强制将实例转换为特定类型。如果转换失败,会抛出一个运行时错误。
  • 通过向下转换来将父类实例转换为其子类实例:使用 as? 或 as! 操作符完成向下转换。

    • as? 操作符尝试将父类实例转换为子类实例。如果转换成功,返回一个可选类型的子类实例,否则返回 nil。
    • as! 操作符强制将父类实例转换为子类实例。如果转换失败,会抛出一个运行时错误。

下面是一个示例代码:

class Animal {
  func makeSound() {
    print("I am an animal")
  }
}

class Dog: Animal {
  override func makeSound() {
    print("Woof!")
  }
}

let animal = Animal()
let dog = Dog()

// Type check
if dog is Animal {
  print("dog is an Animal")
}

// Downcasting
let maybeDog = animal as? Dog
if let dog = maybeDog {
  dog.makeSound()
} else {
  print("Not a dog")
}

// Forced downcasting
let definitelyDog = animal as! Dog // Runtime error!

在上面的代码中,我们创建了一个 Animal 类和一个继承自 Animal 的 Dog 类。使用 is 操作符检查 dog 实例是否是 Animal 类的子类,并使用 as? 操作符尝试将 Animal 实例转换为 Dog 实例。最后,使用 as! 操作符强制将 Animal 实例转换为 Dog 实例(如果尝试转换一个非 Dog 实例,则会引发运行时错误)