Swift5以前版本 中声明一个字符串常量的时候, 有时候会用到一些特殊字符, 比如换行, 双引号, 反斜杠等等. 这些特殊字符在输入的时候需要进行所谓的转义:

“My \”money\””

这个”money” 需要通过\来转译才能正确解析出下面的字符

My "money”

然而到了Swift 5 我们就可以直接使用下面的方式来解析
这个#号称之为定界符

#My "money”#
##” My ”money” “##

在双引号的两边各加上了两个 # 号, 那么它的左右定界符就变成了 ##” 和 “##.
再例如:

// 1. 默认双引号定界符, 字符串内的双引号需要转义
print("my #1 \"money\"")        // 输出: my #1 "app"

// 2. 自定义定界符, 加入两个 #, 双引号和定界符不再冲突, 不需转义
print(##"my #1 "money""##)      // 输出: my #1 "app"

// 3. 自定义定界符, 默认的转义符 \ 无效,原样输出
print(##"\"\n"##)      // 输出: \"\n

// 4. 自定义定界符, 使用了合规的转义符 \##, 转义
print(##"\##"\##n"##)      // 输出: "<换行>

当然作为字符串拼接变量肯定是没问题的,

let launguage = "swift"
print(#"{ var is : "\#(launguage)" }"#)

Swift5 这个称为raw string。
这个特性其他语言已经是实现了的。swift的写法更接近于rust。