歡迎光臨
每天分享高質量文章

Swift 5.0 值得關註的特性:更強大的 Raw String

作者:沒故事的卓同學

連結:https://www.jianshu.com/p/17fab783bfad

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]+"#

已同步到看一看
贊(0)

分享創造快樂