Swift中switch强大的模式匹配

前端之家收集整理的这篇文章主要介绍了Swift中switch强大的模式匹配前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

不少人觉得Swift中switch语句和C或C++,乃至ObjC中的差不多,此言大谬!

让本猫带领大家看一下Swift中switch语句模式匹配的威力.

所谓模式匹配就是利用一定模式(比如couple)去定制自己需要的匹配结果,比如以下一个3D空间的点坐标:

let@H_404_9@ point3D:(x:Int@H_404_9@,y:Int@H_404_9@,z:Int@H_404_9@) = (1@H_404_9@,2@H_404_9@,3@H_404_9@)

我们首先做一些简单的匹配,只是简单的比较是否等于或不等于指定的常量:

switch@H_404_9@(point3D){
case@H_404_9@ (0@H_404_9@,0@H_404_9@,0@H_404_9@):print@H_404_9@("Origin 3D"@H_404_9@)
case@H_404_9@ (1000@H_404_9@,1000@H_404_9@,1000@H_404_9@):print@H_404_9@("遥远的地方"@H_404_9@)
default@H_404_9@:print@H_404_9@("other positions"@H_404_9@)
}

以上switch的用法很一般,我们再看能不能更进一步:

switch@H_404_9@(point3D){
case@H_404_9@ (0@H_404_9@,0@H_404_9@):print@H_404_9@("The Origin"@H_404_9@)
case@H_404_9@ (_,0@H_404_9@):print@H_404_9@("On the x-axis"@H_404_9@)
case@H_404_9@ (0@H_404_9@,_,0@H_404_9@):print@H_404_9@("On the y-axis"@H_404_9@)
case@H_404_9@ (0@H_404_9@,_):print@H_404_9@("On the z-axis"@H_404_9@)
default@H_404_9@:print@H_404_9@("other positions"@H_404_9@)
}

注意以上匹配模式中的_表示我不关心对应位置的值是多少,因为第一个判断已经考虑到原点的情况,所以_不可能再为0了.

但是如果我希望能够捕获模式中对应位置的值该怎么办呢?很简单,和变量声明一样用let语句:

switch@H_404_9@(point3D){
case@H_404_9@ (let@H_404_9@ x,0@H_404_9@):
    print@H_404_9@("x is \(x)"@H_404_9@)
}

如果我还想进一步增加判断条件呢!?很简单,后面跟where子句:

switch@H_404_9@(point3D){
case@H_404_9@ (let@H_404_9@ x,let@H_404_9@ y,_) where@H_404_9@ y == x:
    print("y = x"@H_404_9@)
case@H_404_9@ (_,let@H_404_9@ z) where@H_404_9@ y = z*z:
    print("y = z^2"@H_404_9@)
default@H_404_9@:break@H_404_9@
}

我们可以按照实际需求自由改变模式,最后举一个例子:

let@H_404_9@ mode:(name:String,age:Int) = ("hopy"@H_404_9@,121@H_404_9@)

switch@H_404_9@(mode){
case@H_404_9@(let@H_404_9@ name,let@H_404_9@ age) where@H_404_9@ age < 100@H_404_9@:
    print("\(name)\(age) is very young!!!"@H_404_9@)
case@H_404_9@(_,let@H_404_9@ age) where@H_404_9@ age < 150@H_404_9@:
    print("Ta's age is \(age) somewhat old!!!"@H_404_9@)
default@H_404_9@:
    print("hehe..."@H_404_9@)
}

猜你在找的Swift相关文章