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]+"#
複製程式碼
參考連結: