Swift中switch强大的模式匹配

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

switch(mode){
case(let name,let age) where age < 100:
    print("\(name)\(age) is very young!!!")
case(_,let age) where age < 150:
    print("Ta‘s age is \(age) somewhat old!!!")
default:
    print("hehe...")
}
时间: 2024-11-04 15:20:51

Swift中switch强大的模式匹配的相关文章

Swift中Switch的学习

switch的简单使用: 相比 C 和 objective - C 中的 switch 语句,Swift 中的 switch 语句不会默认的掉落到每个 case 的下面进入 另一个 case.相反,第一个匹配的 switch 语句当第一个匹配的 case 一完成, 就完成了它整个的执行.而不需 要一个明确的 break 语句.这使得 switch 语句比在 C 语言中使用更安全.更简单,并避免错误地执行多个 case. 从例子学习: let anotherCharacter :Character

Swift 中的开关语句switch在swift中的使用

在swift 中使用switch 开关语句在进行匹配的时候不需要在匹配成功的地方加上break了,在swift中它会自动在匹配成功的地方跳出去.不会在向下面执行 example: “let vegetable = "red pepper"switch vegetable {case "celery": let vegetableComment = "Add some raisins and make ants on a log."case &qu

Swift 中枚举

Swift 中枚举高级用法及实践 字数11017 阅读479 评论0 喜欢20 title: "Swift 中枚举高级用法及实践"date: 2015-11-20tags: [APPVENTURE]categories: [Swift 进阶]permalink: advanced-practical-enum-examples 原文链接=http://appventure.me/2015/10/17/advanced-practical-enum-examples/作者=Benedik

如何模块化swift中的状态?

本文和大家分享的主要是模块化swift中状态相关内容,一起来看看吧,希望对大家学习swift有所帮助. 在构建应用或设计系统的时候,最困难的事情之一就是如何建模并处理状态.当应用的某些部分处于我们意料之外的状态时,管理状态的代码也是一个非常常见的 bug 来源. 这周,让我们看一看能更容易处理并响应状态改变的编码技术 - 让代码更加强壮,不容易出错.在本文中,我不会讨论具体的框架或者更大的应用程序架构范围的更改(比如 RxSwift.ReSwift 或者使用 ELM 风格的架构,我会在之后讨论它

[译] 探究 Swift 中的 Futures &amp; Promises

原文地址:Under the hood of Futures & Promises in Swift 原文作者:John Sundell 译者:oOatuo 校对者:Kangkang, Richard_Lee 探究 Swift 中的 Futures & Promises 异步编程可以说是构建大多数应用程序最困难的部分之一.无论是处理后台任务,例如网络请求,在多个线程中并行执行重操作,还是延迟执行代码,这些任务往往会中断,并使我们很难调试问题. 正因为如此,许多解决方案都是为了解决上述问题而

Swift 中范围和区间如何使用?

虽然现在swift语言已经发展到了2.0版了,但是相信很多学习iOS开发的童鞋仍对swift语言存在各种各样的疑问,今天小编将为大家详细介绍swift中的范围和区间,下面我们一起来看看吧. Ranges 在swift语言中,范围是用 Range 类型表达的,一个范围就是一个索引集合. 其中,值得注意的是Range在标准库中使用很频繁,特别是处在集合的上下文当中时.当我们查看 Range 定义时,范围和集合之间的紧密关系一目了然: struct Range<Element : ForwardInd

Swift中的错误处理

前言 任何代码都会发生错误,这些错误有些是可以补救的,有些则只能让程序崩溃.良好的错误处理能够让你的代码健壮性提高,提高程序的稳定性. 本文的Swift版本:Swift 3 Objective C 返回nil 如果出错了,就返回空是Objective C中的一种常见的处理方式.因为在Objective C中,向nil发送消息是安全的.比如: - (instancetype)init { self = [super init]; if (self) { } //如果初始化失败,会返回nil ret

Swift 中的利刃,函数和闭包

input[type="date"].form-control,.input-group-sm>input[type="date"].input-group-addon,.input-group-sm>.input-group-btn>input[type="date"].btn,input[type="time"].input-sm,.form-horizontal .form-group-sm input

Swift中的HTTP请求

iOS开发中大部分App的网络数据交换是基于HTTP协议的.本文将简单介绍在Swift中使用HTTP进行网络请求的几种方法. 注意:网络请求完成后会获得一个NSData类型的返回数据,如果数据格式为JSON,那么可以使用系统自带的NSJSONSerialization类来解析数据:或者使用SwiftyJSON库的使用和思考一文中提到的JSON解析库来解析数据. 1. 使用NSURLConnection 下面例子使用NSURLConnection实现了一个简单的异步GET操作: func requ