web-dev-qa-db-fra.com

Différence entre le blocage (Objective-C) et la fermeture (Swift) dans iOS

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

43
Sujay

Extrait de: Apple Inc. "Utilisation de Swift avec Cocoa et Objective-C." IBooks:

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

Les fermetures ont une sémantique de capture similaire à celle des 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 des variables dans Swift. "

64
GoZoner

De légères différences. Un a été mentionné; les variables sont capturées comme des variables et non comme des valeurs. Ce qui peut être utile ou un piège. Surtout, vous pouvez définir une liste de capture dans une fermeture Swift, donc si vous incluez self.property dans la liste de capture, alors la valeur de cette propriété est capturée, et non self. Cela simplifie également la capture variables faibles.

2
gnasher729

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

Cela compile:

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

Cela ne signifie pas:

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

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

1
Kametrixom