技术控

    今日:6| 主题:49136
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] Swift 模式匹配学习笔记1

[复制链接]
沧桑 发表于 2016-10-1 23:42:36
99 0

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Swift 中的模式匹配语法是 Swift 语言中的亮点,对于习惯使用传统的    switch-case和枚举类型语法的程序员来讲,会有耳目一新的感觉。今天先来看看,苹果官方文档关于模式匹配都讲了些啥。  
  官方文档中语言参考部分,专门有一个章节讲了模式(Patterns)在 Swift 中的定义和使用。是从语言的顶层设计角度来展开的,每个模式的分类都会对应不同的语法点。解释分类的时候会涉及到。先把相关链接贴出来,然后再来记录主要内容:
  
       
  •       模式官方英文   
  •       模式中文翻译  
  总体来讲,这部分内容有点正则表达式的味道,更准确的讲应该是模式匹配,因为没有涉及太多的正则表达式的语法,把一些简单的匹配融入到了具体的语法当中,官方文档列出了 swift 中所有的模式:
  
       
  • 通配符模式(Wildcard Pattern)   
  • 标识符模式(Identifier Pattern)   
  • 值绑定模式(Value-Binding Pattern)   
  • 元组模式(Tuple Pattern)   
  • 枚举用例模式(Enumeration Case Pattern)   
  • 可选模式(Optional Pattern)   
  • 类型转换模式(Type-Casting Pattern)   
  • 表达式模式(Expression Pattern)  
  接下来简单记录一下每个模式的含义:
  
       
  •         通配符模式(Wildcard Pattern)
            如果你在 Swift 编码中使用了          _通配符,就可以表示你使用了通配符模式。          _用于匹配并忽略任何值。比如在 for 循环中,不需要使用循环的当前值的时候:        
                                 
    1. for _ in 1..<3 {        // do something without index}
    复制代码
       
  •       标识符模式(Identifier Pattern)
      
  定义变量或者常量时候,可以认为变量名和常量名就是一个标识符模式,用于接收和匹配一个特定类型的值:
           
  1. let i = 21 // i 就是一个标识符模式
复制代码
      
       
  • 值绑定模式(Value-Binding Pattern)  
  值绑定在    if语句和    switch语句中用的较多。 比如    if let和    case let, 还有可能是    case var。 let 和 var 分别对应绑定为常量和变量。  
           
  1. var str: String? = "test"if let v = str {        // use v to do something}
复制代码
      
       
  •         元组模式(Tuple Pattern)
            顾名思义,元组模式就是匹配元组中元素的模式:
                                 
    1. let person = ("Helen", 25) switch person {        case ("Helen", let age):            print("Your name is Helen, and you are \(age)" + " years old")        case (_, 13...19):            print("You are a teenager")        case ("Bob", _):            print("You are not a teenager, but your name" + " is Bob.")        case (_, _):            print("no comment")}
    复制代码

  但是在 for-in 语句中,由于每次循环都需要明确匹配到具体的值,所以以下代码是错误的:
           
  1. let points = [(0, 0), (1, 0), (1, 1), (2, 0), (2, 1)] // 下面的代码是错误的for (x, 0) in points {    /* ... */}
复制代码
       需要使用一个另外一个值绑定模式,来达成以上的逻辑:
           
  1. for (x, y) in points {    if(y == 0) {        print(x)    }}
复制代码
      
       
  •       枚举用例模式(Enumeration Case Pattern)
          枚举用例模式是功能最强大的一个模式,也是整个模式匹配当中,应用面最广的模式,结合枚举中的关联值语法,可以做很多事情。先看一个简单的例子:
                           
    1. enum ParseResult {   case NumericValue(Int)   case Error(String) } let a = ParseResult.NumericValue(1) switch a { case let .NumericValue(v):   "Success; numeric value is \(v)"case .Error(let err):   "Failed; error message is \(err)"}
    复制代码

  
       
  •       可选模式(Optional Pattern)
          可选模式就是包含可选变量定义模式,在 if case、 for case、 switch-case 会用到。注意        if case let和        if let的区别:      
                           
    1. // 使用可选模式匹配if case let x? = someOptional {    print(x)}        let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]// 只匹配非 nil 的元素for case let number? in arrayOfOptinalInts {    print("Found a \(number)")}// Found a 2// Found a 3// Found a 5
    复制代码

  
       
  •       类型转换模式(Type-Casting Pattern)
          使用        is和        as关键字的模式,就叫类型转换模式:      
      
           
  1. let i: Any = 1switch i {    case let i as Int:        print("is a int")    case let i as String:        print("is a int")    default:        print("is another type")}
复制代码
      
       
  • 表达式模式(Expression Pattern)  
  表达式模式只出现在 switch-case 中,Swift 使用标准库中的    ~=运算符与输入值进行比较。如果    ~=返回true,则匹配成功。  
           
  1. let point = (1, 2)switch point {case (0, 0):    print("(0, 0) is at the origin.")case (-2...2, -2...2):    print("(\(point.0), \(point.1)) is near the origin.")default:    print("The point is at (\(point.0), \(point.1)).")}// 打印 “(1, 2) is near the origin.”
复制代码
       你还可以自定义    ~=运算符,自定义类型的表达式匹配行为:  
           
  1. let i = 21 // i 就是一个标识符模式0
复制代码
友荐云推荐




上一篇:温故js系列(16)-数组&数组方法使用详解
下一篇:Test NLP-as-a-service providers with Bunt
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表