簡體   English   中英

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

這是不好的設計嗎? 我應該采取不同的方法嗎? 我是否因此使用更多內存來初始化屬性兩次?

整件事情是糟糕的設計。 使propertyToInitialize一個包裝CGRect的Optional,以便在初始化時不需要值,並將代碼移動到視圖的didMoveToSuperview ,這是didMoveToSuperview概念具有任何意義的第一個時刻。 更好的是,不要把它作為財產; 可以在需要此信息的任何時候檢查superview,因此在屬性中復制它是沒有意義的。

我發現對我來說最好的方法是。

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

我認為這是最好的答案,因為在需要之前我不會使用該屬性。 並且,仍然可以獲得超視圖大小,但不必雙倍初始化

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM