Swift 5.1 之类型转换与模式匹配的教程详解

2020-05-29 11:00:27于海丽

类型转换在Swift中使用 isas 操作符实现。

类型检查

使用操作符 is 检查一个实例是否是某个确定的类以及其继承体系的父类或子类类型。如果是某个确定的类(该类继承体系的父类或子类)类型,则返回 true ,否则返回 false

class Cat {
 func hairColor() -> String {
  return "五颜六色"
 }
}
class WhiteCat: Cat {
 override func hairColor() -> String {
  return "白色"
 }
}
class BlackCat: Cat {
 override func hairColor() -> String {
  return "黑色"
 }
}
//必须符合`Cat`类以及其子类,类型推断需要
let kinds = [WhiteCat(),BlackCat(),WhiteCat(),WhiteCat()]
for item in kinds {
 if item is WhiteCat {
  print("白猫")//!< 3次
 }
 if item is BlackCat {
  print("黑猫")//!< 1次
 }
 if item is Cat {
  print("猫")//!< 4次
 }
}

向下转换

某个类类型的常量或变量实际上可能是其子类的实例。这种情况下,我们会用到类型转换操作符( as?as! )向下转换为子类类型。

as? :类型转换的条件形式,向下转换为某个类型时,返回该类型的可选值,即:转换失败时返回 nil 。使用场景:向下转换可能会失败的情况。

as! :类型转换的强制形式,向下转换为某个类型时,会进行强制解包,即:转换失败时触发运行时错误。使用场景:向下转换确定不会失败

//必须符合`Cat`类以及其子类,类型推断需要
let kinds = [WhiteCat(),BlackCat(),WhiteCat(),WhiteCat()]
for item in kinds {
 if let white = item as? WhiteCat {
  print("毛发:(white.hairColor())")
 }
 if let black = item as? BlackCat {
  print("毛发:(black.hairColor())")
 }
}

下述内容总结自 苹果官方博客:

Swift 1.2之前 as 运算符可以执行两种不同类型的转换:保证转换和强制转换。

保证转换:保证将一种类型的值转换为另一种类型,这种保证由编译器编译时验证。

例如:

• 向上转换(Upcasting),将当前类型的值转换为该类型的父类之一。

• 指定数字的类型: let num = 6 as Float

**强制转换:**强制将一种类型的值转换为另一种类型,这种转换编译器无法保证安全性,并且可能触发运行时错误。

例如:上述的向下转换(Downcasting),将一种类型的值转换为其子类之一。 在Swift 1.2之后保证转换仍然使用 as 操作符,但强制转换使用 as! 操作符。

AnyAnyObject 的类型转换

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

any
AnyObject

在某些使用 any