美文网首页
模式匹配

模式匹配

作者: 纳兰沫 | 来源:发表于2019-09-25 17:17 被阅读0次

模式

模式是用来匹配的规则 如case 捕捉错误的catch if/guard/while/for 语句的条件等

模式类型

1.通配符模式 
2.标识符模式
3.值绑定模式
4.元祖模式
5.枚举case模式 
6.可选模式
7.类型转换模式
8.表达式模式

通配符模式

_ 匹配任何值
_? 匹配非nil值
enum Life {
    case human(name: String, age: Int?)
    case animal(nam: String, age: Int?)
}

func  check(_ life: Life){
    switch life {
    case .human(let name, _):
        print(name)
    case .animal(let name, _?):
        print(name)
    default:
        print("other")
    }
}

标识符模式

给对应的常量 变量名赋值

值绑定模式

E1DD75A3-566D-47D2-A9DC-22EFCC938DB7.png

元组模式

let point = [(0,0),(1,0)]
for (x, _) in point {
    print(x)
}
let name: String? = "jack"
let age = 18
let info: Any = [1,2]
switch (name,age,info) {

case (_?, _, _ as String):
    print("case")
default:
    print("default")
}

枚举case模式

if case 等价于只有一个case的switch语句
case 匹配的意思

let age = 2
if case 0...9 = age {
     print("[0,9]")
}
let age = 2
func test() {
    guard case 0...9 = age else { return }
    print("[0,9]")
}
test()

let ages: [Int?] = [2,3,nil,5]
for case nil in ages {
    print("有nil值")
    break
}

有nil值
let points = [(1,0),(2,1),(3,0)]
for case let (x, 0) in points {
    print(x)
}

1
3

可选模式

可选类型是枚举 只有2个case some none

let age: Int? = 42
if case .some(let x) = age {
    print(x)
}
if case let x? = age {
    print(x)
}

类型转换模式

let num: Any = 6
switch num {
case is Int:
    print("Int")
case let n as Int:
   print("Int")
default:
    break
}

is Int 判断是否为Int类型 as是强转 但是 只是影响的n的类型 num的类型是不会改变的

表达式模式

表达式模式用在case中

通过重载运算符 自定义表达式模式的匹配规则 也就是~=
自定义表达式模式

struct Student {
    
    var score = 0, name = ""
    //pattern case后面的内容
    //value   switch后面的内容
    static func ~= (pattern: Int, value: Student) -> Bool {
         return value.score >= pattern
    }
    static func ~= (pattern: Range<Int>, value: Student) -> Bool {
        return pattern.contains(value.score)
    }
    static func ~= (pattern: ClosedRange<Int>, value: Student) -> Bool {
        return pattern.contains(value.score)
    }
}

var stu = Student(score: 75, name: "Jack")
switch stu {
    
case 100: print(">= 100")
case 90:  print(">= 90")
case 80 ..< 90:  print("[80,90]")
case 60 ...bbnnhnnn79:  print("[60,79]")
case 0:  print(">= 0")
default:  break
}
var info = (Student(score: 70, name: "Jack"), "及格")
switch info {
case let (60, text):
    print(text)
default:
    break
}

及格
3C7DF87B-7EB2-4547-ACD3-0658969E590A.png
func isEven(_ i: Int) -> Bool {
    return i % 2 == 0
}

func isOdd(_ i: Int) -> Bool {
    return i % 2 != 0
}


extension Int {
    
    static func ~= (pattern: (Int) -> Bool, value: Int) -> Bool {
        return pattern(value)
    }
}

var age = 8
switch age {
case isEven:
    print("偶数")
case isOdd:
    print("急数")
default:
    break
}

偶数
prefix operator >=

extension Int {

    static func ~= (pattern: (Int) -> Bool, value: Int) -> Bool {
        return pattern(value)
    }
    //>= 系统定义的时候是中缀运算符 要把他强制定义为前缀运算符 需要prefix operator >= 这样定义
    //但是 如此设置 有可能会对其他地方产生影响
    prefix static func >= (value: Int) -> (Int) -> Bool {
        
        return { $0 >= value }
    }
}
prefix operator ~>
prefix operator ~>=
prefix operator ~<
prefix operator ~<=

prefix func ~> (_ i: Int) -> ((Int) -> Bool) {
    return { $0 > i}
}

prefix func ~>= (_ i: Int) -> ((Int) -> Bool) {
    return { $0 >= i}
}

prefix func ~< (_ i: Int) -> ((Int) -> Bool) {
    return { $0 < i}
}

prefix func ~<= (_ i: Int) -> ((Int) -> Bool) {
    return { $0 <= i}
}

extension Int {
    
    static func ~= (pattern: (Int) -> Bool, value: Int) -> Bool {
        return pattern(value)
    }
  
}


var age = 9
switch age {
case ~>=0,~<=10:
    print("1")
case ~>10,~<20:
    print("2")
default:
    break
}

where

可以使用where为模式匹配增加匹配条件

相关文章

  • 模式匹配

    模式匹配之字符串 模式匹配之匹配类型 模式匹配之匹配数组、元组、集合 模式匹配之样例类 模式匹配之偏函数

  • 多模式串匹配 - AC 自动机

    多模式串匹配概念 多模式串匹配,即多个模式串在一个主串中进行匹配。 虽然单模式串也能完成多模式串的匹配,但每个模式...

  • Scala模式匹配

    模式匹配match 模式匹配不仅可以匹配值(case 1)还可以匹配类型(case s:String) 匹配过程有...

  • 正则表达式懒惰型元字符匹配 ?

    懒惰匹配模式即表示以最少的匹配量返回匹配个数,默认是非懒惰匹配模式 表达式 匹配结果:

  • scala 模式匹配的几个模式

    Scala 的模式匹配是类似与正则匹配的的模式匹配,但是不仅仅如此,它还可以匹配对象的内在的构建形式. 模式匹配就...

  • 模式匹配

    模式匹配 sql模式匹配允许使用"_"匹配任何单个字符,"%"匹配任意数目字符(包括零字符)。使用sql模式时,不...

  • Scala中的模式匹配

    简单匹配 模式匹配常用于match语句: 变量使用 模式匹配case中可以使用变量来获取参数值 类型匹配 守卫匹配...

  • web开发常识

    .gitignore规则 匹配模式前 / 代表项目的根目录 匹配模式最后加 / 代表是目录 匹配模式前加!代表取反...

  • 模式匹配

    模式 模式类型 通配符模式 _ 匹配任何值 _? 匹配非nil值 标识符模式 值绑定模式 元组模式 枚举case模...

  • Swift-模式匹配

    模式就是匹配的规则,下面介绍Swift中的模式。 1. 通配符模式 _匹配任何值,_?匹配非nil值。 2. 标识...

网友评论

      本文标题:模式匹配

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