XCGLogger如何与实现CustomStringConvertible和CustomDebugStringConvertible的类进行交互?

时间:2016-02-18 12:17:07

标签: swift logging xcglogger

我正在尝试XCGLogger,并注意到如果我有一个日志语句,其中包含一个实现CustomDebugStringConvertible和CustomStringConvertible的类的对象实例,则记录器不会调用debugDescription属性,但似乎只调用了description属性来自CustomStringConvertible。

我的debugDescription实现包含了我希望在日志记录中使用的description属性的附加信息。

在这种情况下,当两种协议都实现时,默认情况下让记录器使用debugDescription而不是描述?

如果只实现了CustomStringConvertible或CustomDebugStringConvertible,记录器是否会检测到并使用已实现的协议?

由于

1 个答案:

答案 0 :(得分:0)

使用CustomStringConvertibleCustomDebugStringConvertible是在字符串到达​​XCGLogger之前发生的事情。字符串插值将使用description的{​​{1}}属性,而不是CustomStringConvertible的{​​{1}}属性。 debugDescription仅在符合CustomDebugStringConvertible的对象传递到debugDescription方法方向而非引号内时使用。

例如:

CustomDebugStringConvertible

可能的解决方案是将debugPrint()添加到struct Sample: CustomStringConvertible, CustomDebugStringConvertible { var description: String { return "description" } var debugDescription: String { return "debugDescription" } } let sample = Sample() print("\(sample)") // description debugPrint("\(sample)") // "description" print(sample) // description debugPrint(sample) // debugDescription (如果尚未添加),并将-DDEBUG属性更改为:

Other Swift Flags

然后,对于调试版本,您将获得字符串插值中使用的description值,但在生成版本中,您将获得正常的var description: String { #if DEBUG return debugDescription #else return "description" #endif }