В уроках написано, что функционально оба одинаковы, даже закрытие легче, чем блок, и это позволило избежать сложности управления блоками и памятью. Я прошел много урок, но, кроме них, я не вижу разницы между быстрым "закрытием" и Объектив-С "Блок".
Разница между блоком (Objective-C) и закрытием (Swift) в iOS
Ответ 1
Отрывок из: Apple Inc. "Использование Swift с Cocoa и Objective-C." интерактивные книги:
"Блокировка Swift и блоки Objective-C совместимы, поэтому вы можете передать закрытие Swift методам Objective-C, которые ожидают блоки. Укрытия и функции Swift имеют один и тот же тип, поэтому вы можете даже передать имя функции Swift.
Closures имеют сходную семантику захвата как блоки, но отличаются одним ключевым способом: переменные изменяются, а не копируются. Другими словами, поведение __block в Objective-C является поведением по умолчанию для переменных в Swift."
Ответ 2
Небольшие различия. Один упоминался; переменные захватываются как переменные, а не как значения. Это может быть полезно или ловушка. Важно отметить список захвата в закрытии Swift, поэтому, если вы включите self.property в список захвата, тогда значение этого свойства будет захвачено, а не само. Это также упрощает захват слабых переменных.
Ответ 3
Чтобы показать фактический пример кода различий:
Это компилируется:
let x : @convention(swift) (inout Int) -> ()
Это не означает:
let y : @convention(block) (inout Int) -> ()
с ошибкой (inout Int) -> () is not representable in Objective-C