模式代表单个值或者复合值的结构
Swift 中的模式分为两类:一种能成功匹配任何类型的值,另一种在运行时匹配某个特定值时可能会失败。
第一类模式用于解构简单变量、常量和可选绑定中的值。此类模式包括通配符模式、标识符模式,以及包含前两种模式的值绑定模式和元组模式。可以为这类模式指定一个类型标注,从而限制它们只能匹配某种特定类型的值。
第二类模式用于全模式匹配,这种情况下试图匹配的值在运行时可能不存在。此类模式包括枚举用例模式、可选模式、表达式模式和类型转换模式。在switch 语句的case标签中,do 语句的catch子句中,或者在if、while、guard和for-in语句的case条件句中使用这类模式。
let someNumber:Int? = 10
if case .some(let x) = someNumber {
/* some 关键字在 Swift 5.1版本 中被引入,定义为一个 不透明类型 。 不透明类型是一种而无需提供具体类型的返回类型。 限制调用者需要了解的有关返回类型的信息,仅仅公开有关其协议遵从性的信息。
*/
print(x)
}
if case let x? = someNumber {
print(x)
}
---------------------------------------------------------
protocol Animal{
var name: String { get }
}
struct Dog:Animal {
var name: String{
return "dog"
}
var runSpeed:Int
}
struct Bird:Animal {
var name: String{
return "bird"
}
var flightHeight:Int
}
struct Fish:Animal {
var name: String{
return "fish"
}
var depth:Int
}
let animals:[Any] = [Dog(runSpeed: 40),Bird(flightHeight: 9000),Fish(depth: 200)]
for animal in animals{
switch animal{
case let dog as Dog:
print("\(dog.name) run at \(dog.runSpeed)")
case let fish as Fish:
print("\(fish.name) run at \(fish.depth)")
case is Bird:
print("bird can fly")
default:
break
}
}
print:
dog run at 40
bird can fly
fish run at 200
---------------------------------------------
struct Employee{
var salary :Int
}
func ~= (left:ClosedRange<Int>,right:Employee) -> Bool{
return left.contains(right.salary)
}
var e:Employee = Employee(salary: 2000)
switch e{
case 0...1000:
print("吃不饱")
case 1000...5000:
print("勉强度日")
case 5000...10000:
print("还不错")
default:
print("高薪阶层")
}
print:勉强度日