この質問には、Swift closure in array becomes nil in Objective-cがあります。これはラッパークラスを使用した回避策で回答しましたが、なぜ呼び出せないのか不思議ですObjective-Cでは、id
でスウィフトクロージャが渡されました。簡単な例を次に示します。Objective-Cで `id 'を使ってSwift Closureを呼び出す
のObjective-Cコード:
// In a header
typedef void (^EmptyBlock)();
@interface MyClassOC : NSObject
-(void)invoke:(id)blk;
@end
// In an implementation (.m) file
@implementation MyClassOC
-(void)invoke:(id)blk {
EmptyBlock emptyBlock = blk;
emptyBlock();
}
@end
Objective-Cのブロックを提供する問題なし:
EmptyBlock block = ^{ puts("In OC empty block..."); };
MyClassOC * myClassOC = [[MyClassOC alloc] init];
[myClassOC invoke:block];
しかし、invoke...
でObjective-Cのコードが渡されたスイフトクロージャを呼び出すことはできません私はで終わる
let myClassOC = MyClassOC()
let myBlock : EmptyBlock = {
print("In Swift EmptyBlock...")
}
myClassOC.invoke(myBlock)
:id
経由この行に210:
EmptyBlock emptyBlock = blk;
ここで何が起こっているすべてのアイデア?
ありがとう、説明が理にかなっています。私は 'id'から' EmptyBock'にタイプを変更することを知っています。しかし、Objective-CでSwiftから 'id 'として渡されたブロックを呼び出す方法はありますか?たとえば、Objective-Cメソッドが 'NSArray'の一部として' id'を受け取った場合はどうでしょうか?興味深いことに、このケースでは 'EmptyBlock'はSwiftに橋渡しされたObjective-C型ですが、Swift closureはその型の変数に割り当てられていますが、Objective-CはSwift型として扱うようです。 – OmniProg
'_SwiftValue'は* opaque *型であり、AFAIK Appleはラップされた内容を判断し、ラップされた値にアクセスするためのObjective-Cメソッドを提供しないことを選択しました。 Objective-C側で軽量のジェネリックスを使用して解決しなければならないNSArrayの場合* Swift 3.1コンパイラがクラッシュする(*コンパイルされたプログラムではない)ことを確認しようとする私の試みとして、 "should"です。 – CRD