2017-04-09 10 views
0

UITapGestureRecognizerをサブクラス化し、後で使用するために参照を渡す必要があるコンストラクタを呼び出す前に、便利なコンストラクタに渡される変数を初期化する適切な方法はありますか?ここでself.initがカスタムUIGestureRecognizerクラスで呼び出される前に使用される

はまだコンパイルできない私のコードです:

import Foundation 
import UIKit 
import UIKit.UIGestureRecognizerSubclass 

typealias ActionBlock = (BlockTapGestureRecognizer) -> Void 

class BlockTapGestureRecognizer : UITapGestureRecognizer { 

    private var handler: ActionBlock? 

    convenience init?(handler block: @escaping ActionBlock) { 
     self.init(target:self, action:#selector(self.performAction(_:))) 
     self.handler = block 
    } 

    func performAction(_ recognizer: BlockTapGestureRecognizer) { 
     if let block = self.handler { 
      block(self) 
     } 
    } 

} 

答えて

1

問題がself.initへの呼び出しを行うことができる前selfself.performAction(_:)の両方が参照されていることです。これは、Swiftの初期化要件の順序に違反します。

解決策の1つは、ターゲットとアクションの設定を遅らせることです。あなたのBlockTapGestureRecognizerが実際にそれが明示的に宣言し、他のinitの方法を持っていない場合、このinit方法はconvenienceすることはできませんし、それが失敗することはできませんので、それはオプションであってはならないことを

convenience init?(handler block: @escaping ActionBlock) { 
    super.init() 
    addTarget(self, action:#selector(performAction)) 
    self.handler = block 
} 

注:

init(handler block: @escaping ActionBlock) { 
    super.init() 
    addTarget(self, action:#selector(performAction)) 
    self.handler = block 
} 
+1

@LeoDabusコピー&ペーストの喜び:)ありがとう – rmaddy

関連する問題