self.init之前使用的自定义在自定义UIGestureRecognizer类中调用

时间:2017-04-09 15:58:04

标签: ios swift swift3

在调用需要传递对自身的引用以供以后使用的构造函数之前,将UITapGestureRecognizer子类化并初始化传递给我的方便构造函数的变量的正确方法是什么?

这是我的代码尚未编译:

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 个答案:

答案 0 :(得分:1)

问题在于,selfself.performAction(_:)都可以在调用self.init之前被引用。这违反了Swift中初始化要求的顺序。

一种解决方案是延迟设定目标和行动。

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

请注意,如果您的BlockTapGestureRecognizer实际上没有明确声明的任何其他init方法,则此init方法不能是{{1}并且它不应该是可选的,因为它不会失败:

convenience