我正在尝试子类化UILabel并自动为其中一个属性生成一个值,这样我就可以初始化一些值,并让其他值随机生成。
例如,在这里,我希望能够创建一个新的MyLabel,为labelString传递一个值,并且随机生成labelNumber的值。
CompareTo
我在super.init初始化self之前得到错误“在方法调用中使用'self'。”有没有办法解决这个问题,或者使用更好的模式?
非常感谢您的帮助!
答案 0 :(得分:1)
您无法从init
调用实例方法,直到所有内容都已初始化为止。处理它的一种方法是使createNumber
成为static
函数,该函数不需要初始化类来调用:
class MyLabel: UILabel {
var labelString : String!
var labelNumber : Int!
init(frame: CGRect, labelString: String) {
self.labelString = labelString
self.labelNumber = MyLabel.createNumber()
super.init(frame: frame)
}
static func createNumber() -> Int {
return Int(arc4random())
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
处理它的另一种方法是在调用labelNumber
之后移动super.init
的初始化。这是有效的,因为labelNumber
是一个 Optional ,因此最初被赋予nil
的值,该值满足在调用之前初始化子类MyLabel
的所有属性的要求超类的init
。
class MyLabel: UILabel {
var labelString : String!
var labelNumber : Int!
init(frame: CGRect, labelString: String) {
self.labelString = labelString
super.init(frame: frame)
self.labelNumber = createNumber()
}
func createNumber() -> Int {
return Int(arc4random())
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}