在我调用需要传递对自身的引用以供以后使用的构造函数之前,将 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)
}
}
}
最佳答案
问题是 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
方法不能是一个便利
,它不应该是可选的,因为它不会失败:
init(handler block: @escaping ActionBlock) {
super.init()
addTarget(self, action:#selector(performAction))
self.handler = block
}
关于ios - 在自定义 UIGestureRecognizer 类中调用 self.init 之前使用的 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43308833/