チュートリアルでは、機能的には両方とも同じであり、クロージャーはブロックよりも簡単であり、ブロックとメモリ管理の複雑さを回避すると書かれています。 Objective-Cの「ブロック」。
抜粋:Apple Inc.「Swift CocoaおよびObjective-Cを使用)」iBooks:
「SwiftクロージャーとObjective-Cブロックは互換性があるため、ブロックを期待するObjective-CメソッドにSwiftクロージャーを渡すことができます。Swift同じ型なので、Swift関数の名前を渡すこともできます。
クロージャーは、ブロックと同様のキャプチャセマンティクスを持ちますが、1つの重要な点で異なります。変数はコピーされるのではなく、可変です。つまり、Objective-Cの__blockの動作は、Swiftの変数のデフォルトの動作です。」
わずかな違い。 1つが言及されました。変数は値としてではなく、変数としてキャプチャされます。役に立つか、トラップになる可能性があります。重要なのは、キャプチャリストをSwiftクロージャーで定義できるため、キャプチャリストにself.propertyを含めると、selfではなくそのプロパティの値がキャプチャされます。弱い変数。
違いの実際のコード例を表示するには:
これはコンパイルします:
let x : @convention(Swift) (inout Int) -> ()
これはしません:
let y : @convention(block) (inout Int) -> ()
エラー(inout Int) -> () is not representable in Objective-C