Swift 类型转换学习笔记

在 Swift 中,类型转换是指检查实例的类型或将实例视为其超类型或子类型的过程。 Swift 提供了多种用于类型转换的方法,包括类型判断运算符 is 和类型转换运算符 as。本篇笔记将介绍这些方法并且提供一些实例。

1. 检查类型

Swift 中使用 is 运算符来判断一个实例是否属于某个特定的类型。该运算符返回一个布尔值,如果实例属于该类型则返回 true,否则返回 false

示例:

swiftCopy Code
class Vehicle { var currentSpeed = 0.0 var description: String { return "traveling at \(currentSpeed) miles per hour" } } class Car: Vehicle { var gear = 1 override var description: String { return super.description + " in gear \(gear)" } } class ElectricCar: Car { var batteryLevel = 0.0 override var description: String { return super.description + ", with battery level at \(batteryLevel) %" } } let vehicles = [ ElectricCar(), Car(), Vehicle() ] for vehicle in vehicles { if vehicle is ElectricCar { print("\(vehicle.description): ElectricCar") } else if vehicle is Car { print("\(vehicle.description): Car") } else { print("\(vehicle.description): Vehicle") } }

输出结果:

Copy Code
traveling at 0.0 miles per hour, with battery level at 0.0 %: ElectricCar traveling at 0.0 miles per hour in gear 1: Car traveling at 0.0 miles per hour: Vehicle

2. 向下转型

向下转型是指将一个超类型的实例强制转换为其子类型的过程。向下转型时使用类型转换运算符 as?as!,其中 as? 会返回一个可选值,如果转换不成功则返回 nil,而 as! 则会强制进行转换,如果转换失败则会抛出运行时错误。

示例:

swiftCopy Code
let vehicles = [ ElectricCar(), Car(), Vehicle() ] for vehicle in vehicles { if let electricCar = vehicle as? ElectricCar { print("\(electricCar.description): ElectricCar") } else if let car = vehicle as? Car { print("\(car.description): Car") } else { print("\(vehicle.description): Vehicle") } }

输出结果:

Copy Code
traveling at 0.0 miles per hour, with battery level at 0.0 %: ElectricCar traveling at 0.0 miles per hour in gear 1: Car traveling at 0.0 miles per hour: Vehicle

3. 类型转换和Any、AnyObject

Swift 中也可以使用 isas 运算符来检查和转换任意类型的实例。在 Swift 中,Any 可以表示任何类型,包括函数类型,而 AnyObject 则可以表示任何类类型的实例。当使用 AnyAnyObject 时,需要注意安全性问题,应该尽可能的避免使用强制类型转换运算符 as!

示例:

swiftCopy Code
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(ElectricCar()) 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 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 electricCar as ElectricCar: print("an electric car with battery level at \(electricCar.batteryLevel) %") default: print("something else") } }

输出结果:

Copy Code
zero as an Int zero as a Double an integer value of 42 a positive double value of 3.14159 a string value of "hello" an (x, y) point at 3.0, 5.0 an electric car with battery level at 0.0 %