Swift 2 中的初始化属性

Initialization Properties in Swift 2

我正在尝试构建自定义 UIView,但在初始化过程中迷路了。

代码一

class CustomUIView: UIView {
    var propertyToInitialize: CGRect

    //Custom Initializer
    override init(frame: CGRect) {
         self.propertyToInitialize = CGRect(x: 0, y: 0, width: (superview?.frame.size.width)!, height: (superview?.frame.size.height)!)
         super.init(frame: frame)
    }
}

当我使用上面的代码时,XCode 给我的错误如下。

错误

Use of 'self' property access 'superview' before super.init initializes self

所以我修改了我的代码

代码二

class CustomUIView: UIView {
    var propertyToInitialize: CGRect

    //Custom Initializer
    override init(frame: CGRect) {
         self.propertyToInitialize = CGRect()
         super.init(frame: frame)
         self.propertyToInitialize = CGRect(x: 0, y: 0, width: (superview?.frame.size.width)!, height: (superview?.frame.size.height)!)
    }
}

问题

这是糟糕的设计吗?我应该采取不同的方法吗?因此,我是否将 属性 初始化两次,使用更多内存?

您需要调用 super.init 才能访问 self 中的任何属性,并将其放入完全不同的函数中。

class CustomUIView: UIView {
    var propertyToInitialize: CGRect?

    init(frame: CGRect, property: CGRect) {
        super.init(frame: frame)
        self.propertyToInitialize = property
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        //Decode propertyToInitialize
    }
}

整件事情都是糟糕的设计。使 propertyToInitialize 成为一个 Optional 包装 CGRect,以便它在初始化时不需要值,并将您的代码移动到视图的 didMoveToSuperview,这是超级视图概念的第一个时刻有任何意义。更好的是,根本不要将其设为 属性;您可以在需要此信息的任何时候检查超级视图,因此在 属性.

中复制它毫无意义

我发现最适合我的方法是。

代码

class CustomUIView: UIView {
    lazy var propertyToInitialize: CGRect = self.initializeProperty()

    //Custom Initializer
    override init(frame: CGRect) {
         super.init(frame: frame)
    }

    func initializeProperty() -> CGRect {
        let rect: CGRect = CGRect(x: 0, y: 0, width: (superview?.frame.size.width)!, height: (superview?.frame.size.height)!)
        return rect
    }
}

我认为这是最佳答案,因为直到需要时我才使用 属性。而且,仍然可以获得超级视图的大小,但不必 double initialize.