You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单元测试中如何定义无需转义的字符串字面量用于比较?

问题描述

示例场景:代码中字典的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:05:22