2016-11-10 1 views
1

My Swift 3.0プロジェクトでは、特定のタイプ(AsyncBlock)をObj- Cブロック:任意の値に不随意のポインタに翻訳する必要がありスイフト3.0換算でSwift 3から、id *ポインタをパラメータとして使用してObj-Cブロックとして定義された型を使用する方法

typedef BOOL (^AsyncBlock)(id __nullable * __nonnull context);

は、私は私の中で定義された閉鎖にタイプAsyncBlockの変数を割り当てることができるはず考え出しswift 3プロジェクトは次のようになります(簡略化のためヘッダーとその他の細部のブリッジは含まない):

func closure(_ context: UnsafeMutablePointer<Any?>) -> Bool { return true } var myClosureVariable: AsyncBlock = closure

コンパイラは同意しない:Cannot assign value of type '(UnsafeMutablePointer<Any?>) -> Bool' to type 'AsyncBlock' - 私が間違って何をやっていますか?

答えて

0

Obj-C idは通常スウィフト3.0 Anyにマッピングされますが、ここではAnyObjectを使用する必要があります(理由はわかりません)。また、我々は代わりに、これは動作します

(理由の理由として、再び、明確ではない)UnsafeMutablePointerAutoreleasingUnsafeMutablePointerを使用する必要があります。

func closure(_ context: AutoreleasingUnsafeMutablePointer<AnyObject?>) -> Bool { return true } var myClosureVariable: AsyncBlock = closure

+0

のObjective-CのARCは、マニュアル参照カウントと互換性がなければなりません。間接的なポインタを渡すと、呼び出されたブロック、関数、メソッドなどの内部でどのように動作するのかは不明です。オートレリースされたという慣例があります。私。 e。 http://stackoverflow.com/questions/8862023/in-which-situations-do-we-need-to-write-the-autoreleasing-ownership-qualifier –

関連する問題