【问题标题】:Swift initialization paradoxSwift 初始化悖论
【发布时间】:2014-12-27 12:06:45
【问题描述】:

UIView 的子类中,我声明了一个属性。该属性是UIPanGestureRecognizer 的一个实例,不是可选的或隐式展开的。代码如下:

class DraggableView: UIView {

    let panGestureRecognizer: UIPanGestureRecognizer

    override init() {

        panGestureRecognizer = UIPanGestureRecognizer(target: self, action: "dragged:")

        super.init()

        backgroundColor = UIColor.greenColor()

    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

这里在panGestureRecognizer Xcode 的初始化行给出了一个错误:“self used before super.init call”。如果我将super.init() 行移到panGestureRecognizer 初始化行上方,Xcode 会给出另一个错误:“属性self.panGestureRecognizer 未在super.init 调用时初始化”。最后一次尝试是在init 方法之外的声明中初始化panGestureRecognizer。像这样:

let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: "dragged:")

这里 Xcode 给出了另一个错误:“类型 DraggableView -> () -> DraggableView! 不符合协议 AnyObject

有没有办法在不使用选项或隐式解包选项的情况下完成这项工作?

【问题讨论】:

    标签: swift initialization


    【解决方案1】:

    问题是selfsuper.init() 发生之前不存在。

    您可以分两步创建它 - 在声明时初始化:

    let panGestureRecognizer = UIPanGestureRecognizer()
    

    然后在super.init()之后,添加目标:

    panGestureRecognizer.addTarget(self, action: "dragged:")
    

    或者,您可以将其设为lazy var,但我不喜欢让事物变化,除非它们应该变化。

    【讨论】:

    • 但是我们不应该在创建对象的时候调用指定的初始化器吗? UIGestureRecognizer 的指定初始化器是init(target: AnyObject, action: Selector)
    • 指定的初始化器在覆盖时比使用时更重要。
    • @mustafa:您不必直接调用指定的初始化程序。您当然可以调用便利初始化程序 - 这就是它们的用途。规则只是最终必须涉及指定的初始化程序。无论如何 - UIPanGestureRecognizer() 实际上是一个指定的初始化程序。这是一个 default 初始化器。请参阅初始化程序的语言指南部分。无耻插件:你也可以看看我写的这篇关于swift初始化器的文章objectpartners.com/2016/01/18/exploring-swift-initializers
    【解决方案2】:

    你可以将属性声明为lazy,但代价是把它变成一个可变的:

    lazy var panGestureRecognizer: UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: "dragged:")
    

    不过,我建议将其设为隐式展开的可选项 - 这是带有插座的视图控制器中常用的模式。

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 2019-10-04
      • 2016-02-16
      • 2017-07-21
      • 1970-01-01
      相关资源
      最近更新 更多