美文网首页
Swift笔记:模式和模式匹配

Swift笔记:模式和模式匹配

作者: Oceanj | 来源:发表于2021-02-18 21:20 被阅读0次

    通配符模式

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

    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
    }
    

    相关文章

      网友评论

          本文标题:Swift笔记:模式和模式匹配

          本文链接:https://www.haomeiwen.com/subject/exbnxltx.html