Swift笔记:模式和模式匹配

2021-02-18  本文已影响0人  Oceanj

通配符模式

通配符模式用一个_ 下划线匹配或忽略任何字符

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

元组模式

  1. 元组模式匹配对应的元组内的值,如上面那段代码;
  2. 可以使用类型标注限制匹配的值得类型;如 let (x, y): (Int, Int) = (1,2),中 限定匹配到的元组的每个元素类型必须是Int。
  3. 当元组模式被用于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语句中。

可选项模式

  1. 匹配Optional<Wrapped>枚举在some(Wrapped)中包装的值。
let a: Int? = 40
if case .some(let x) = a {
    print(x)
}
// or
if case let x? = a {
    print(x)
}
  1. 可选模式为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
}
上一篇下一篇

猜你喜欢

热点阅读