Разница между блоком (Objective C) и замыканием (Swift) в IOS

В уроках написано, что функционально оба одинаковы, даже закрытие легче, чем блок, и это позволило избежать сложности управления блоками и памятью, я прошел много уроков, но кроме них, я не получаю разницы между "замыканием" swift и Объектив-С "Блок".

Кто-нибудь может объяснить эту разницу в глубине. Любая помощь будет оценена.

3 ответа

Решение

Выдержка из: Apple Inc. "Использование Swift с какао и Objective-C". IBooks:

"Закрытия Swift и блоки Objective C совместимы, поэтому вы можете передавать замыкания Swift методам Objective C, которые ожидают блоки. Закрытия и функции Swift имеют одинаковый тип, так что вы даже можете передать имя функции Swift.

Замыкания имеют семантику захвата, аналогичную блокам, но отличаются одним ключевым способом: переменные изменяются, а не копируются. Другими словами, поведение __block в Objective-C является поведением по умолчанию для переменных в Swift ".

Незначительные различия Один был упомянут; переменные фиксируются как переменные, а не как значения. Что может быть полезным или ловушкой. Важно отметить, что вы можете определить список перехвата в замыкании Swift, поэтому, если вы включите self.property в список перехвата, тогда будет взято значение этого свойства, а не self. Это также упрощает сбор слабых переменных.

Чтобы показать пример кода различий:

Это компилирует:

let x : @convention(swift) (inout Int) -> ()

Это не:

let y : @convention(block) (inout Int) -> ()

с ошибкой (inout Int) -> () is not representable in Objective-C

Другие вопросы по тегам