Swift:使用可选项记录器

3

我看了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)")
3个回答

4
(有些混淆的)编译器错误的原因是因为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

1
我会直接在日志调用中处理它。
var myOptional: String?
...
logger.log ("MyOptional is \(myOptional ?? "")")

或许更清晰
logger.log ("MyOptional is \(myOptional ?? "<nil>")")

0

可选项(:D),只需为Optional类型编写一个扩展,以符合CustomStringConvertible协议:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接