AnyObject 的特殊场景下,对于 Any 和 AnyObject 表示的实例,需要运用类型转换模式,值绑定模式,表达式模式等模式匹配的知识。所以我们先介绍下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("未匹配到")
}
}








