如何在@propertyWrapper中获得父母的自我?

时间:2019-10-06 07:21:09

标签: swift swiftui combine

仅在事件之间经过指定的间隔后,我才想处理更改的@Published someVar。如何在self中获得SomeClass中的propertyWrapper

private var cancellableSet: Set<AnyCancellable> = []

extension Published where Value: Equatable {
    init<S>(
        wrappedValue defaultValue: Value,
        for dueTime: S.SchedulerTimeType.Stride,
        scheduler: S,
        sink: @escaping (Value) -> () ) where S: Scheduler {
        self.init(initialValue: defaultValue)

        projectedValue
            .debounce(for: dueTime, scheduler: scheduler)
            .removeDuplicates()
            .sink(receiveValue: sink)
            .store(in: &cancellableSet)

    }
}

class SomeClass {
    @Published(
        for: 0.5,
        scheduler: RunLoop.main,
        sink: { val in
            // how to get self of SomeClass
            print(self.someVar2) //Error: Value of type '(SomeClass) -> () -> SomeClass' has no member 'someVar2'
        })
    var someVar = ""
    var someVar2 = ""
}

1 个答案:

答案 0 :(得分:0)

我在另一个论坛上得到了以下答案

  

正式吗?你不能。

     

非正式地?您可以使用带下划线的下标-check out this test   在快速回购29中

     

下划线的东西不是官方的,没有保证,可以   随时删除。

我未使用underscored subscript

添加了解决方案
private var cancellableSet: [String: AnyCancellable] = [:]

extension Published where Value: Equatable {
    init(wrappedValue defaultValue: Value) {
        self.init(initialValue: defaultValue)
    }

    mutating func Observe<S>(
        key: String,
        for dueTime: S.SchedulerTimeType.Stride,
        scheduler: S,
        sink: @escaping (Value) -> () ) where S: Scheduler {

        print(key)
        if cancellableSet[key] == nil {
            cancellableSet[key] =
                self.projectedValue
                    .debounce(for: 0.5, scheduler: RunLoop.main)
                    .removeDuplicates()
                    .sink(receiveValue: sink)
        }
    }
}

class SomeClass {
    @Published
    var someVar = "" {
        willSet {
            _someVar.Observe(key: #function, for: 0.5, scheduler: RunLoop.main) { val in
                print(val)
            }
        }
    }
    var someVar2 = ""

    func test() {
        someVar = "a"
        someVar = "ab"
        someVar = "abc"
    }
}

SomeClass().test()