swift - Swfit 4:如何获得可选打印包含“可选”的描述
问题描述
我知道“幕后”的可选值表示为Optional
枚举......
public enum Optional<Wrapped> {
case none
case some(Wrapped)
}
在某种程度上,这对开发人员来说是隐藏的(有充分的理由),因此在打印选项时,默认行为(在 Swift 4 中)是省略该Optional
部分并仅打印其中一个nil
或单独的值。
let longFormDefinedOptionalInt: Optional<Int> = nil
let shortFormDefinedOptionalInt: Int? = 99
print("\(longFormDefinedOptionalInt)") // Prints "nil" and NOT "Optional.none"
print("\(longFormDefinedOptionalInt)") // Prints "99" and NOT "Optional.some(99)"
有没有得到一个可选的完整和真实的描述,即“Optional.none”或“Optional.some(99)”
我确信这是可能的,因为 XCTest 在打印失败消息时会以某种方式做到这一点,例如......
XCTAssertEqual(Int("99"), 11)
XCTAssertEqual 失败:("Optional(99)") 不等于 ("Optional(11)")
解决方案
我认为 XCTest 使用debugDescription
:
let a: Int? = 1
print(a.debugDescription) // Optional(1)
但是,对于nil
值,此属性将返回"nil"
而不是"Optional.none"
.
你可以写一个扩展:
extension Optional {
var fullDescription: String {
switch self {
case .none:
return "Optional.none"
case .some(let value):
return "Optional.some(\(value))"
}
}
}
let a: Int? = nil
print(a.fullDescription)
推荐阅读
- python - 理解这个 Julia 代码并将其翻译成 Python
- spring-batch - Spring Batch:不能完全解决条件流
- flutter - 平台异常错误不会在颤动中捕获错误
- javascript - 反应导出Excel?
- apache-flink - Flink:SessionWindowTimeGapExtractor - 使用数据密度动态计算间隙
- c++ - 使用 mingw 编译 libcmaes
- python - 如何循环发送多个请求?
- testrigor - 过滤失败是否不包括之前失败的禁用案例?
- c++ - 为什么 Xcode 的新构建系统无法并行编译目标?
- excel - 根据Excel中另一列中的唯一值逐个单元格比较一列中的单元格