Swift:使用带有选项的Logger

dwbf0jvd  于 2023-02-21  发布在  Swift
关注(0)|答案(3)|浏览(163)

我已经看完了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)")
2vuwiymt

2vuwiymt1#

编译器错误(有些模糊)的原因是Logger要求插入的类型符合CustomStringConvertible协议,而Optional * 不是 * 这种情况。
根据所需的输出,您可以显式地将可选转换为字符串:

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
xcitsw88

xcitsw882#

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

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

或许更清楚

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

mm5n2pyu3#

可选地(:D),只需为Optional类型编写一个扩展名,以实现CustomStringConvertible一致性:

extension Optional: CustomStringConvertible {
    public var description: String {
        return self.debugDescription
    }
}

相关问题