Swift有下面这些模式:
通配符模式(Wildcard Pattern)、标识符模式(Identifier Pattern)、值绑定模式(Value-Binding Pattern)、元组模式(Tuple Pattern)
、枚举用例模式(Enumeration Case Pattern)、可选项模式(Optional Pattern)、类型转换模式(Type-Casing Pattern)、表达式模式(Expression Pattern)
简单的介绍一些这些模式吧
!!!!!!!!!!!! !
通配符模式:由一个下划线构成 ( _ ),用于匹配并忽略调任何值。
举例:
for _ in 1...3 {
print("看一下结果")
}
标识符模式:标识符模式匹配任何值,并将匹配的值和一个变量或常量绑定起来。
举例:
let numT: UInt = 5
var length: String = 8
值绑定模式:把匹配到的值绑定给一个常量或变量。
举例:
let point = (3,2)
switch point {
// 将point中的元素绑定到x和y
case let (x,y):
print("x is \(x),y is \(y)")
default:
print("默认选项")
}
元组模式:元组模式由逗号分隔,具有零个或多个模式的列表,并由一对圆括号括起来。
举例:(3,2)
枚举用例模式:匹配现有的某个枚举的某个用例。枚举用例模式出现在switch语句中的case标签中,以及if、while、guard和for-in语句的case条件中。
public enum AnimationTransition : Int {
case none
case flipFromLeft
case flipFromRight
case curlUp
case curlDown
}
可选项模式:可选项用 ?表示,可选项模式为for-in语句提供了一种迭代数组的简便方式,只为数组中非nil的元素执行循环体
举例:
let arr: [Int?] = [nil,5,8,0,nil,7]
for case let num? in arr {
print(num)
}
类型转换模式:有两种类型转换模式,is模式和as模式。is模式只出现在switch语句中的case标签中。形式如下
is 类型:is模式仅当一个值的类型在运行时和is模式右边的指定类型一致,或者是其子类的情况下,才会匹配这个值。is模式没有返回类型
模式 as 类型:as模式仅当一个值的类型在运行时和as模式右边的指定类型一致,或者是其子类的情况下,才会匹配这个值。如果匹配成功,被匹配的值的类型
protocol Animal {
var name: String { get }
}
struct Dog: Animal {
var name: String = "dog"
var runSpeen: Int
}
struct Bird: Animal {
var name: String = "bird"
var flightHright: Int
}
struct Fish: Animal {
var name: String = "fish"
var depth: Int
}
let animals:[Any] = [Dog(name: "Tydi", runSpeen: 5),Bird(flightHright: 8),Fish(depth: 9)]
for animal in animals {
switch animal {
case let dog as Dog:
print("name:\(dog.name),跑得快\(dog.runSpeen)")
case let bird as Bird:
print("name is \(bird.name)")
default:
print("未知种类\(animal)")
}
}
表达式模式:表达式的值,只出现在switch语句的case标签中。表达式模式代表的表达式会使用~=运算符与输入表达式的值进行比较。~=运算符可以查看一个范围是否包含某个值,如果~=运算符返回true,则匹配成功。
举例:
let point = (2,3)
switch point {
case (0,0):
print("原点")
case (-2...2,-3...3):
print("离原点较近")
default:
print("X坐标\(point.0)Y坐标\(point.1)")
}
自定义类型无法进行表达式模式匹配,需要重载~=运算符
举例:
struct Employee {
var salary: Int
}
let A = Employee(salary: 450)
func ~=(left:Range<Int>,right:Employee) -> Bool {
return left.contains(right.salary)
}
switch A {
case 0..<200:
print("艰难生活")
case 200..<400:
print("还不错")
case 400..<500:
print("美滋滋")
default:
print("未知情况")
}