文章目录
  1. 1. 调试描述
  2. 2. 在发布编译时去掉print和debugPrint

原文链接:CustomStringConvertible and Description in Swift

在 Swift 中,你可以为对象提供一个自定义的字符串描述, 实现的方式是遵从CustomStringConvertible协议,添加一个新的description计算属性。

1
2
3
4
5
6
7
8
9
10
11
12
class AClass {
var prop = "Hey!"
}
extension AClass: CustomStringConvertible {
var description: String {
return prop
}
}
let c = AClass()
print(c) // "Hey!"

在 Objective-C 中提供了类似的功能,重写NSObject中的description方法可以做到。

调试描述

Swift 也提供了CustomDebugStringConvertible协议,用来提供额外的,更具体的,用于调试作用的描述。

1
2
3
4
5
6
7
8
9
10
11
12
class AClass {
var prop = "Hey!"
}
extension AClass: CustomDebugStringConvertible {
var debugDescription: String {
return prop
}
}
let c = AClass()
debugPrint(c) // "Hey!"

使用debugPrint方法可以打印这类描述。

大多数情况下,只有一个方法的实现是简单的,所以不需要额外的描述。但是对于那种复杂的对象,需要通过调试来查看内容的不同视角时,提供更多的表达是必要的。

在发布编译时去掉printdebugPrint

有很多方式可以去掉我们代码中的调试信息,在发布编译时不再需要这些调试信息。

最常用的手段是检查DEBUG标识:

1
2
3
#if DEBUG
printDebug(object)
#endif

以上代码会把打印语句从发布包里面全部移除(同时也会移除你想表达的消息),同时减少包的大小(好事啊)。

但是在每一个打印语句中添加这个检查,会增大不少工作量。尤其是这个调试方法在你的代码中到处使用的时候。

这就是为什么,我们会使用一些替代方案的原因:

  • 实现一个 Logger 类,用来管理日志和在发布编译时禁用打印
  • 重写打印方法,当发布时禁用打印

让我们看看如何简单实现第二个替代方案,只需要在我们应用中添加几行代码:

1
2
3
4
#if !DEBUG
func print(_: Any..., separator: String, terminator: String){}
func debugPrint(_: Any..., separator: String, terminator: String){}
#endif

搞定!这将会阻止打印方法产生任何输出。

文章目录
  1. 1. 调试描述
  2. 2. 在发布编译时去掉print和debugPrint