[英]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.