我正在尝试子类化 UILabel 并自动为其中一个属性生成一个值,这样我就可以使用一些值进行初始化,并随机生成其他值。
例如,在这里我希望能够创建一个新的 MyLabel,传入 labelString 的值,并随机生成 labelNumber 的值。
class MyLabel: UILabel {
var labelString : String!
var labelNumber : Int!
init(frame: CGRect, labelString: String) {
self.labelString = labelString
self.labelNumber = createNumber()
super.init(frame: frame)
}
func createNumber() -> Int {
return Int(arc4random())
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
我收到错误消息“在 super.init 初始化 self 之前,在方法调用中使用了‘self’。”有没有办法解决这个问题,或者可以使用更好的模式?
非常感谢您的帮助!
最佳答案
在一切都被初始化之前,您不能从 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
在调用父类(super class)的 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")
}
}
关于swift - 为类属性生成值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41540106/