通常,我们调试一个程序的时候,会打断点将我们关注的属性打印出来。
但有的时候,我们也很关心该属性之前设置的值有哪些,这对我们排查程序有很大的帮助。
主角上场
这就轮到我们的主角上场了。我们可以封装一个泛型版本的PropertyWrapper来保存属性的设置历史。这样调试的时候就可以将之前的值都打印出来
@propertyWrapper
struct Versioned<T> {
private var currentValue: T
private(set) var history: [T] = []
init(wrappedValue: T) {
currentValue = wrappedValue
}
var wrappedValue: T {
get {
return currentValue
}
set {
history.append(currentValue)
currentValue = newValue
}
}
}
技巧使用
有了Versioned之后,我们可以做以下事情
- 根据 #if DEBUG条件,仅在DEBUG时 使用Versioned包装我们的属性
- 调试时通过访问生成的_name这个Versioned值的history将之前的值打印出来
~~3. 也可以在程序内通过 user.name了