通配符模式
通配符模式用一个_ 下划线匹配或忽略任何字符
gurad let _ = someOptionVal else { return }
for let _ in items {
// do some thing
}
标识符模式
标识符模式可以匹配任何值,并将匹配的值和一个变量或常量绑定起来。
let someVal = 30
值绑定模式
值绑定模式把匹配到的值绑定给一个常量或变量。
let p = (3, 2)
switch p {
case let (x, y):
print(x, y)
}
如上面的代码,将p的两个值分别绑定到x和y
元组模式
- 元组模式匹配对应的元组内的值,如上面那段代码;
- 可以使用类型标注限制匹配的值得类型;如 let (x, y): (Int, Int) = (1,2),中 限定匹配到的元组的每个元素类型必须是Int。
- 当元组模式被用于forin语句或变量或常量声明时,它仅可以包含通配符模式,标识符模式,可选模式,或者其他包含这些模式的元组模式。
for (x, 0) in points where y == 0 {
}
上面的代码是错误的,应该写成这样:
for (x, y) in points where y == 0 {
}
枚举用例模式
匹配现有某个枚举的某个用例 一般用case 开头。case语句不仅可以出现在switch语句中,还可以出现在if while guard for-in语句中。
可选项模式
- 匹配Optional<Wrapped>枚举在some(Wrapped)中包装的值。
let a: Int? = 40
if case .some(let x) = a {
print(x)
}
// or
if case let x? = a {
print(x)
}
- 可选模式为forin语句提供迭代数组简便方式,过滤数组中的nil 元素。
let arrays = [nil,1,3, nil, 4]
// 只打印值为非nil的元素。
for case let number? in arrays {
print(number)
}
类型转换模式
有两种 is 和 as。 is只出现在switch中的case 标签中,is和as模式形式如下:
is 类型
is没有返回类型,as如果匹配成功则返回as值右边的类型
模式 as 类型
for let animal in animals {
switch animal {
case let dog as Dog:
print(dog.name)
case is Bird:
print("")
default:
break
}
}
表达式模式
表达式模式代表表达式的值。表达式模式只出现在switch语句中的case标签中。
表达式模式代表的表达式会使用swift标准库中的=运算符与输入表达式的值进行比较,如果=运算符返回true,则匹配成功。默认情况下,~=运算符使用==运算符来比较两个相同类型的值。它也可以将一个整形数值与一个Range实例中的一段整数区间做匹配。
let point = (1, 2)
switch point {
case (0,0):
print("orign.")
case (-2...2, -2...2):
print(point.0, point.1)
default:
print("")
}
可以重载~=来提供自定义的表达式匹配行为。
func ~= (pattern: String, value: Int) -> Bool {
return pattern == "\(value)"
}
switch point {
case ("0", "0"):
print("(0,0) is at the origin.")
default:
print(point.0, point.1)
}
自定义类型默认是无法进行表达式模式匹配的,也需要重载~= 运算符。
struct Employee {
var salary: Float
}
let e = Employee(salary: 9999)
func ~=(lhs: Range<Float>, rhs: Employee) -> Bool {
return lhs.contains(rhs.salary)
}
switch e {
case 0.0..<1000:
print("艰难生活")
case 1000..<5000:
print("小康社会")
case 5000..<10000:
print("获得很滋润")
default:
break
}
网友评论