1

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

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

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

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

谢谢

4

2 回答 2

1

使用CustomStringConvertibleorCustomDebugStringConvertible是在字符串到达​​ 之前发生的事情XCGLogger。字符串插值将使用 的description属性CustomStringConvertible而不是 的debugDescription属性CustomDebugStringConvertibledebugDescription仅在将符合的对象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
}

然后对于调试版本,您将获得debugDescription字符串插值中使用的值,但在您的生产版本中,您将获得正常的description.

于 2016-02-19T06:15:54.287 回答
0

添加到戴夫伍德的答案中,在打印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!))   // debugDescription
于 2022-01-29T02:20:32.447 回答