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.
我正在尝试构建自定义 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.