Разница между блоком (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