Différence entre le bloc (objectif C) et la fermeture (Swift) dans ios

Dans les tutoriels, il est écrit que fonctionnellement les deux sont identiques, même la fermeture est plus facile que le bloc et évite la complexité de la gestion des blocs et de la mémoire, j'ai parcouru de nombreux tutoriels mais sauf ceux-ci, je ne fais pas la différence entre la "fermeture" de swift et le "bloc"Objective-C.

Quelqu'un peut-il expliquer cette différence en profondeur. Toute aide serait appréciée.

40
demandé sur Jonathan Leffler 2014-10-15 09:00:32

3 réponses

Extrait De: Apple Inc. "Utiliser Swift avec Cocoa et Objective-C." iBooks:

" les fermetures Swift et les blocs Objective-C sont compatibles, vous pouvez donc passer des fermetures Swift aux méthodes Objective-C qui attendent des blocs. Les fermetures et les fonctions Swift ont le même type, de sorte que vous pouvez même passer le nom d'une fonction Swift.

Les fermetures ont une sémantique de capture similaire en tant que blocs mais diffèrent d'une manière clé: Les Variables sont mutables plutôt que copiées. En d'autres termes, le comportement de __block dans Objective-C est le comportement par défaut pour les variables dans Swift."

59
répondu GoZoner 2014-10-15 05:35:20

Légères différences. Un a été mentionné; les variables sont capturées en tant que variables, pas en tant que valeurs. Ce qui peut être utile ou un piège. Fait important, vous pouvez définir une liste de capture dans une fermeture rapide, donc si vous incluez self.propriété dans la liste de capture, alors la valeur de cette propriété est capturée, et non self. Cela simplifie également la capture de variables faibles.

2
répondu gnasher729 2015-07-24 22:06:02

Pour afficher un exemple de code réel des différences:

Cela compile:

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

Ce n'est pas le cas:

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

Avec l'erreur (inout Int) -> () is not representable in Objective-C

1
répondu Kametrixom 2016-07-09 21:54:14