swift - swift 4 : How can I get Optional<X> to print a description that includes `Optional`

标签 swift swift4

我知道“底层”的可选值表示为 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 failed: ("Optional(99)") is not equal to ("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)

关于swift - swift 4 : How can I get Optional<X> to print a description that includes `Optional` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50524838/

相关文章:

arrays - Swift - 根据值连接两个元组数组

ios - Firebase:在 Swift 4 上找不到 FIRUser

ios - 使用委托(delegate)从模态视图 Controller 调用另一个 View Controller 中的方法

ios - 如何以编程方式使我的应用静音(禁用声音)

ios - 使用alamofire进行FTP上传?

swift - 如何从子类调用 MKTileOverlay "url"函数?获取 EXC_BAD_INSTRUCTION

ios - 如果在文本字段 Swift 上启用安全文本输入,应用程序会卡住

ios - swift 4 : Getting Thread 1: EXC_BAD_ACCESS error with AVFoundation

ios - 如何在 arkit (swift4) 上添加黑白滤镜

swift - IBOutlet 应该是弱变量还是强变量?