Swift 2中的初始化属性

时间:2015-11-09 18:14:54

标签: ios properties initialization swift2 self

我正在尝试构建一个自定义UIView,并且在初始化时就丢失了。

Code One

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)!)
    }
}

问题

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

3 个答案:

答案 0 :(得分:2)

整件事情是糟糕的设计。使didMoveToSuperview成为一个包装CGRect的可选项,以便在初始化时不需要值,并将代码移动到视图的{{1}},这是超级视图概念的第一个时刻有任何意义。更好的是,不要把它作为财产;可以在需要此信息的任何时候检查超级视图,因此在属性中复制它是没有意义的。

答案 1 :(得分:1)

我发现对我来说最好的方法是。

<强>代码

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
    }
}

我认为这是最好的答案,因为在需要之前我不会使用该属性。并且,仍然可以获得超视图大小,但不必双初始化

答案 2 :(得分:0)

您需要先调用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
    }
}