在调用需要传递对自身的引用以供以后使用的构造函数之前,将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)
}
}
}
答案 0 :(得分:1)
问题在于,self
和self.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