源码

首页 » 归档 » 源码 » Swift 5.0 值得关注的特性:更强大的 Raw String

Swift 5.0 值得关注的特性:更强大的 Raw String


HackingSwift: What’s new in Swift 5.0

SE200: Enhancing String Literals Delimiters to Support Raw Text 

Swift 5.0 对字符串声明增加了一个强有力的新特性,使用 # 包裹字符串。

原有方式的不足

传统的方式我们使用双引号包裹来声明字符串,如果有参数则只用 /(参数)表示。由此引发的问题是如果字符串中包含 / ” 则需要进行转义,否则格式识别会有冲突:

let qutoedString = "如果句子里面有/"双引号/"就很尴尬"
// 输出: 如果句子里面有"双引号"就很尴尬

let escapeString = "如果句子里面有//转义符号反斜杆//也很尴尬"
// 输出: 果句子里面有/转义符号反斜杆/也很尴尬

解决方案

5.0 中增加的解决方案是引入一个新的字符 # 声明字符串:

let newQutoedString = #"如果句子里面有"双引号"就很尴尬"#
// 输出: 如果句子里面有"双引号"就很尴尬

let newEscapeString = #"如果句子里面有/转义符号反斜杆/也很尴尬"#
// 输出: 果句子里面有/转义符号反斜杆/也很尴尬

如果字符串声明被 # 号包裹,字符串中的 / ” 不再需要转义了。

相对的字符串中的参数占位符也要修改为 /#(参数):

let escapeCharacter = #"/"#
let newParamString = #"如果句子里面有/#(escapeCharacter)转义符号反斜杆/#(escapeCharacter)也很尴尬"#

多行文本

在 4.0 中引入了 """ 表示多行的文本,新的方法也兼容多行文本。方式和前面类似,在 """ 前增加 #  即可:

let multiLineText = #"""
   "/"
一切正常
"""#

新的问题

使用井号表示的字符串结尾的字符是 "#,如果句子中出现了 "# 则不可避免引起歧义,所以需要一种新的方式转义。区别于传统的在需要转义的字符前加反斜杆的方式,Swift 中采用的是在将首尾的 # 替换为 ##:

let escapeHashCharacter = ##"如果刚好有个字符 "# 呵呵和结束符意义就尴尬了"##

总结

如果你刚好需要声明一个正则表达式,使用新的方案会优雅、直观很多:

let regex1 = "////[A-Z]+[A-Za-z]+//.[a-z]+"

let regex2 = #"//[A-Z]+[A-Za-z]+/.[a-z]+"#

作者:没故事的卓同学

链接:https://www.jianshu.com/p/17fab783bfad

(1)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/swift-5-0-zhideguanzhudetexinggengqiangdade-raw-string.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:4月 2, 2019 at 04:05 下午

热评文章

发表回复

[必填]

我是人?

提交后请等待三秒以免造成未提交成功和重复