模式匹配

通配符模式

通配符就是 _ 可以匹配任何值,_?匹配非nil

enum Life {
    case human(name:String,age:Int?)
    case animal(name:String,age:Int?)
}
let l1 = Life.human(name: "人", age: 10)
let l2 = Life.human(name: "人1", age: nil)
let l3 = Life.animal(name: "猫", age: 3)
let l4 = Life.animal(name: "狗", age: nil)
func check(_ life:Life)
{
    switch life {
    case .human(let name,_):
        print(name)
    case .animal(let name,_?):
        print(name)
    default:
        print("不知道是什么品种")
    }
}
check(l1)  //人
check(l2)  //人1
check(l3)  //猫
check(l4)  //不知道是什么品种

上面代码可以看到age传nil,则switch也匹配不到狗的信息,原因就是_?只能匹配非空

标识符模式

var name = "yokan"
var age = 10

右边是字面量,左边是标识符

值绑定模式

不多说了,上面的case就是值绑定模式,只是用了通用匹配符而已

元祖模式

let points = [(1,2),(2,3),(0,4)]
for (x,_) in points
{
    print(x)    //1
                //2
                //0
}

没啥好说的,返回值也可以这样

枚举Case模式

let num = 2
func test() {
    if case 0...9 = num
    {
        print("num在0-9之间")
    }
    
    guard case 3...9 = num else
    {
        print("num不在3-9之间")
        return
    }
}

test()

等价于0<=num<=9,同时if-case等价于switch-case

switch num
{
    case 0...9 :
        print("num在0-9之间")
    default :
        print("the other")
}

case模式还有for - case  

for case nil in [1,2,4,nil]{ print("有nil"); break}
for case let x in [1,2,4,nil]{ print(x) }

总结一句话case模式默认前面有个switch,是个浓缩版的switch

可选模式

let num:Int? = 4
let num1:Int? = nil
func test(_ x:Int?)
{
    if case let x? = x
    {
        print(x)
    }
}
test(num)    //4
test(num1)  //什么都不会输出,因为不符合

类型转换模式

let num:Any = 10
switch num {
    case is Int:
        print(num)
    default:
        print("nop")
}

判断是否Int

let num:Any = 10
switch num {
    case let x as Int:
        print(x)
    default:
        print("nop")
}

是否能转换

表达式模式

struct Stu
{
    var name:String
    var score:Int
    static func ~= (pattern:Int,stu:Stu) -> Bool
    {
        return stu.score == pattern
    }
    static func ~= (pattern:Range<Int>,stu:Stu) ->Bool
    {
        pattern.contains(stu.score)
    }
    static func ~= (pattern:ClosedRange<Int>,stu:Stu) ->Bool
    {
        pattern.contains(stu.score)
    }
}
var stu1 = Stu(name: "yokan", score: 50)
switch stu1
{
case 100:
    print("great")
case 90..<100:
    print("S")
case 80..<90:
    print("A")
case 60...79:
    print("B")
case 0..<60:
    print("不及格")
default:
    print("找不到")
}

其中pattern:Int 对应普通数字.  pattern:Range<Int>对应 ..<非闭区间  pattern:ClosedRange<Int>对应闭区间,说白了,就是把case里面的内容转交给了Struct处理,前者是case后面的值,后者是switch后面的值,这个属于自定义的表达式模式

where

where的作用就是给模式匹配再加条件

enum Stu {
    case nameScore(String,Int)
}

let stu = Stu.nameScore("yokan", 10)
switch stu
{
    case let .nameScore(name, score) where score > 10:
        print(name)
    default:
        print("找不到")
}

就像这样,加一个where在原有的匹配上再加个条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值