首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XCGLogger如何与同时实现CustomStringConvertible和CustomDebugStringConvertible的类交互?

XCGLogger如何与同时实现CustomStringConvertible和CustomDebugStringConvertible的类交互?
EN

Stack Overflow用户
提问于 2016-02-18 20:17:07
回答 2查看 228关注 0票数 1

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

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

在这种情况下,当两个协议都被实现时,是否可以让记录器在默认情况下使用debugDescription而不是description?

如果只实现了CustomStringConvertible或CustomDebugStringConvertible,记录器会检测到这一点并使用实现的协议吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2016-02-19 14:15:54

使用CustomStringConvertibleCustomDebugStringConvertible是在字符串到达XCGLogger之前发生的事情。字符串插值将使用CustomStringConvertibledescription属性,而不是CustomDebugStringConvertibledebugDescription属性。仅当符合CustomDebugStringConvertible的对象被传递到debugPrint()方法方向时,才使用debugDescription,而不是在引号内。

例如:

代码语言:javascript
复制
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属性更改为如下所示:

代码语言:javascript
复制
var description: String {
    #if DEBUG
        return debugDescription
    #else
        return "description"
    #endif
}

然后,对于调试构建,您将获得字符串插值中使用的debugDescription值,但在生产构建中,您将获得普通的description

票数 0
EN

Stack Overflow用户

发布于 2022-01-29 02:20:32

根据Dave Wood的回答,在打印Optional类型时,我发现debugDescription优先于description

代码语言:javascript
复制
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!))   // debugDescription
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35481272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档