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

沒故事的卓同學發表於2019-03-31

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]+"#
複製程式碼

參考連結:

相關文章