'self' захвачено закрытием до того, как все члены инициализировали ошибку в Timer Publisher - PullRequest
0 голосов
/ 17 марта 2020

Это для MacOS. Я пытаюсь инкапсулировать издателя Timer в класс, чтобы я мог добавить автономную функциональность. У меня есть следующий код


import Combine


class MyTimer{
    let subscription: AnyCancellable
    var count: Int = 0

    init(){
       subscription = Timer.publish(every:0.1,on:.main,in:.default).autoconnect()
          .sink{_ in
             self.count += 1
             print(self.count)
         }
    }

    deinit {
        subscription.cancel()     
        print("done")
    }

}

Класс называется так:

let timer = MyTimer()

И остановился, установив таймер на nil.

К сожалению, я получаю ошибка

'self', захваченная замыканием до инициализации всех членов

ошибка. Если я уберу бит count в раковине, он будет работать нормально. Я попытался переместить содержимое init в метод start(), и это сработало, но deinit() никогда не вызывался, когда таймер был установлен на nil. В настоящее время я использую глобальную переменную для подсчета в качестве обходного пути, но это не очень удовлетворительно, так как больше кода будет go в этот класс. Любые намеки, как я могу это сделать? Я посмотрел на несколько других подобных вопросов, но ни один из них не кажется актуальным. Спасибо!

1 Ответ

0 голосов
/ 17 марта 2020

ОК, я понял, благодаря нескольким постерам. Я переместил содержимое init в функцию start () следующим образом:

class MyTimer{
    var subscription: AnyCancellable?
    var count: Int = 0


    init(){
    }

    func start(){
        subscription = Timer.publish(every:0.1, on:.main,     in:.default).autoconnect()
            . sink{ [weak self] _ in
                    guard let self = self else { return }
                    self.count += 1
                    print(self.count)
                }

    }

    deinit {
        subscription?.cancel()
        print("done")
    }
}

Спасибо всем, кто помог

...