Обобщенная функция completion
возвращает замыкание, которое предназначено для использования в качестве обработчика завершения для некоторых асинхронных функций.
Например, предположим, что у вас есть какой-то асинхронный метод, подобный этому:
func someAsyncFunc(completion: @escaping (Data?, Error?)->Void) {
//...
}
Таким образом, чтобы использовать замыкание, вам может потребоваться сохранить возвращаемое замыкание в некоторой переменной замыкания и использовать его позже:
let myCompletionHandler = completion(onResult: { (j: Data) in
print(j)
}) { (e) in
print(e)
}
someAsyncFunc(completion: myCompletionHandler)
Или же вы можете записать его непосредственно в качестве параметра:
someAsyncFunc(completion: completion(onResult: { (j) in
print(j)
}) { (e) in
print(e)
})
В любом случае, я не уверен, действительно ли это улучшение, и вам лучше найти лучший учебник.