📜  Swift-类型转换(1)

📅  最后修改于: 2023-12-03 15:20:25.328000             🧑  作者: Mango

Swift-类型转换

介绍

在 Swift 中,类型转换可以判断实例的类型而同时可以直接改变它的类型,这样可以让你按照你的需要去使用它。 Swift 中类型转换的形式有三种:

1.定义类层次

类型转换的第一步是要定义类层次结构,也就是说需要有父类和子类的概念,如:

class Animal {
    var name: String
    init(name: String){
        self.name = name
    }
    func speak() {
        print("Animal speaks")
    }
}

class Dog: Animal {
    func bark() {
        print("\(name) barks")
    }
}

class Cat: Animal {
    func meow() {
        print("\(name) meows")
    }
}

以上,我们定义了一个基类 Animal 和两个子类 Dog 和 Cat。其中,Dog 类和 Cat 类继承自 Animal 类。

2.is 和 as 操作符

使用类型检查操作符 is 来检查一个实例是否属于特定的子类型。如果是,is 返回 true,否则返回 false。

let animals = [Dog(name: "Jack"), Cat(name: "Zoe"), Animal(name: "Jerry")]

for animal in animals {
    if animal is Dog {
        print("\(animal.name) is a dog")
    } else if animal is Cat {
        print("\(animal.name) is a cat")
    } else {
        print("\(animal.name) is not a dog or a cat")
    }
}

以上,我们使用了 is 操作符来检测 animals 数组中的每个元素是否为 Dog 类型或 Cat 类型。

as 操作符用来像下转型(downcast)操作符。使用时,as 操作符的左边是一个实例,右边是一个目标类或者一个目标协议的类型。

如果试图下转一个不正确的类型,运行时就会抛出一个运行时错误。

let dog = Dog(name: "Jack")
let animal = dog as Animal // Upcasting
let puppy = animal as? Dog // Downcasting

print(animal.name) // Jack
print(puppy?.name) // Jack

以上,我们使用 as 操作符来将 Dog 实例转换成 Animal 实例,又将 Animal 实例转换成转换回 Dog 实例。

在上面的例子中,我们将实例 dog 转换成 Animal 实例进行了上转型(upcasting),因为 Dog 是 Animal 的子类。又将 Animal 实例转换成 Dog 实例进行了下转型(downcasting),因为我们知道这个实例实际上是一个 Dog 实例。

需要注意的是,下转型可能会失败,比如当实例并不是一个你希望的子类型时。由于下转型可能会失败,as 的形式有两种:

  • 强制下转型操作符(as!)
  • 条件下转型操作符(as?)

强制下转型操作符将试图转换成真实类型。如果转换失败,会抛出一个运行时错误。

条件下转型操作符,使用时只会试图转换成真实类型,它会返回一个可选值(optional)。当试图转换的实例不是类型时,它返回 nil。

3.Any 和 AnyObject 的类型转换

Swift 提供两种特殊的类型别名:

  • AnyObject 可以代表任何 class 类型的实例。
  • Any 可以代表任何类型,包括方法类型(function types)。

当我们不知道对象是什么类型的时候,可以使用 Any 或 AnyObject。

var things = [Any]()
things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things.append("hello")
things.append((3.0, 5.0))
things.append(Dog(name: "Jack"))

for thing in things {
    switch thing {
    case 0 as Int:
        print("zero as an Int")
    case 0 as Double:
        print("zero as a Double")
    case let someInt as Int:
        print("an integer value of \(someInt)")
    case let someDouble as Double where someDouble > 0:
        print("a positive double value of \(someDouble)")
    case is Double:
        print("some other double value that I don't want to print")
    case let someString as String:
        print("a string value of \"\(someString)\"")
    case let (x, y) as (Double, Double):
        print("an (x, y) point at \(x), \(y)")
    case let dog as Dog:
        print("a dog named \(dog.name)")
    default:
        print("something else")
    }
}

以上,我们定义了一个数组 things,包含了多种类型的值。然后我们通过 switch 语句判断 things 中的每个元素的类型,并输出相应的信息。

总结

通过本文,我们知道了 Swift 中的类型转换的形式有三种:

  • 定义类层次
  • 使用 is 和 as 操作符
  • 使用 Any 和 AnyObject 的类型转换

对于类型转换,我们需要知道:

  • 强制下转型操作符(as!)可能会失败,会抛出一个运行时错误。
  • 条件下转型操作符(as?)返回一个可选值(optional),当试图转换的实例不是类型时,它返回 nil。