如果属性不是惰性var(并且编译器没有告诉我),为什么#selector函数不起作用?

时间:2019-06-05 17:37:55

标签: ios swift selector lazy-evaluation

我在类中创建一个手势识别器属性,并将@objc函数作为参数传递。

private let tapGestureRecognizer =
    UITapGestureRecognizer(
        target: self,
        action: #selector(toggleTapped))

@objc private func toggleTapped() {
    //some actions
}

但是,触发手势识别器后,不会调用toggleTapped()函数。 仅当我将属性声明更改为lazy var时,一切似乎才能正常工作。

为什么编译器没有告诉我我的错误?这是编译器错误还是我缺少什么?谢谢。

1 个答案:

答案 0 :(得分:0)

因为let变量在运行self/super.init之前被赋予了一个值,这意味着self尚不存在。在需要时为lazy变量赋值,并在init之后给变量赋值,这意味着self确实存在。您的手势引用了self,因此它的创建需要推迟到self实际上存在。