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

2020-05-29 11:00:27于海丽
AnyObject 的特殊场景下,对于 AnyAnyObject 表示的实例,需要运用类型转换模式,值绑定模式,表达式模式等模式匹配的知识。所以我们先介绍下Swift中的模式。

类型转换模式

类型转换有两种模式: is 模式和 as 模式。 is 模式仅在 switch 语句的 case 标签中使用。 is 模式和 as 模式有如下形式:

 

is <#Type#>
//pattern:代表此处也需要一个模式
<#pattern#> as <#Type#>

is 模式: 如果运行时值的类型与 is 模式右侧指定的类型或该类型的子类相同,则 is 模式会匹配到这个值。此行为很适用 switch 语句的 case 场景。 is 模式的行为类似于 is 运算符,因为它们都执行类型转换但类型转换后丢弃了返回的类型。

as 模式: 如果在运行时值的类型与 as 模式右侧指定的类型或该类型的子类相同,则 as 模式会匹配到这个值。如果匹配成功,则会将匹配到的值的类型将转换为 as 模式右侧指定的类型。

值绑定模式

值绑定模式将匹配到的值绑定到变量或常量。 将匹配到的值绑定到常量,绑定模式以let关键字开头;绑定到变量以var关键字开头。

let point = (3,2)
switch point {
case let(x,y):
 //值绑定模式匹配到的X值:3,Y值:2
 print("值绑定模式匹配到的X值:(x),Y值:(y)")
}

通配符模式

通配符模式匹配并忽略任何值,并由下划线 _ 表示。

for _ in 1...9 {
 print("通配符模式")
}

标识符模式

标识符模式匹配任何值,并将匹配的值绑定到变量或常量的名称。

let someValue = 42

someValue 是一个与 Int 类型的值 42 匹配的标识符模式。匹配成功, 42 将被赋值给常量 someValue 。 当变量或常量声明的左侧的模式是标识符模式时,标识符模式隐式地是值绑定模式的子模式。 ####元组模式 元组模式是以逗号分隔的零个或多个元素列表,括在括号中。元组模式匹配相应元组类型的值。

包含单个元素的元组模式周围的括号无效。该模式匹配该单个元素类型的值。所以下面写法是等效的:

let a = 2  // a: Int = 2
let (a) = 2  // a: Int = 2
let (a): Int = 2 // a: Int = 2

枚举 Case 模式

枚举 Case 模式匹配现有枚举中存在 case 。枚举 Case 模式出现在 switch 语句的case标签中以及 if , while ,  guard , for - in 语句中。

如果尝试匹配的枚举 case 具有关联值,则相应的枚举 Case 模式必须指定与每个关联值对应的元组。

enum VendingMachineError {
 case InvalidGoods//!< 商品无效
 case StockInsufficient//!< 库存不足
 case CoinInsufficient(coinNeeded:Int,caseDes:String)
}
let enumArray = [VendingMachineType.CoinInsufficient(coinNeeded: 4, caseDes: "自动售货机,硬币不足,请补充"),
     .InvalidGoods,
     .StockInsufficient,
     .CoinInsufficient(coinNeeded: 6, caseDes: "自动售货机,硬币不足,超过限额")]
for patternCase in enumArray {
 switch patternCase {
 case .CoinInsufficient(coinNeeded: let x, caseDes: let y) where x > 5:
  print(x,y)
 case let .CoinInsufficient(coinNeeded: x, caseDes: y):
  print(x,y)
 case .InvalidGoods:
  print("商品无效")
 default:
  print("未匹配到")
 }
}