Как получить себя родителя в @propertyWrapper? - PullRequest
1 голос
/ 06 октября 2019

Я бы хотел обработать измененный @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 голосов
/ 08 октября 2019

Я получил следующий ответ на другом форуме

Официально? Вы не можете.

Неофициально? Вы можете использовать подчеркнутый индекс - проверить этот тест в быстром репо 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()
...