我正在尝试XCGLogger,并注意到如果我有一个日志语句,其中包含一个实现CustomDebugStringConvertible和CustomStringConvertible的类的对象实例,则记录器不会调用debugDescription属性,但似乎只调用了description属性来自CustomStringConvertible。
我的debugDescription实现包含了我希望在日志记录中使用的description属性的附加信息。
在这种情况下,当两种协议都实现时,默认情况下让记录器使用debugDescription而不是描述?
如果只实现了CustomStringConvertible或CustomDebugStringConvertible,记录器是否会检测到并使用已实现的协议?
由于
答案 0 :(得分:0)
使用CustomStringConvertible
或CustomDebugStringConvertible
是在字符串到达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
}
。