Swift 为类属性生成值

Swift 为类属性生成值,swift,Swift,我试图将UILabel子类化,并自动为其中一个属性生成一个值,这样我就可以用一些值初始化,并随机生成其他值 例如,这里我希望能够创建一个新的MyLabel,传入labelString的值,并随机生成labelNumber的值 class MyLabel: UILabel { var labelString : String! var labelNumber : Int! init(frame: CGRect, labelString: String) {

我试图将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")
    } 
}
另一种处理方法是在调用
super.init
之后移动
labelNumber
的初始化。这是因为
labelNumber
是可选的,因此最初被赋予
nil
的值,该值满足在调用超类的
init
之前初始化子类
MyLabel
的所有属性的要求

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

顺便问一下,您希望将
labelString
labelNumber
作为可选项有什么特别的原因吗?你有什么理由让它们成为
nil
,在这种情况下读取它们会崩溃,因为你已经使它们隐式地展开了可选项。使参数可选项来自于下面的另一个教训(盲目),但在我的情况下,这是没有必要的。因此,第二个解决方案在这里不起作用,一旦它们不是可选的,但是静态函数是完美的!谢谢你帮我摆脱困境,不客气。通过将第二个解决方案声明为
var labelNumber=0