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