单元测试中如何定义无需转义的字符串字面量用于比较?
问题描述
示例场景:代码中字典的
String?类型值包含未转义的反斜杠,用转义后的普通字符串字面量与其比较时,断言失败。
在上述场景中,如何定义无需转义的字符串字面量用于比较?或是应该对字典值进行转义?
举例:Perl中可以用单引号或q()定义这类无需转义的字符串。已知Swift有相关RFC提案,但当前可用的变通方法是什么?
解决方案
1. 使用多行字符串字面量(推荐)
Swift的多行字符串用三个双引号"""包裹,内部的反斜杠无需转义,直接作为原始字符处理:
// 字典中的值(含未转义反斜杠) let dict: [String: String?] = ["targetKey": "path\to\file"] // 用多行字符串定义比较用的字面量 let comparisonString = """ path\to\file """ // 直接比较即可 if let dictValue = dict["targetKey"] { assert(dictValue == comparisonString) }
2. 对字典值进行转义(不推荐)
如果必须使用普通字符串字面量,可以将字典值中的单个反斜杠替换为转义后的双反斜杠,再与字面量比较:
let dict: [String: String?] = ["targetKey": "path\to\file"] let escapedLiteral = "path\\to\\file" if let dictValue = dict["targetKey"], let escapedDictValue = dictValue.replacingOccurrences(of: "\\", with: "\\\\") { assert(escapedDictValue == escapedLiteral) }
这种方式需要额外的字符串处理逻辑,仅在特殊场景下使用。
3. 用Unicode转义序列表示反斜杠
对于少量反斜杠的场景,可以用Unicode转义\u{5C}代替反斜杠,普通字符串字面量中无需转义:
let comparisonString = "path\u{5C}to\u{5C}file"
补充说明
Swift截至5.9版本暂未支持类似Perl单引号的原始字符串字面量,但多行字符串已能覆盖绝大多数原始字符的使用需求。相关原始字符串的提案正在推进,未来版本可能会提供更简洁的语法。
内容的提问来源于stack exchange,提问作者BricoleurDev
相关产品推荐
相关产品推荐

