web-dev-qa-db-ja.com

iOSのブロック(Objective-C)とクロージャー(Swift)の違い

チュートリアルでは、機能的には両方とも同じであり、クロージャーはブロックよりも簡単であり、ブロックとメモリ管理の複雑さを回避すると書かれています。 Objective-Cの「ブロック」。

43
Sujay

抜粋:Apple Inc.「Swift CocoaおよびObjective-Cを使用)」iBooks:

「SwiftクロージャーとObjective-Cブロックは互換性があるため、ブロックを期待するObjective-CメソッドにSwiftクロージャーを渡すことができます。Swift同じ型なので、Swift関数の名前を渡すこともできます。

クロージャーは、ブロックと同様のキャプチャセマンティクスを持ちますが、1つの重要な点で異なります。変数はコピーされるのではなく、可変です。つまり、Objective-Cの__blockの動作は、Swiftの変数のデフォルトの動作です。」

64
GoZoner

わずかな違い。 1つが言及されました。変数は値としてではなく、変数としてキャプチャされます。役に立つか、トラップになる可能性があります。重要なのは、キャプチャリストをSwiftクロージャーで定義できるため、キャプチャリストにself.propertyを含めると、selfではなくそのプロパティの値がキャプチャされます。弱い変数。

2
gnasher729

違いの実際のコード例を表示するには:

これはコンパイルします:

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

これはしません:

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

エラー(inout Int) -> () is not representable in Objective-C

1
Kametrixom