2017-03-22 9 views
0

遅延時間の後に閉鎖を実行したいが、実行時エラーが発生した。私はGCDがこれをより簡単に行うことができると知っていますが、理由を知りたいのです。閉鎖を実行するときにEXC_BAD_ACCESS

ありがとうございました。

は、ここに私のコードです:皆のよう

func perform(_ aClosure:@escaping()->Void, afterDelay delay: TimeInterval) { 
    self.perform(#selector(fire(closure:)), with: aClosure, afterDelay: delay) 
} 

func fire(closure:()->Void) { 
    closure() // error 
} 

self.perform({ 
    print("closure do something... ...") 
}, afterDelay: 2) 
+1

セレクターがオブジェクトとしてのスウィフト閉鎖を期待していないからだと思います。タイプの不一致です。 – Shmidt

答えて

2

は(あなたを含む;>)と言い、GCDを使用しています。どんな理由のために、あなたはperform(_:with:afterDelay:)を使用して主張、場合、Anyclosureパラメータの種類を変更してみてください:

func fire(closure: Any) 
{ 
    (closure as!()->Void)() 
} 

詳細についてはthis threadを参照してください。また、 "ココアとObjective-C(スイフト3.0.1)とスウィフトの使用" でsection "id Compatibility"から:

Objective-CのIDタイプは、任意のタイプとしてスウィフトによってインポートされます。 のコンパイル時および実行時に、Swift値またはオブジェクトが Objective-Cにidパラメータとして渡された場合、コンパイラはユニバーサルブリッジング 変換操作を導入します。 id値がSwift にAnyとしてインポートされると、ランタイムは自動的に クラス参照またはSwift値タイプのいずれかへのブリッジを処理します。

そしてNSObjectperform(_:​with:​after​Delay:​)API Reference

セレクタ
呼び出すメソッドを識別するセレクタ。メソッド は有意な戻り値を持つべきではなく、タイプIDの引数 を1つ、または引数をとらないでください。

+0

これは正確な答えです。ありがとうございました。 – ovo