用PropertyWrapper提高debug效率

79 阅读1分钟

通常,我们调试一个程序的时候,会打断点将我们关注的属性打印出来。 image.png 但有的时候,我们也很关心该属性之前设置的值有哪些,这对我们排查程序有很大的帮助。

主角上场

这就轮到我们的主角上场了。我们可以封装一个泛型版本的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之后,我们可以做以下事情

  1. 根据 #if DEBUG条件,仅在DEBUG时 使用Versioned包装我们的属性
  2. 调试时通过访问生成的_name这个Versioned值的history将之前的值打印出来 ~~3. 也可以在程序内通过 user.name.history打印出历史存储的值  Swift5.9已经访问不到name.history打印出历史存储的值~~Swift5.9已经访问不到name了 image.png

资料

www.swiftwithvincent.com/newsletter/…