19. 类型转换

文章目录
  1. 1. 定义一个类结构作为类型转换示例
  2. 2. 类型检查
  3. 3. 强制转型
  4. 4. 对Any和AnyObject做类型转换
  1. Defining a Class Hierarchy for Type Casting
  2. Checking Type
  3. Downcasting
  4. Type Casting for Any and AnyObject

Swift 中的类型转换是通过 is 和 as 运算符实现的。 这两个运算符提供了一种简单 而直观的方法来检查值的类型,或将值转换为其他类型。

定义一个类结构作为类型转换示例

你可以使用类型转换连同类和子类的层次结构来检查特定类的实例类型,并将该实例强制转 换为同一层次结构中的另一个类。

类型检查

使用 类型检查运算符( is )来检查实例是否属于某个特定子类型。 如果实例属于该子类型,则类型检查运算符将返回 true ,否则,将返回 false 。

强制转型

实际上某个类型的常量或变量可能本来就是某个子类的实例。当确认是这种情况情况时,你 可以尝试使用 类型强制转换运算符 ( as? 或 as! )将该常量或变量 强制转换 成子 类型。

由于强制转换可能会失败,因该类型转换运算符有两种不同的形式。条件形式 as? 会返 回你尝试强制转换的类型的可选值。强制形式 as! 则会尝试强制转换,并同时将结果强 制解包。

当你不确定强制转换是否成功时,请使用类型转换运算符的条件形式( as? )。这种形 式的运算符将始终返回一个可选值,如果无法进行强制转换,该值将为 nil 。这使得你 可以检查强制转换是否成功。
仅当你确定强制转换会始终成功时,才使用类型转换运算符的强制形式( as! )。如果 你尝试强制转换为不正确的类型,此形式的运算符将触发运行时错误。

转换实际上不会变更实例或修改其值。原本的实例保持不变;我们仅仅把它看作是它类型的实例,对其进行简单地处理和访问。

对Any和AnyObject做类型转换

Swift 提供了两种特殊的类型来处理非特定类型:

  1. Any 可以表示任何类型的实例,包括函数类型。
  2. AnyObject 可以表示任何类类型的实例。

只有在明确需要 Any 或 AnyObject 所提供的行为和功能时才使用他们。 最好在你 的代码中明确需要使用的类型。

注意
Any 类型表示任何类型的值,包括可选类型。 如果程序需要一个类型为 Any 的 值,而你却使用了可选类型,Swift 会向你发出警告。 如果你确实需要将可选值作为Any 使用,可以使用 as 操作符将可选类型显式地转换为 Any 类型,如下所 示。

1
2
let optionalNumber: Int? = 3 things.append(optionalNumber) // 警告 
things.append(optionalNumber as Any) // 没有警告