前言
今年我鼓起勇气报名参加了老司机周报的“WWDC22内参“的编写的计划。
报名的session是110357和110358,都是和Swift的新框架Regex有关的。
结果计划没有变化快,很多人都报名这两个session,最后编写这个版块的文章的任务也没有分配给我TAT
不过也无所谓了,本来还有点包袱的,现在一下就没了,我会说说我对session110354、 110357、110358的理解:
-
session 110354 What's new in Swift
-
session 110357 Meet Swift Regex
-
session 110358 Swift Regex: Beyond the basics
让我们开始吧~~~
Swift 5.7的新特性(What's new in Swift)
在session110354——What's new in Swift:
从视频的23:30开始到28:45结束,短短的5分钟内,介绍了Swift5.7的一个新特性,有关于字符串的处理与加工,针对Swift的Regex框架做了一个简洁又全面的介绍。
Swift目前对String处理的现状
根据视频中的内容,其实Apple的开发工程师对于目前Swift对于字符串数据的处理也觉得并不够优雅。
天下苦秦久矣!!!
通过对字符串进行separator
、join
、map
、index
、切片
等等一系列方法对字符串进行处理而获取有效信息,并不是提取信息的有效途径。
我们需要新的方式。而这个方式其实一直都存在,那就是正则表达式——Regex。
正则表达式的优缺点
正则表达式已经存在很久,最早可以追溯到上个世纪50年代。
虽然通过编写正则表达式,可以精准的匹配到想到捕获的信息,但是!!!
写正则表达式和理解别人写的正则表达式都是一件非常困难的事情,会让人蒙圈!!!
本来程序员头发就少,再抓两下就没了。。。
虽然在Foundation中有NSRegularExpression,而专门用Swift编写处理String的正则的库,在5.7才出现。
下面我们先简单聊一聊这个的Swift Regex。
Swift Regex简介
- 通过在
/
和/
之间的这种糖语法来编写的新的Regex类型,并进行使用。
let regex = /\h*([^<#+?)??\h<([^>#]+)>\h*(?:#|\Z)/
- Apple考虑到新手写正则的困难程度,通过Swift封装的糖语法,将其进行了更加人性化的封装,真香~
传统写法 | Swift糖语法写法 |
---|---|
通过noneof("<#")
、OneOrMore
、Optionally
这些语义化的代码API,让晦涩难懂的正则表达式从阅读到理解都得到了质的提升。
- 同时Swift Regex的编写,使用类似SwiftUI中的定制DSL,通过声明式的语法,编写流畅,语义清晰。我个人感觉虽然有学习成本,但是相比较学习如何写正则表达式,这点成本不算什么。
- Apple的开发人员同时考虑到正则表达的式的可复用性,通过引入
import RegexBuilder
并让类型遵守RegexComponent
让各位编写的正则可以进行复用。
- Apple也考虑到了正则新、老手的不同的需求,在创建
regex
对的时候,在声明式的DSL中可以同时使用//
与Swift Regex内置的语法糖进行regex
的构建,非常的灵活。
Swift Regex的简单总结
-
Swift Regex的正则表达式内核是开源的,也就是说可以在GitHub的Swift项目中自行学习与贡献代码。
-
Swift Regex对于字符串的处理,是广义上的字符串处理,因为它覆盖了Unicode编码支持,这里Apple非常凡尔赛的得瑟了一把,甚至在session110357中花了很大一部分精力说明这个问题,总之大概意思就是,只要是个在Unicode中被定义的字符,Swift Regex都能进行处理。
-
Swift Regex只能在macOS 13、iOS 16、tvOS 16、watchOS 9这些系统中内置了Swift正则内核的系统中才能进行使用。
下节预告
嗯,本来我是打算一篇文章把session110354、 110357、110358的理解一口气写完的,然后发现自己的时间与精力比较零散,想要一口气吃个大胖子太困难。
于是今天先到这里。
下一篇文章我会着重说明session110357、110358,针对里面通过编写正则提取信息的API用法进行整理,同时这两个session也有我看不明白的内容,也欢迎各位指导一二。
说实话5min的视频内容,光是翻译与理解并写成文字都已经1000+了,后面两个session加起来差不多50min了,想想还是蛮可怕的。
同时,我会参考我在Python中写爬虫中使用的经验,对Python、Swift Regex以及NSRegularExpression做一些简单的类比吧。
谢谢大家。