首页 > 解决方案 > 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)")

标签: swiftswift4

解决方案


我认为 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)

推荐阅读