Уже есть стандартное выражение однократности. К сожалению, стандарт Objective- C недоступен в Swift (GCD dispatch_once
), но стандартная техника Swift работает нормально, а именно свойство с ленивым инициализатором определения и вызова.
Точно так же, как вы делаете это зависит от уровня, на котором вы хотите, чтобы однократность применялась. В этом примере он находится на уровне экземпляра класса:
class MyClass {
// private part
private let completion : (() -> ())
private lazy var once : Void = {
self.completion()
}()
private func doCompletionOnce() {
_ = self.once
}
// public-facing part
init(completion:@escaping () -> ()) {
self.completion = completion
}
func doCompletion() {
self.doCompletionOnce()
}
}
И здесь мы проверим это:
let c = MyClass() {
print("howdy")
}
c.doCompletion() // howdy
c.doCompletion()
let cc = MyClass() {
print("howdy2")
}
cc.doCompletion() // howdy2
cc.doCompletion()
Если вы продвигаете личные вещи до уровня класса (используя свойство stati c once
), завершение может быть выполнено только один раз за время существования всей программы.