避免重复 属性 方法

Avoiding repetition of property methods

我有这个重复模式和通知令牌的设置器 属性

一旦 属性 设置为 nil,则也从观察中移除

如何使用轻量级解决方案替换和避免 属性 方法的这种代码重复?

var nt1: Any? {
    willSet {
        if let nt1 = nt1 {
            NotificationCenter.default.removeObserver(nt1)
            self.nt1 = nil
        }
    }
}
var nt2: Any? {
    willSet {
        if let nt = nt2 {
            NotificationCenter.default.removeObserver(nt)
            self.nt2 = nil
        }
    }
}
var nt3: Any? {
    willSet {
        if let nt = nt3 {
            NotificationCenter.default.removeObserver(nt)
            self.nt3 = nil
        }
    }
}

您可以创建一个@propertyWrapper。它是在 Swift 5.1

中引入的
@propertyWrapper
struct UnsubscribeOnNil<Value: Any> {
    init(wrappedValue: Value?) {
      self.value = wrappedValue
    }

    private var value: Value?

    var wrappedValue: Value? {
        get { value }
        set {
            if newValue == nil, let oldValue = value {
                NotificationCenter.default.removeObserver(oldValue)
            }
            value = newValue
        }
    }
}

并将其用于属性:

@UnsubscribeOnNil var nt1: Any?
@UnsubscribeOnNil var nt2: Any?
@UnsubscribeOnNil var nt3: Any?