Преимущество использования замыканий без экранирования заключается в том, что использование self
является неявным. Это означает, что исчезает вся умственная перегрузка, связанная с принятием решения о том, использовать ли слабые, сильные или бесхозные ссылки на себя.
Вот тривиальный пример, который вы можете поместить в раскадровку:
class SomeClass { var x = 10 private func escaping(closure: @escaping () -> Void) { closure() } private func nonEscaping(closure: () -> Void) { closure() } func runEscaping() { escaping { self.x = 20 } // Note that x is called on self } runNonEscaping() { nonEscaping { x = 30 } // Note that the call to self is implicit. } } // Let's create an instance of this class. let c = SomeClass() // Call the function that uses an escaping closure c.runEscaping() c.x // 20 // Call the function that uses a non-escapwing closure c.runNonEscaping() c.x // 30
Поскольку мы можем щелкнуть по функциям, удерживая нажатой клавишу «Alt», объявление @escaping
является полезной подсказкой относительно того, что будет сделано с замыканием, и не грозит ли создание строгой ссылки на self.