Swift:将Logger与可选参数一起使用

问题描述

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

我经常想打印可选变量的值,这可以通过简单的print命令来完成。如果使用新的Logger命令尝试此操作,则会收到“无法转换'String类型的值?”的信息。到预期的参数类型'NSObject'“错误。建议使用Logger进行此操作的方法是什么?

import os

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

let myOptional: String?

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

解决方法

(有些混淆)编译器错误的原因是Logger要求插值类型符合CustomStringConvertible协议,而{em>不是 { {1}}。

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

Optional

会产生类似

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

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

MyOptional is nil
MyOptional is Optional("abc")

会产生类似日志的行

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

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

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

或更清晰

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