Swift: 将 Logger 与可选项一起使用

Swift: Using Logger with optionals

我观看了 WWDC 2020,并认为我会切换我的代码以使用新的 Logger 语法。

我经常想打印可选变量的值,我可以使用简单的打印命令来完成。如果我使用新的 Logger 命令尝试此操作,我会收到“无法将类型 'String?' 的值转换为预期的参数类型 'NSObject'”的错误。使用 Logger 执行此操作的推荐方法是什么?

import os

let logger = Logger(subsystem: "com.example.Fruta", category: "giftcards")

let myOptional: String?

logger.log ("MyOptional is \(myOptional)")

我会直接在日志调用中处理

var myOptional: String?
...
logger.log ("MyOptional is \(myOptional ?? "")")

或者更清楚

logger.log ("MyOptional is \(myOptional ?? "<nil>")")

(有点混淆)编译器错误的原因是 Logger requires that the interpolated types conform to the CustomStringConvertible 协议,不是 Optional.[=18 的情况=]

根据所需的输出,您可以将可选的显式转换为字符串:

logger.log ("MyOptional is \(String(describing: myOptional))")
// Equivalently:
logger.log ("MyOptional is \(myOptional.debugDescription)")

生成类似

的日志行
MyOptional is nil
MyOptional is Optional("abc")

或使用nil-coalescing提供默认值:

logger.log ("MyOptional is \(myOptional ?? "<undefined>")")

生成类似

的日志行
MyOptional is <undefined>
MyOptional is abc