作者:沒故事的卓同學
連結: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]+"#
朋友會在“發現-看一看”看到你“在看”的內容