我正在试用XCGLogger,并注意到,如果我有一个日志记录语句,其中包含来自同时实现CustomDebugStringConvertible和CustomStringConvertible的类的对象实例,则日志记录器不会调用debugDescription属性,而似乎只调用CustomStringConvertible的description属性。
我的debugDescription实现包含了我希望在日志记录中使用的description属性上的附加信息。
在这种情况下,当两个协议都被实现时,是否可以让记录器在默认情况下使用debugDescription而不是description?
如果只实现了CustomStringConvertible或CustomDebugStringConvertible,记录器会检测到这一点并使用实现的协议吗?
谢谢
发布于 2016-02-19 14:15:54
使用CustomStringConvertible或CustomDebugStringConvertible是在字符串到达XCGLogger之前发生的事情。字符串插值将使用CustomStringConvertible的description属性,而不是CustomDebugStringConvertible的debugDescription属性。仅当符合CustomDebugStringConvertible的对象被传递到debugPrint()方法方向时,才使用debugDescription,而不是在引号内。
例如:
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
}然后,对于调试构建,您将获得字符串插值中使用的debugDescription值,但在生产构建中,您将获得普通的description。
发布于 2022-01-29 02:20:32
根据Dave Wood的回答,在打印Optional类型时,我发现debugDescription优先于description
struct Sample: CustomStringConvertible, CustomDebugStringConvertible {
var description: String { return "description" }
var debugDescription: String { return "debugDescription" }
}
let n: Sample? = Sample()
print(n) // Optional(debugDescription)
debugPrint(n) // Optional(debugDescription)
print("\(n)") // Optional(debugDescription)
debugPrint("\(n)") // "Optional(debugDescription)"
print(n!) // description
debugPrint(n!) // debugDescription
print("\(n!)") // description
debugPrint("\(n!)") // "description"
print(String(describing: n)) // Optional(debugDescription)
print(String(reflecting: n)) // Optional(debugDescription)
print(String(describing: n!)) // description
print(String(reflecting: n!)) // debugDescriptionhttps://stackoverflow.com/questions/35481272
复制相似问题